五分钟学会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的时候的工程 签名打版
修复bug后工程 再打版 和直接用上面的
4.制作补丁
然后要用到一个生成补丁的工具apkpatch
解压
_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
每个参数含义如下
-f 新版本的apk
-t 旧版本的apk
-o 输出apatch文件的文件夹,可以随意命名
-k 打包的keystore文件名
-p keystore的密码
-a keystore 用户别名
-e keystore 用户别名的密码
如果出现add modified …….就表示成功了 hotcc 目录就生成了文件
将.apatch后缀的那个文件改为Dennis.apatch(因为我们项目中设置是这个名字,保持一致)
5.实现效果
放到手机中安装好了AndFixDemo.apk,点击按钮会弹出 bug来啊
再把Dennis.apatch放到根目录下(项目中设置的是根目录 项目中根据实际情况放相应的路径)。
退出应用 进去点击 按钮会提示 哈哈哈---- 其实这次才是真正的修复Bug了(因为修复放在Application中在 启动时会执行onCreate()所以要进,实际项目中 根据具体情况来放置)