Android "multiple dex files define" 错误

在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 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/

时间: 2024-10-08 15:37:14

Android "multiple dex files define" 错误的相关文章

Unable to execute dex: Multiple dex files define 错误解决方法

Unable to execute dex: Multiple dex files define 当出现上面的提示的时候,意味着你的libs里面有多个包实质是一样的,比如一个高版本一个低版本,但是两个的名称不同但是包内部的名字是一样的.删除低版本的即可.

用Eclipse运行Android版APP(PhoneGap)时出现:Unable to execute dex: Multiple dex files define

这两天遇到点小问题,做个记录: 症状:运行,调试时都报:Unable to execute dex: Multiple dex files define错误,发布后的APP安装到手机后一运行,就提示:“程序名 已停止”: 解决方法: 1.项目->properties->java build path->order and export ->去掉:android 4.3.1和android-support-v4.jar的选择: 2.项目->properties->java

Android 多个DEX错误 Multiple dex files define Landroid/support/v7/app/ActionBar$DisplayOptions;

今天在写程序的时候我的Android Studio 突然编译错误(错误提示如下:)后来经过我的几番折腾发现每一次都要先Clear Project一下然后再Build就可以了,如果你第二次再Build的时候就报错.后来我就找到了最强的老师(Google)尝试解决!可惜很遗憾,我在Google上看到的都是Eclipse上的解决方法.并没有找到我想要的答案,难道要我每一次在Build的时候都要先Clear Project吗?最后又经过我的几番折腾我发现在Project Structure--->app

Android中的 Multiple dex files define 编译错误引发的思考

昨天我龙哥问我一个问题,他说如果一个工程中,有一个com.x.A枚举,导入的第三方jar中也有一个com.x.A枚举,那么我在工程中用A枚举的时候,会用到那个枚举呢?我当时一想,这个不是类(枚举是个特殊类)定义冲突吗?应该在编译的时候就报错呢,而且这个问题我之前遇到过,所以我很自信的和他说,这个应该在编译的时候就报错,结果他来了一句:没有呀?运行成功了,而且导入的是工程中的那个枚举A,我擦,我一想这不是打我脸吗?我记得非常清楚,是会报错的呀,所以我就自己写了一个AndroidDemo工程: 工程

[Android学习笔记]Unable to execute dex Multiple dex files define:xxxx 问题

不同情况可能会出现这个问题,我遇到的问题是: 引入的多个jar包中,其中可能是第三方的SDK,但是其中可能使用了比较流行的开源框架,此时你项目中就有两套包名一样的代码,编译没问题,部署到手机之后就报如上错误 解决办法是: 把第三方jar包包含的开源代码删掉即可 比如: 项目中使用了android-async-http.jar , 同时引入 xxxxx.sdk.jar , 而由于xxxxx.sdk.jar中也引入了android-async-http.jar所以出现以上错误 解决步骤: 1.修改x

Multiple dex files define Lcom/sina/sso/RemoteSSO错误解决办法

在安卓上遇到了Multiple dex files define Lcom/sina/sso/RemoteSSO的编译错误 在网上找解决办法 搜到了解决办法是这样的 方案1:Eclipse->Project->去掉Build Automatically->Clear ->Build Project->Build Automatically,关闭Eclipse,再打开 方案2:第一步: updated eclipse (Help->Check for updates) 第

Android Unable to execute dex: Multiple dex files define异常解决

问题: [2015-07-13 16:08:25 - Dex Loader] Unable to execute dex: Multiple dex files define Lcom/loopj/android/http/AsyncHttpClient$1; [2015-07-13 16:08:25 - AhStu] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom

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项目,标记为库

Android Studio:Multiple dex files define Landroid/support/annotation/AnimRes

最近真的比较忙,一不小心博客又荒了两个月.从今天起,决定重返csdn,多多纪录和分享.先从一个最近被折磨的死去活来的问题. 由于升级了V4包,就一直报这个问题: com.android.dex.DexException: Multiple dex files define Landroid/support/annotation/AnimRes; 每次都要clean一下,然后才能编译过,光这个过程就浪费了4/5分钟.出现这个问题是因为最新的v4包(compile 'com.android.supp