大幅度优化
如果读了前一篇文章,就会知道为了防止出现java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
而使用javassist动态代码注入的方式,使我们要修改的类的构造方法中引用第三方dex中得AntilazyLoad
类。为此,引用了buildSrc、hackdex两个module。但这却有个弊端,就是如果我们的项目里面的类很多,那不是要在buildSrc里插入很多类的引用,插入了之后也会影响编译速度。即使在buildSrc中插入了,那如果我们的类有很多其他类的引用,在编译成class文件过程时,也会比较麻烦。所以我使用了另外一种基于Android multidex方式制作补丁文件,而且经过实践发现,直接加载该方式制作的补丁文件,不会出现上面的异常。
下面再将该方法做下说明
1)、项目配置Android multidex
参考Android官方文档:http://developer.android.com/tools/building/multidex.html。
3)、编译APP,请注意,这是我们将bug修复好的APP,我们的目的是要将 该APP里面的修复过的BugActivity制作成dex文件。
4)、使用apktool工具反编译我们的app:
输入命令apktool d app-debug.apk
如图所示:
在反编译出来的文件夹中,创建一个新的文件夹smali_classes2,然后从smali文件夹中剪切(注意是剪切)出BugActivity.smali到前面的文件夹中(当然,这个类文件也需要完整的包目录,否则回译肯定无法通过)。如图:
5)、重新编译app
输入命令:apktool b app-debug,
在app-debug/dist文件夹里生成然后app,然后解压,会发现里面存在了app里多了classes2.dex文件如图:
6)、将classess2.dex改名成classes.dex后打包:
将classess2.dex剪切到一个新的文件夹下,命令行进入到classes2.dex文件所在的目录,将classess2.dex改名成classes.dex输入命令:
jar cvf hack_dex_fix.jar classes.dex
生成的hack_dex_fix.jar既是我们需要的补丁文件。
将该文件复制到项目的assets目录下即可。
至于这里为什么还要打包压缩文件的原因是因为直接使用(如何使用请看下一步)classes2.dex会报错,如图:
在这个异常中,我们也能发现,其实我们需要一个zip包,并且里面要有我们的classes.dex。我们的APK其实就是一个压缩文件,我们原始的classes.dex就是在压缩文件中,这也侧面证明了这个。
项目代码:
https://github.com/haidaodashushu/MyMultiDex/tree/master/app/src/main/java/wzk/com/mymultidex