大雁才成群结队,雄鹰永远孤傲飞翔
之前跟大家介绍一个Alibaba的框架dexposed框架,此框架能够动态的从线上完成一些补丁的工作。但是,由于它的性能和兼容性(不支持ART)所以,很多朋友都决定不再研究此框架。
今天,这里我再次给大家介绍一个Alibaba的开源框架——AndFix。和Dexposed一样,此框架一样是为了能够在线的打补丁。即发现了bug之后,通过线上补丁修复本地的逻辑代码的工具库。
原理与Dexposed类似,这里我们不做详解,如果不清楚的童鞋,可以看我的另两篇文章:
http://blog.csdn.net/yzzst/article/details/47954479
http://blog.csdn.net/yzzst/article/details/47659987
如果你要问我,为什么alibaba内部团队要做两个差不多的东西?
我只能回答,如果你也在大公司干过,你应该知道有一种悲哀叫——KPI。
AndFix的Github地址:https://github.com/alibaba/AndFix
如何使用?
笔者翻译的官方文档,如下:
AndFix是一个Android App的在线热补丁框架。使用此框架,我们能够在不重复发版的情况下,在线修改App中的Bug。AndFix就是 “Android Hot-Fix”的缩写。
就目前来说,AndFix支持Android 2.3到6.0版本,并且支持arm 与 X86系统架构的设备。完美支持Dalvik与ART的Runtime。
AndFix 的补丁文件是以 .apatch 结尾的文件。
AndFix的原理很简单。就是针对项目中原有方法的替换取代工作:
而我们打一个在线的补丁包,也就有了如下的步骤逻辑:
直接添加 AndFix aar 到项目中的 编译依赖库中。
maven 依赖:
<dependency>
<groupId>com.alipay.euler</groupId>
<artifactId>andfix</artifactId>
<version>0.3.0</version>
<type>aar</type>
</dependency>
或者是Gradle依赖:
dependencies {
compile ‘com.alipay.euler:andfix:0.3.0@aar‘
}
1 . 初始化PatchManager:
patchManager = new PatchManager(context);
patchManager.init(appversion);//current version
2 . 载入补丁包
越早的载入补丁包越好,通常来说,我们一般都会在自定义的Application中的onCreate方法里面载入补丁包。即:
patchManager.loadPatch();
3 . 添加补丁包
新的补丁包,下载后调用addPatch方法添加补丁。这个补丁会立即生效。
patchManager.addPatch(path);//path of the patch file that be downloaded
确保一些class文件在使用的时候不被proguard所混淆,当然,proguard的混淆配置如下所示:
com.euler.cloudfix.CloudFix
com.euler.cloudfix.annotation.MethodReplace
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}
别以为补丁就是我们直接开发一个apk就好了,制作补丁是需要专门的工具的。这里有一个工具,叫做 apkpatch的工具,用来制作AndFix的补丁。
地址:https://github.com/alibaba/AndFix/raw/master/tools/apkpatch.zip
生成.apatch 文件
usage: apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
-a,--alias <alias> alias.
-e,--epassword <***> entry password.
-f,--from <loc> new Apk file path.
-k,--keystore <loc> keystore path.
-n,--name <name> patch name.
-o,--out <dir> output dir.
-p,--kpassword <***> keystore password.
-t,--to <loc> old Apk file path.
merge .apatch 文件
usage: apkpatch -m <apatch_path...> -k <keystore> -p <***> -a <alias> -e <***>
-a,--alias <alias> alias.
-e,--epassword <***> entry password.
-k,--keystore <loc> keystore path.
-m,--merge <loc...> path of .apatch files.
-n,--name <name> patch name.
-o,--out <dir> output dir.
-p,--kpassword <***> keystore password.
/*
* @author zhoushengtao(周圣韬)
* @since 2015年9月15日 下午 15:23:00
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
* @交流学习QQ群:341989536
* @私人QQ:445914891
/
版权声明:转载请标注:http://blog.csdn.net/yzzst 。 本文为博主原创文章,未经博主允许不得转载。
Android不发版也能在线修Bug?——AndFix 框架
原文地址:http://blog.csdn.net/yzzst/article/details/48465031