这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用。
1、大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.support-multidex进行解决,但是你也许会遇到下面这样的错误,不由得让你冥思苦想,这个出错原因一般是引入了多个相同的包,但是你打开一开,libs下明明就只有一个包呀,让人头疼。
Error:Execution failed for task ':app:packageAllDebugClassesForMultiDex'.
> java.util.zip.ZipException: duplicate entry: android/support/multidex/MultiDex.class
解决方案如下:首先删掉libs下面的jar包,并解除依赖,然后在gradle脚本中,加入compile 'com.android.support:multidex:1.0.1'
(当前最新版本是1.0.1),顺利解决。
2、相信下面这个问题也比较常见,至少楼主遇到很多次了,前面没做笔记,搞的每次都要重新去理解,所以这个问题必须总结一下,杂一看又是v4包重复了。
* What went wrong:
Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: android/support/annotation/ColorRes.class
具体解决方案为:由于很多第三方包都会用到v4支持包,这样在你导入多个支持的时候难免会出现这样的错误,只需在build.gradle里面添加上
configurations {
all*.exclude group: 'com.android.support', module: 'support-v4'
}
然后clean一下工程再build就好。记住必须先clean,不然还是无法解决!!
3、如果重复的包你并不知道是哪里重复了怎么办?比如这个:
Java.util.zip.ZipException: duplicate entry: com/nineoldandroids/animation/Animator$AnimatorListener.class
这个问题是由于添加的第三方项目依赖中,有多个项目同时依赖了nineoldandroids这个动画库的原因,多出现在as用项目构建工具gradle构建项目的时候。
最简单的解决方法:
在as左侧选择project后,在左侧项目列表中展开external libraries,这里面是gradle为你自动下载好的jar包,依次点击展开依赖的项目,并在其中的classes.jar下找到重复的com.nineoldandroids包,手动delete即可,最后留下一个即可。
4、什么?这还不够狠?给你来个更能节省找问题时间的。大家都知道我们在android开发过程中或多或少会引入module,不仅可以提高项目的开发进度,而且项目管理起来也会相当方便。
但是!!!!你可能会遇到在同一个项目中引入多个module,而这些module又因为引入了同一个jar包或者有冲突的jar包的时候,这样你可能可以通过编译,但是你打包apk会直接报错有木有?如果你一个是module,一个是直接在app下的build.gradle添加的依赖,打包时候看到二次引入,你估计会想:什么?二次引入?你可能根本丈二的和尚摸不着头脑,因为也许你依赖了很多三方的东西,而你竟然不知道哪个用了这个jar包导致了这个异常,的确让人心力交瘁,蓝瘦香菇。
在解决问题之前,我还是想在这里多说几句,说下关于module的集中依赖的区别,如果想直接看解决方案的请跳:
1) compile:它是对所有的build type以及favlors都会参与编译并且打包到最终的apk文件中。
2) provided:它是对所有的build type以及favlors只在编译时使用,类似eclipse中的external-libs,只参与编译,不打包到最终的apk。
3) apk:只会打包到apk文件中,而不参与编译,所以不能在代码中直接调用jar中的类或者方法,否则编译时报错。
4) test compile:它仅仅是针对单元测试代码的编译以及最终打包测试apk时有效,而对正常的debug或者release apk包不起任何作用。
5) debug compile:它仅仅针对debug模式的编译和最终的debug apk打包。
6) release compile:仅仅针对release模式的编译和最终的release apk打包。
回归正题,这样的解决方案是什么:
直接看打包的错误打印,找到module中这个二次引入的jar包,把compile更改为provided,这样在写代码的时候可以在所属的module中正常使用jar包中的类,而生成的apk不会包含该jar包。这样在编译的时候由于只有一个jar包编译进apk,便不会发生上面所说的二次引入的冲突错误了。
【注】使用provided必须删除compile fileTree(include: ['*.jar'], dir: 'libs') 不然lib下的jar均按照compile方式引入到Module。
还是来个例子:我在项目中用了一堆堆的compile,而由于集成了环信的easeui,又因为其使用了glide的jar包,所以导致我在release的时候,glide发生了冲突,所以我采用了上面的解决方案,得到了成功解决。下面是easeui的build文件。我把glide换成了provided。
今天就先讲到这里,后面会持续更新,帮大家踩坑,持续关注吧~
2016/12/07补充
今天遇到一个导入一个新库的时候出现异常
java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader[DexPathList[[dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-support-annotations-25.0.1_90941a77b2b94e164136c426d140cfe0713579d1-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_9-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_8-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_7-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_6-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_5-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_4-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_3-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_2-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_1-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-slice_0-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-rxjava-1.2.0_870337658ae259b4e95c589b707604c2e552ee88-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-retrofit-2.1.0_02cdaa5f093e78b272a8b951b62057cb62740b8d-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-picasso-2.5.2_2428dbd5eabf65ae69bc01abd6e4b72d08e545aa-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-parse-android-1.13.0_4515c5f93c9f181f78d21e114c731820c9c0999c-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-org.apache.http.legacy_e4a662e38e87ba9aba584fba71c26d677575fa22-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-okio-1.9.0_db0545b090bbd931e1cf6e43202e038727277a7d-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-okhttp-3.4.1_a3a718343956c6e4d917a53a4fdd4a4dc134cda5-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-mobAPI-1.0.6_52db92710d9ddfc179b67c21c9dd1fd75c5359b0-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-me.zhanghai.android.materialprogressbar-library-1.3.0_d3d39d36af179081bbaa70f93cbbf294916d6a68-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-me.xiaopan-assemblyadapter-2.2.0_73b132544aaa40f14e5060f665680f347bb97de3-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-me.wangyuwei-ParticleView-1.0.5_4ae89dcc85783878dcc540643b6bdee7b4a10901-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-library-2.4.0_dd460f45d27a359687729c3c169358b1eda3100b-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-leakcanary-watcher-1.5_34a203fec755c3a4cf8b68e6158267ab4379fd5b-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-leakcanary-analyzer-1.5_1c9538df116ffddb5272c7355d65a1d2955ff7ca-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-jp.wasabeef-recyclerview-animators-2.2.3_15d3f8b560ea0845185068ede8fc16fcf2bcb304-classes.dex", dex file "/data/data/com.example.nanchen.aiyaschoolpush/files/instant-run/dex/slice-io.reactivex-rxandroid-1.2.1_ce5cad2fcff3d5d6d5783b67c7bce0a6f3cd5e8c-classes.dex", dex file "/data/data/com.example.nanchen.
经过多番核查,此类错误一般是jniLibs库加载的时候出现了问题,检查发现新库的jniLibs目录下只有armeabi-v7a一个包,而之前项目中依赖的环信有四个包
这样的情况解决方法两种:因为armeabi和armeabi-v7a在一定意义上是可以直接copy的,所以第一种方法是让新库提供方提供支持are64-v8a和x86的so文件;另外一种就是直接删掉之前的arm64-v8a和x86包,不过这样有风险,一旦遇上这样的手机会很难受~