版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
支持Android 2.3 到 6.0+;
支持 ARM and X86 架构指令集;
支持Dalvik and ART 运行时;
a在对应的项目build.gradle文件中的dependencies 中加入
“compile 'com.alipay.euler:andfix:0.4.0@aar'”
b 由于发现远程的aar文件中可能没有引入所有类型cpu所对应的so文件,所以需要下载源码中的libs文件中的so文件,如下所示:
然后将这些so文件加入自己项目所对应的路径下,如下图所示:
然后请尝试打包,如果报错的话,根据提示,将对应重复的so文件删除。如下图所示:
该错误说明在所应用的aar(通过compile 'com.alipay.euler:andfix:0.4.0@aar'引入的)文件中,已经存在了x86类型的libandfix.so文件。所以要将自己项目中单独引入的文件删掉。
c b中所述问题是因为远程引入的aar文件没有包含所有类型cpu支持的so文件引起的,如果没有对应手机所使用的so文件,应用将不能使用andfix,甚至会引起应用不能启动的问题。所以一起要把所有so文件全加入,然后在打包出错时删除多余的so文件,这样不会漏掉对所有类型cpu的支持。
尽量早得完成patchmanager初始化的过程,推荐在application oncreate时,如下:
PatchManager patchManager = new PatchManager(this); String appVersion = ""; try { appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; patchManager.init(appVersion); patchManager.loadPatch();
a patchManager.init(appVersion)中的version——每次appversion变更都会导致所有补丁被删除,如果appversion没有改变,则会加载已经保存的所有补丁。
b patchManager.loadPatch()要在addPatch之前使用。
c 完整的例子
String APATCH_PATH = "/Dennis.apatch"; String TAG = "PATCH";
PatchManager patchManager = new PatchManager(this); String appVersion = ""; try { appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; patchManager.init(appVersion); patchManager.loadPatch(); //apatch文件的目录 String patchFileString = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH; Log.i(TAG, patchFileString); File apatchPath = new File(patchFileString); if (apatchPath.exists()) { Log.i(TAG, "补丁文件存在"); Toast.makeText(this, "补丁文件存在", Toast.LENGTH_SHORT).show(); try { //添加apatch文件 patchManager.addPatch(patchFileString); } catch (IOException e) { Log.i(TAG, "打补丁出错了"); e.printStackTrace(); } } else { Log.i(TAG, "补丁文件不存在"); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
注:补丁文件的名字每次需要不用,如果名字一致,将不能再次打补丁。例子中StringAPATCH_PATH= "/Dennis.apatch"写死了,只能示意。
当引入了andfix,想通过打补丁的方式修复bug,打包时需要遵循几点:
原始apk,或者叫发布的apk,或者叫有可能有bug的apk——>
a 混淆文件中加入如下
-keep class * extends java.lang.annotation.Annotation -keepclasseswithmembernames class * { native; } -keep class com.alipay.euler.andfix.** { *; }
b 打包后,保留apk文件,mapping文件
发现bug后,修改bug,打新的apk包——>
a 这个包在打包时,要依赖发布包时生成的mapping文件,即上一步中保留的mapping文件,同时在混淆文件中加入如下代码
-applymapping mapping.txt,其中“mapping.txt”为自己所生成的mapping文件名字。
b 将本次生成的apk文件保存
生成不定文件——>
a下载补丁工具apkpatch-1.0.3.zip
b 把有bug的apk,没bug的apk,还有keysotre文件放在apkpatch-1.0.3
目录下。
c 运行如下命名:
./apkpatch.sh -f NoBug.apk -t Bug.apk-o Dennis -k keystore -p 111111 -a 111111 -e 111111
每个参数含义如下
-f 新版本的apk
-t 旧版本的apk
-o 输出apatch文件的文件夹,可以随意命名
-k 打包的keystore文件名
-p keystore的密码
-a keystore 用户别名
-e keystore 用户别名的密码
OK,打补丁成功,把生成的不定文件xx.apatch 通过对应的方式,发送到已含bug的手机上即可。
不支持YunOS
无法添加新类(内部类也不行)和新的字段、新的方法
资源文件无法替换
加载过的补丁会被保存到data/packagename/files/apatch_opt目录下,所以下载过来的补丁用过一次就可以删除了。
Andfix github地址https://github.com/alibaba/AndFix
参考博客 http://www.jianshu.com/p/479b8c7ec3e3
http://blog.csdn.net/qq_31530015/article/details/51785228
word文档地址 http://download.csdn.net/detail/u012909631/9570037