Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android multiple dex files define 錯誤

Android multiple dex files define 錯誤

編輯:關於Android編程

在Android開發中經常看到這個錯誤,產生的原因還是挺值得研究的。

 

如果是在eclipse上出現的這個問題,基本上可以判斷為同一工程中存在相同的jar包,或者是不同的jar包,但是他們之間有相同的類,所以解決辦法就是干掉對方。在eclipse中如果刪除jar之後還報錯的話,可能是eclipse的緩存導致的,重啟eclipse基本可以解決這個問題。

 

但是如果事情發生在 Android Studio 上,那麼就復雜了。首先要排除eclipse中的那種情況,如果問題還沒有解決那就要仔細了。

 

如果工程結構是這樣的

 

? tree root

root

├── project1

│ └── libs

│ └── abc.jar

└── project2

└── 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 thatyou want to use in more than one project, you cannot just reference it directlyas a local dependency. This is because the android plugin will complain if itfinds 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 onlyreference it once).

來自於 Android Studio的官網說明,也就是說在用 Android Studio 的時候最好就不要這麼用了。

 

但是依然提供了一個方案

 

One way to fix this is to deploy theartifact in a repository. While it's possible, it might not be convenient dueto 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進行一個全方位的測試: 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved