Android热修复之 - 阿里开源的热补丁
1.1 基本介绍
我们先去github上面了解它https://github.com/alibaba/AndFix
请原谅我的盗图行为,英文解释我就不贴了我自己也看不懂,大致的意思的就是要想尽一切办法给导致我们崩溃的那个类的某个方法去动手术把它弄好,而这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的。
1.2 生成apatch包
假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有一个新的的apk我们就叫它为new.apk,原来的那个有Bug的apk你也有我们就叫它old.apk。这个时候我们就可以利用阿里github上面提供的工具生成一个xxxx.apatch包用于修复Bug。
命令是:apkpatch.bat -f <new> -t <old> -o <output> -k <keystore> -p <> -a <alias> -e <>
-f : 没有Bug的新版本apk
-t : 有bug的旧版本apk
-o : 生成的补丁文件所放的文件夹
-k : 签名打包密钥
-p : 签名打包密钥密码
-a : 签名密钥别名
-e : 签名别名密码(这样一般和密钥密码一致)
我的是这样子:
apkpatch.bat -f new.apk -t old.apk -o out -k joke.jks -p 240336124 -a 内涵段子 -e 240336124
1.3 修复apatch包
怎么获取apatch包呢?我们肯定是请求接口获取下载我们的修复好的apatch包,当然有可能没有就太好了佛祖保佑。下载下来之后我们就可以调用方法进行修复了,我们可以暂时放在本地测试一下,这些代码肯定之前就得写好:
public class BaseApplication extends Application { // Patch管理类 public static PatchManager mPatchManager; @Override public void onCreate() { super.onCreate(); // 捕捉崩溃信息 ExceptionCrashHandler.getInstance().init(this); // Ali热修复 try { mPatchManager = new PatchManager(this); // 初始化patch版本 String pkName = this.getPackageName(); String versionName = getPackageManager().getPackageInfo(pkName, ).versionName; // 初始化版本名称 mPatchManager.init(versionName); // 加载之前的patch mPatchManager.loadPatch(); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } }
主页面MainActivity
public class MainActivity extends BaseSkinActivity { @Override protected void initData() { // 获取上次的崩溃信息 File crashFile = ExceptionCrashHandler.getInstance().getCrashFile(); // 上传到服务器,后面再说....... } @Override protected void initView() { } @Override protected void setContentView() { setContentView(R.layout.activity_main); } @Override protected void initTitle() { } @Onclick(R.id.test) public void test(View view) { // 没有修复之前会报异常闪退 Toast.makeText(this, Utils.test(), Toast.LENGTH_LONG).show(); } @Onclick(R.id.ali_fix) public void aliHotFix(View view) { try { // 测试 目前暂且放在本地 String patchFileString = Environment.getExternalStorageDirectory()+"/fix.apatch"; Log.e("TAG", patchFileString); // 修复apatch,不需要重启可立即生效 BaseApplication.mPatchManager.addPatch(patchFileString); Toast.makeText(this, "Bug修复成功", Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "Bug修复失败", Toast.LENGTH_LONG).show(); } } }
运行的效果就在最上面,如果直接点击测试会报异常闪退,当我们点击完阿里开源热修复后再次点击测试,发现不闪退了。接下来的内容你可能要看不懂了请做好准备。