昨天准备发布一个版本,算好了时间,在解决完其他问题后预留两个小时来上传。在打包时遇见了问题,害的我加班三个小时。现记录下问题,并整理下解决问题的思路。
打包出现问题时的截图
图片可能看不太清楚,错误如下:
Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompatIcs;
蹩脚的翻译:
错误:将字节码文件转换为dex文件出现错误
原因:异常为:com.android.dex.DexException,Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompatIcs这一个类出现了多个dex文件的定义
经过一番搜索,我的理解为:要使用到的一个类在项目中有多个librariy都存在。如果只是照这样理解,就应该在那几个librariy添加依赖时移除掉AccessibilityServiceInfoCompatIcs这个类,但是搜遍全网并没有方法可以做到。
于是,我就在添加依赖时,移除点含有AccessibilityServiceInfoCompatIcs这个类的librariy,因为,一般这些包含同一个相同类的library功能肯定是相同的,不用担心,移除了重复的library会导致项目出现错误。
具体方法:
1、Ctrl + N 查找到项目中含有AccessibilityServiceInfoCompatIcs这个类的librariy (注意:最近又遇到一个library重复的问题,但是通过Ctrl + N根本找不到会有两个或者更多的library包含了这一个文件,所以,需要自己判断引入重复的library)
可以看到一共有三个v4包含有这个类
2、对应查看项目中含有AccessibilityServiceInfoCompatIcs类的librariy,找到External Libraries
3、移除重复librariy,只保留一个.
这时候想要移除重复包,应该是有两种情况。
一种情况是,可以直接在libs文件夹中可以找到,那么就直接移除即可。对于有的地方移除了会报错,只需添加依赖那唯一一个保留下来的librariy即可。
另一种情况就是在libs文件夹中找不到,我这儿就是。就说明这个librariy是在别的librariy里面。这比较头疼,因为我也不知道我添加依赖的library里面到底包含哪些library。
不过,我想到了一个笨方法:在给一个library添加依赖后,编译完成后在External Library可以查看到对应的library,那我就不断去掉对应依赖的library,不断的查看External Library中library,如果在移除掉一个library后在External Library中我们需要移除的library(我这儿就是关注那2个v4包和support-compat包)也跟着没了,那就说明该library中包含那个重复library(我这儿就是那2个v4包和support-compat包)。
我在不断的注释移除依赖库,终于找到了第一个library,在移除掉cn.finalteam:galleryfinal:1.4.8.7这个库之后,support-v4-23.1.1在External Library中消失了。其他几个就不一一列举了。