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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章