这里说明一下本人用的是Android Studio,用gradle配置,关于maven的我就不在陈述了。
快速集成步骤
第一步 gradle里添加依赖库
在gradle 里
dependencies {
compile 'com.alipay.euler:andfix:0.3.1@aar'
}
第二步 Application里添加初始化代码 appversion取系统的versionname即可
patchManager = new PatchManager (context);
patchManager.init (AppParameterUtil.getAppVersionName (context));
patchManager.loadPatch ();
第三步 就是要add修复包,path就是本地的下载好的一个.apatch一个文件。
patchManager.addPatch (path);
第四步 生成apatch命令
apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
参照官方文档都有详细说明,不再陈述。
只需要简单的四步即可集成好热修复
接下来我说一下这里面的诸多神坑,之所以说是坑因为android碎片化太严重,AndFix兼容性还不是很乐观,相信看过Github上项目的issue,上面会有各种各样的兼容性问题,接下来为大家说一下我遇到问题以及解决方案。
问题以及解决方案
一、开源的项目里只编译了x86和armeabi两个so文件
解决办法:
1、只保留armeabi和x86文件夹下的so,其余从工程文件夹删除。
2、将AndFix的源码下载下来编译支持其他架构的的so。
二、对于超过65535的问题,要通过Google提供的方案multidex,如果用这种方式就会发现只有Activity里的可以修复,类和Fragment里的方法是修复不了,因为Activity是在主dex里,其他的可能在生成的第二个dex里(我猜测)
解决办法:
所以就需要修改一下生成修复包的脚本
解决思路原理 http://w4lle.github.io/2016/03/13/AndFix支持multidex解决方案/?utm_source=tuicool&utm_medium=referral,用这个脚本就可以解决上面问题。
三、就算按照上面的解决了多个so的问题,在实际中还是对于不同的android版本,机型还是出现了不兼容,我大概尝试了十几个手机,只有四个可以修复,其他的修复直接闪退,再也启动不起来。
解决办法:
在你的gradle里配置如下
release {
ndk {
abiFilters "armeabi"
abiFilters "armeabi-v7a"
abiFilters "mips"
abiFilters "mips64"
abiFilters "x86"
abiFilters "x86_64"
}
}
加上这个以后就可以解决很多的兼容问题,发现andfix对于arm64-v8a兼容有问题,很多小米三星和魅族都会修复闪退,这里配置是为了指定在架构上运行,当没有配置arm64-v8a就会自动找armeabi里的so,这个问题困扰了我好久才找到的解决办法。
四、混淆问题
一定要在你的混淆配置文件里加上
-printmapping mapping.txt
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}
-keep class com.alipay.euler.andfix.** { *; }
打包好后会在build/outputs/mapping/..下面找到mapping文件,这个就是混淆的映射文件,下次打新的包时使用-applymapping mapping.txt参数就可以让混淆后的类名称和之前的一样了,如果不是很好理解这个可以android printmapping 、android applymapping 应该可以看到一些文章说明
五、还有就是下载apatch的策略设计,通过测试一次如果加载大于等于3个apatch包的时候会ANR,必须kill进程在重新启动才会正常,在子线程中也没解决,所以尽量在每个大版本里少放几个修复补丁,有更好的办法可以一起分享。
至此把用了两周时间研究并集成好的AndFix和大家分享了,期间会遇到各种各样的奇怪问题,建议不要直接在项目里调试,弄个测试工程所有的都解决了在去放到项目里,要不会遇到各种奇怪问题。(我也是头疼了好久 )
个人感觉这个技术还不是很成熟,已经集成的还会有诸多的兼容问题反馈的,我会及时在这里和大家分享,这个工具还是有很多局限性的不支持新增类so等等一些问题,但是的确是黑科技了,但是目前还不能依赖这个工具解决所有问题,一些紧急bug还是可以用一下的。
我想到的一些思路是结合DexClassLoader,把lib - libxxx.so 先复制一份,再合并,不过这样更新了so,也不能即时生效。得重启app了。(只是模糊的一个想法,欢迎大家吐槽),最后分享一下其他各大热补丁的方案分析和比较http://blog.zhaiyifan.cn/2015/11/20/HotPatchCompare/
以上是我和大家分享的,希望以后和大家一起分享交流学习。