Tinker 处理patch流程
按推荐方式使用编译注解生成Application
1. Application 加载已合成的patch
- 加载patch 入口从注册的Application的onBaseContextAttached()开始
loadTinker()方法即是tinker 加载patch的逻辑,之后调用代理ApplicationLike的原有逻辑,方便修改
- 反射生成TinkerLoader 实例,调用tryLoad()方法
- 经过一连串调用链:各种校验,检查dex,根据不同的系统版本,去反射处理dexElements,合并patch数组,设置给pathList。
2. 根据补丁合成完整Patch,以便重启加载
- 入口,一句代码:
TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed.apk");
- 默认调用Tinker的DefaultPatchListener中的onPatchReceived方法(可以自定义),启动一个IntentService——TinkerPatchService
- TinkerPatchService处理patch文件,拷贝到私有目录,dexdiff合并dex,patch合并完成等待重启加载