五分钟学会Android热修复

近几年来 热修复炒的比较火热,因为它能及时修复应用上线后出现的bug。其实热修复不难,今天就带着看家来看下如何来耍一遍


现在流行的热修复工具比较多,主要是腾讯和阿里的,


但是归根到底其实主要就是2种思想

1.简单说就是通过反射机制得到旧方法的指针 新方法指向目标方法,实现方法替换,在执行的时候修复后的方法了。阿里的AndFix 用的就是这种思想 如AndFix


2.这种通过将新dex插入到dex之前替换旧类实现。因为在Dalvik虚拟机加载类的过程中会顺序遍历所有的dex文件, 查找每个dex文件中类。如果找到就返回,没有找到就找下一个,如果有相同多个dex文件中有相同的类,理论上会优先选择前面的。

该种方式 需要重启后才能修复 如Nuwa


两种方式思想上主要区别一个是方法替换,一个是类的替换



废话不多说先上实战 我这里使用阿里的AndFix

1.新建项目 导入依赖


2.新建一个MyApplication继承Application 

就三步
public void onCreate() {
super.onCreate();
//1. 初始化
mPatchManager = new PatchManager(this);
mPatchManager.init("1.0"); // 版本号

// 2.加载 apatch
mPatchManager.loadPatch();

//apatch文件的目录
 String patchFileString = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
File apatchPath = new File(patchFileString);
if (apatchPath.exists()) {
Log.i(TAG, "补丁文件存在");
try {
//3.添加apatch文件
mPatchManager.addPatch(patchFileString);

} catch (IOException e) {
Log.i(TAG, "打补丁出错了");
e.printStackTrace();
}
} else {
Log.i(TAG, "补丁文件不存在");

}
}


3.签名打版

有bug的时候的工程 签名打版

五分钟学会Android热修复


修复bug后工程 再打版 和直接用上面的

五分钟学会Android热修复


五分钟学会Android热修复



4.制作补丁 

然后要用到一个生成补丁的工具apkpatch

解压

五分钟学会Android热修复

_MACOSX是给OSX系统用的     .bat是给window系统用的

把之前生成的AndFixDemo.apk和newAndFixDemo.apk ,还有打包所使用的keystore文件放到apkpatch-1.0.3目录下 
打开cmd,进入到apkpatch-1.0.3目录下,输入如下指令

apkpatch.bat -f newAndFixDemo.apk -t AndFixDemo.apk -o hotcc -k hotkeystore -p 123456 -a hothot -e 123456

五分钟学会Android热修复



每个参数含义如下

-f 新版本的apk 

-t 旧版本的apk 
-o 输出apatch文件的文件夹,可以随意命名 
-k 打包的keystore文件名 
-p keystore的密码 
-a keystore 用户别名 
-e keystore 用户别名的密码

五分钟学会Android热修复

如果出现add modified …….就表示成功了 hotcc 目录就生成了文件

.apatch后缀的那个文件改为Dennis.apatch(因为我们项目中设置是这个名字,保持一致)

5.实现效果

放到手机中安装好了AndFixDemo.apk,点击按钮会弹出 bug来啊

再把Dennis.apatch放到根目录下(项目中设置的是根目录 项目中根据实际情况放相应的路径)。

退出应用 进去点击 按钮会提示 哈哈哈---- 其实这次才是真正的修复Bug了(因为修复放在Application中在 启动时会执行onCreate()所以要进,实际项目中 根据具体情况来放置)