Android中Unable to execute dex: Multiple dex files define Lcom/viewpagerindicator/CirclePageIndicat

在Android開發工作中經常遇到很多奇怪的異常,解決起來會花很長的時間。下面首先來介紹一下Android中有關Jar包的知識。

1.Jar包的含義:
Jar包裏邊封裝了很多的類和方法。在開發過程中經常會用到各種各樣的Jar包來實現一些功能。

2.Jar包的作用:
將重用的代碼打包成一個Jar包,供所有的需要的項目使用。解決了代碼複用的問題。
但是Jar包中不包括大量的資源:圖片、音樂文件甚至界面佈局。
有關佈局的資源文件不能打包成Jar包。爲了解決這個問題,新建一個Android項目,標記爲庫項目,在需要的項目中導入該庫項目。

3.創建Android庫文件或者引用Android庫文件的方法:
創建庫項目,只需要在創建普通Android項目完成後,打開設置項目屬性的面板,在Android選項卡下選中Is Library複選框即可。

4.當然,在使用庫項目的時候,因爲Android項目結構及編譯工具的特殊性,我們需要注意一些要點,列舉如下:
(1).工作項目和庫項目的資源名稱,儘量不要重複,如果重複,編譯器會優先使用工作項目的資源;
(2).無法將一個庫項目導出爲一個jar文件;
(3).庫項目的Android系統版本必須等於或低於工作項目的系統版本;
(4).每一個庫項目都會生成一個R文件,工作項目被編譯時,將會合並工作項目和庫項目的R文件。
如果R文件中有常量同名,將使用工作項目R文件中的常量;如果引用了多個庫項目,庫項目中的R文件有常量重名,
將根據庫項目被引用的順序來確定常量的使用優先級。

5.總結:
在軟件開發的過程中,如果只是共享代碼,而且共享的代碼中不涉及到res資源文件的調用的話,直接導出Jar包供其他項目調用。
如果是共享代碼,而且共享的代碼中涉及到res資源文件的調用的話:有兩種方法來實現。
(1).將共享的代碼做成一個庫工程來供其他項目引用。如上邊所述。
(2).網上通用的方法是把res資源文件放到assets文件夾中,再在src代碼中加載處理,然後再用eclipse導出jar包,引用即可
(res資源雖然可以打進jar包,但當其他項目調用jar包時jar包中引用ID指向的是當前項目的資源,
關於如何讓jar包中的資源引用只想jar包中的res文件暫無解決方案。我的問題已解決。
解決方案:
把圖片資源放入assets包中一併打入jar包,佈局就只能用代碼了。jar包中代碼可以成功引用jar包內的assets文件。
另:JNI層不可被打包入jar包,只能同jar包一同提供給第三方並放入工程目錄下的libs包中)。

6.遇到的問題:
Unable to execute dex: Multiple dex files define
Lcom/viewpagerindicator/CirclePageIndicatorSavedState 1; Conversion to Dalvik format failed with error 1。
這個錯誤是由於錯誤的添加了不必要的core library或重複添加了同一個library jar包或添加的不必要的jar包產生衝突造成的。

解決方案:
A.刪除掉不必要的jar包。
B.引用library的時候,項目中導入的jar包版本和庫項目中使用的版本要一致。
C.首先取消選中Build Automatically,然後clear一下,最後選中Build Automatically。
D.新建一個一樣包名的項目,將原來項目的相關的內容拷貝到新建的項目中。尤其要注意:jar包的導入方式
E.Jar包的導入方式:
(1).在工程中新建一個libs文件夾,將jar包放在該文件夾下。
(2).右鍵->Build path->add to Build path
(3).查看 Build path->Configure Build path 查看Librarys和Order and Export是否都選中了以及是否有多餘的沒有刪除的。

發佈了68 篇原創文章 · 獲贊 19 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章