在项目中难免接入很多第三方的功能,这其中就很容易出现jar包重复、重复编译的问题,jar包重复和重复编译的问题有很多解决办法。
问题的表现形式多为这些:
一、包重复导致的问题(常见第三方中引入了包而项目中再次引入了该包)
(1)问题表现形式一:
Error:Execution failed for task ':JQ_ELOVE:transformClassesWithDexForRelease'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'E:\Java\jdk1.7.0_71\bin\java.exe'' finished with non-zero exit value 2
网上给出的很多办法都是这样解决:
defaultConfig { multiDexEnabled true }不能说这种方法不好,在我的问题中这种办法帮我找到了问题的根源,因为我设置了上述这个之后,出现了其他问题(v4包和第三方包的重复问题),这样具体的问题让我很方便找到了解决办法(当然如果重复包太多,也许上述方法可以更方便的解决问题?没有测试不清楚),其实并不是只有上述办法才可以找到具体的重复问题,比如我的重复包重复问题其实是这样的:在上述问题表现形式1的前面其实还分别伴有着这句话:
a种:Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
b种:Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Lcom/hyphenate/EMCallBack;
其实我在拿自己的问题举例了:a种 v4包的问题;b种hyphenate的问题。
当然网上给出的这种办法对于我这个问题不好用,但是帮我找到了我没有注意到的报错信息,设置对应的方法来解决上述两个问题:
a种:
configurations { all*.exclude group: 'com.android.support', module: 'support-v4' }b种:
直接删除项目中的jar包,并且将build.gradle中的compile去掉。
(2)问题的表现形式二:
Error:Execution failed for task ':JQ_ELOVE:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK assets/logo_h.png
File1: F:\jobworkspace\Elove\JQ_ELOVE\libs\BaiduLBS_Android.jar
File2: F:\jobworkspace\Elove\JQ_ELOVE\build\intermediates\exploded-aar\Elove\easeui\unspecified\jars\classes.jar
由于这个问题是之前发现的,以至于我猜想这个问题的上面是不是还有其他提示cause之类的,当时从网上找到的解决办法大都是:
packagingOptions { exclude 'assets/fps_images.png' }之类的,当然可能对于一些零散的重复文件这种方法是比较好的,但是对我来说当时也是包重复,我就按照这种方法把错误一直exclude到消失,结果可想而知,太累了也太傻了,后来直接删掉包ok。
二、重复编译的问题(其实我个人感觉是伪问题)
在我查找解决办法的过程中,在*上面看到了一个对于“问题一表现形式一”这样的解决办法:
网友是这样表述的:
I didn't see "compile fileTree(dir: 'libs', include: ['*.jar'])" it was compiling twice my libraries。
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile files('libs/okhttp-3.2.0.jar') compile files('libs/okio-1.7.0.jar') compile files('libs/open_sdk_r5509.jar') compile files('libs/SocialSDK_QQZone_3.jar') compile files('libs/SocialSDK_Sina.jar') compile files('libs/SocialSDK_WeiXin_1.jar') compile files('libs/SocialSDK_WeiXin_2.jar') compile files('libs/umeng_social_sdk.jar') compile files('libs/weiboSDKCore_3.1.4.jar') compile files('libs/mta-sdk-1.6.2.jar') compile files('libs/fastjson-1.1.34.android.jar') compile project(path: ':easeui') compile 'com.android.support:support-v4:22.2.1' compile 'com.android.support:design:22.2.1' compile 'com.google.code.gson:gson:2.6.2' compile files('libs/BaiduLBS_Android.jar') compile files('libs/aliyun-oss-sdk-android-2.2.0.jar') compile 'com.baoyz.actionsheet:library:1.1.5' compile 'com.nineoldandroids:library:2.4.0' compile 'com.github.sd6352051.niftydialogeffects:niftydialogeffects:1.0.0@aar' compile files('libs/hyphenatechat_3.1.3.jar') }第一句其实已经编译了libs下的jar包,而上面文件中在第一句的配置下又每个都单独写了一个compile,这样存在重复编译的问题,在问题中的网友表示是通过注释掉下面的重复编译的包才得以解决了第一个问题,但是我并不认为是这样,因为首先我之前一直这样打包也并没有发生什么错误。其次,我看了网友注释掉的部分,并不都是libs下的compile,有的是com开头的包,要知道com开头的包注释掉这个包会从项目中除去,所以应该是网友刚好注释掉了重复的包,而这个包刚好又可以通过注释而清除出项目。当然这只是我的推断,具体我不了解该网友项目当时的具体情况。
之所以拿出来说,其实也是因为我之前一直没留意第一句,因为我们每次加入jar包add as library时studio自动添加compile,所以没有考虑过重复编译的问题。之前也就没有这个概念。而我注释掉下面libs下的jar包的compile之后,项目依然可以正常打包。所以,又涨姿势了。
至此,这篇文章也就结束了,但是对于上述很多内容有过经历的网友,希望不吝给出一些自己的看法,免得给更多的人造成误导。
很多人明白很多大道理,但是依旧过不好这一生。
要好好活着,因为会死很久。--------生命短暂,要好好享受生活,不要因为一些事情而影响心情。