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