热修复AndFix详解
文章目录
- AndFix介绍
- 原则
- 修复过程
- AndFix集成
- AndFix初始化
- 生成带bug的apk
- apatch文件生成
- patch文件安装
- AndFix模块组件
- AndFix源码讲解
- 总结
AndFix介绍
https://github.com/alibaba/AndFix
AndFix是一个在线修复漏洞的解决方案,而不是重新发布Android应用程序。它作为Android库分发。
Andfix是“Android热修复”的缩写。
AndFix支持从2.3到7.0的Android版本,支持ARM和X86架构,支持Dalvik和ART运行时,支持32位和64位。
AndFix补丁的压缩文件格式是.apatch。它从您自己的服务器发送到客户端以修复应用程序的错误。
原则
AndFix的实现原理是方法体的替换(注意:只支持方法的替换)。
AndFix方法替换是通过java自定义注解来判断的,并通过hook来替换。AndFix在ART中有art_replaceMethod,在Dalvik中有dalvik_replaceMethod native方法。
修复过程
AndFix集成
maven依赖:
<dependency> <groupId>com.alipay.euler</groupId> <artifactId>andfix</artifactId> <version>0.5.0</version> <type>aar</type></dependency>
或者gradle依赖:
dependencies {compile 'com.alipay.euler:andfix:0.5.0@aar'}
AndFix初始化
1 初始化PatchManager
patchManager = new PatchManager(context);patchManager.init(appversion);//current version
2 加载patch
最好在Application.onCreate()中加载
patchManager.loadPatch();
3 添加patch
patchManager.addPatch(path);
/** * 管理AndFix所有的api */public class AndFixPatchManager { private static AndFixPatchManager mInstance = null; private static PatchManager mPatchManager = null; public static AndFixPatchManager getInstance() { if (mInstance == null) { synchronized (AndFixPatchManager.class) { if (mInstance == null) { mInstance = new AndFixPatchManager(); } } } return mInstance; } //初始化AndFix方法 public void initPatch(Context context) { mPatchManager = new PatchManager(context); mPatchManager.init(Utils.getVersionName(context)); mPatchManager.loadPatch(); } //加载我们的patch文件 public void addPatch(String path) { try { if (mPatchManager != null) { mPatchManager.addPatch(path); } } catch (Exception e) { e.printStackTrace(); } }}
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); //完成andFix模块的初始化 initAndFix(); } private void initAndFix() { AndFixPatchManager.getInstance().initPatch(this); }}
/** * 获取应用程序versionname */ public static String getVersionName(Context context) { String versionName = "1.0.0"; try { PackageManager pm = context.getPackageManager(); PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0); versionName = pi.versionName; } catch (Exception e) { e.printStackTrace(); } return versionName; }
生成带bug的apk
安装一个有bug的旧的apk到手机
分析问题解决bug后,build一个新的apk
./gradlew assembleRelease
apatch文件生成
apkpatch下载
apkpatch命令及参数详解
./apkpatch.sh
提供两个包,生成.apatch文件
usage: apkpatch -f -t -o
合并多个.apatch文件
usage: apkpatch -m ...> -o
命令比较长,可以创建一个sh脚本。
patch文件安装
将apatch文件通过adb push到手机
使已经安装的应用load我们的apatch文件
load成功后验证bug是否修复了
adb push xx.apatch /storage/…
AndFix模块组件
组件化步骤:
- 发现bug生成apatch;
- 将patch下发到用户手机存储系统;
- 利用AndFix完成patch安装,解决bug。
时序图(OmniGraffle软件):
AndFix源码讲解
总结
AndFix原理及执行流程
AndFix集成及基本用法
AndFix组件化思路和实现
更多相关文章
- NPM 和webpack 的基础使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- Android制作并替换系统开机动画bootanimation.zip(需root)
- Android(安卓)Preference使用
- Java大文件上传(Android亦可)
- 【转】Android兼容性测试CTS --环境搭建、测试执行、结果分析
- Android: NDK编程入门笔记
- android中使用sqlite、复制assets下的数据库到SD卡、支持大于1M
- Android(安卓)Studio 模板(Template)定制