在Android開發中常常看到這個錯誤,產生的緣由仍是挺值得研究的。android
若是是在eclipse上出現的這個問題,基本上能夠判斷爲同一工程中存在相同的jar包,或者是不一樣的jar包,可是他們之間有相同的類,因此解決辦法就是幹掉對方。 在eclipse中若是刪除jar以後還報錯的話,多是eclipse的緩存致使的,重啓eclipse基本能夠解決這個問題。緩存
可是若是事情發生在 Android Studio 上,那麼就複雜了。首先要排除eclipse中的那種狀況,若是問題尚未解決那就要仔細了。eclipse
若是工程結構是這樣的測試
➜ tree rootgradle
rootui
├── project1this
│ └── libsspa
│ └── abc.jarip
└── project2ci
└── libs
└── abc.jar
這樣的結構仍是很常見的,好比不少時候libs下面放的是android-support-v4.jar,若是這個兩個工程中只有一個依賴 abc.jar 那麼刪掉不用的那個問題解決。
可是一般的狀況多是這兩個工程確實都各自的須要 abc.jar ,那麼問題就棘手了(我的認爲是AS的bug),每一個工程都須要,可是一編譯就報錯。
個人一個直覺想法是創建一個共享的 project3 專門用來存放共享的jar包,因而結構變成這樣,
➜ tree root
root
├── project1 //depends on project3
│ └── libs
├── project2 //depends on project3
│ └── libs
└── project3
└── libs
└── abc.jar
可是這樣編譯以後卻引發了更多的 "multiple dex files define" 問題,緣由是project1、project2 由於依賴project3的緣故,在編譯階段會把 abc.jar 拷貝到本身的工程下面,這樣的結果是這三個工程都互相引發了jar包衝突。
一番Google百度以後給出的結論是這樣的
If you have a local jar or aar library that you want to use in more than one project, you cannot just reference it directly as a local dependency. This is because the android plugin will complain if it finds the same jar file twice when dexing the project and all its dependencies. (Note that right now you can't actually use a local aar file even if you only reference it once).
來自於 Android Studio的官網 說明,也就是說在用 Android Studio 的時候最好就不要這麼用了。
可是依然提供了一個方案
One way to fix this is to deploy the artifact in a repository. While it's possible, it might not be convenient due to the overhead of managing such a repository.
這個方案的意思就是若是你把jar包放在一個repo裏面就能夠直接引用了,可是管理repo很麻煩,好比咱們常常用的 compile 'com.android.support:support-v4:21.0.0' 這句話就是從repo(jcenter)中拿到咱們須要的jar包(因此若是重複的是support-v4包,那麼直接改爲這樣就已經解決問題了)。
可是若是是一些私有的jar包,放到repo中也很麻煩,不太現實。仍是Google給的方案,依然採用這樣的結構,可是稍做修改
➜ tree root
root
├── project1 //depends on project3
│ └── libs
├── project2 //depends on project3
│ └── libs
└── project3
└── libs
└── abc.jar
在project3的build.gradle 文件中添加下面兩句
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
artifacts.add("default", file('abc.jar'))
把咱們要用的jar包做爲project3的輸出包(具體緣由不解)。
PS:緣由是這樣的每一個工程依賴的是另外工程的輸出也就是「artifacts」,這裏的操做是強制把abc.jar添加爲這個工程的輸出包。建議可使用愛內測對APP進行一個全方位的測試:http://www.ineice.com/