问题描述
我在项目中包含的库遇到了一些问题:一开始,这只是一个相互冲突的依赖问题,我通过排除来解决support-v4 是常用的共享模块.
I'm running into some trouble with a library I included into my project: At the beginning it was just a conflicting dependencies issue that I resolved by excluding support-v4 which is the commonly shared module.
问题在于,其中一个 lbsLib-release 似乎是在开发人员构建之前使用根项目内的普通 .jar 文件构建的.
The problem is that one of those lbsLib-release seems to have been built with a plain .jar file inside of the root project before the developer build.
通过运行 ./gradlew app:dependencies 我验证了构建图中没有引用依赖项.
By running ./gradlew app:dependencies I verified that the dependency is not referenced in the build graph.
我发现这个 support-v4 嵌入到 classes.jar 中在:app/build/intermedites/exploded-aar/MyQaaAndroid/lbsLib-release/unspecified/classes.jar/,如下图所示:
And I found this support-v4 embedded into the classes.jar located at : app/build/intermedites/exploded-aar/MyQaaAndroid/lbsLib-release/unspecified/classes.jar/ as you can see on the picture below:
我不能自己重建项目,因为它不是一个开源的lib,所以有两个问题:
I can't rebuild the project myself because it is not an open-sourced lib, so there is two problem:
如果我将 compile 'com.android.support:support-v4:18.0.+' 添加到 build.gradle 一个 multiple dex文件 在构建时抛出错误,因此库被引用了两次.
If I add compile 'com.android.support:support-v4:18.0.+' to the build.gradle a multiple dex file error is thrown at build time so the library is referenced twice.
UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Landroid/support/v4/app/BackStackState; at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596) at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554) at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535) at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171) at com.android.dx.merge.DexMerger.merge(DexMerger.java:189) at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303) at com.android.dx.command.dexer.Main.run(Main.java:246) at com.android.dx.command.dexer.Main.main(Main.java:215) at com.android.dx.command.Main.main(Main.java:106)
`
如果我删除所有需要 support-v4 的库,它会在应用程序运行时引发缺少依赖项错误.
If I remove all libs which require support-v4 it throws a missing dependencies error at the application runtime.
所以我想知道是否可以从构建中排除这个 .jar 文件或使其他库依赖于 lbsLib-release 嵌入 support-v4 .jar.
So I would like to know if it is possible to exclude this .jar file from the build or to make the others libs depends on the lbsLib-release embedded support-v4 .jar.
compile (project(':lbsLib-release')) { exclude module: 'support-v4' } compile ('com.sothree.slidinguppanel:library:2.0.4'){ exclude module: 'support-v4' } compile('com.google.android.gms:play-services:6.5.87') { exclude module: 'support-v4' }
推荐答案
尝试使用 resolutionStrategy (API 参考) 在根 build.gradle.
Try to use resolutionStrategy (API reference) at root build.gradle.
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.0.0' } } allprojects { repositories { jcenter() } configurations.all((Closure) { resolutionStrategy { force 'com.android.support:support-v4:21.0.2' // your version of support library } }) }