作为开发人员,会用别人的框架是远远不够的,我们可以学习别人的设计思想、实验原理,积累知识,才能不断提升自己。今天这一章主要给大家介绍Tinker补丁流程,深入到代码中去探索Tinker。
补丁流程
在文章[Android热补丁方案][7]中介绍了Tinker的原理框架,那里只是简单介绍一下Tinker框架的补丁流程,这里我重新整理了一份Tinker补丁流程:
上面的流程图中,已经把Tinker的补丁流程和集成Tinker需要注意的逻辑都已经表示的很清楚了。需要注意的地方就是需要开发者自己编写下载过程,然后调用Tinker的Api传入补丁,以及补丁成功后重启应用的逻辑,这个开发者需要结合自己项目的需求来制定,我自己项目里面是通过熄屏监听来杀掉应用进程,进行重启。
在合成补丁流程中,总结了以下几点最重要的部分:
- 安全校验: 无论在补丁合成还是加载,我们都需要有必要的安全校验。
- 版本管理: Tinker 支持补丁升级,甚至是多个补丁不停的切换。这里我们需要保证所有进程版本的一致性;
- 补丁加载: 如果通过反射系统加载我们合成好的 dex,so 与资源;
- 补丁合成: 这些都在单独的 patch 进程工作,这里包括 dex,so 还有资源,主要完成补丁包的合成以及升级;
- 监控回调: 在合成与加载过程中,出现问题及时回调;
经过源码分析,总结出了以下Tinker补丁流程图(上图虚线部分):
以上图片中,标出了加载流程以及它实现的类和方法,本章也是主要着重这个流程分析。
源码跟踪
###一、收到补丁
当补丁下载完成后,即调用下面的函数开始补丁:
/**
* new patch file to install, try install them with :patch process
*
* @param context
* @param patchLocation
*/
public static void onReceiveUpgradePatch(Context context, String patchLocation) {
Tinker.with(context).getPatchListener().onPatchReceived(patchLocation, true);
}
此时的Tinker已经被初始化,在ApplicationLike中调用:
TinkerManager.installTinker(this);
初始化的函数:
/**
* install tinker with custom config, you must install tinker before you use their api
* or you can just use {@link TinkerApplicationHelper}'s api
*
* @param applicationLike
* @param loadReporter
* @param patchReporter
* @param listener
* @param resultServiceClass
* @param upgradePatchProcessor
* @param repairPatchProcessor
*/
public static void install(ApplicationLike applicationLike, LoadReporter loadReporter, PatchReporter patchReporter,
PatchListener listener, Class<? extends AbstractResultService> resultServiceClass,
AbstractPatch upgradePatchProcessor, AbstractPatch repairPatchProcessor) {
Tinker tinker = new Tinker.Builder(applicationLike.getApplication())
.tinkerFlags(applicationLike.getTinkerFlags())
.loadReport(loadReporter)
.listener(listener)
.patchReporter(patchReporter)
.tinkerLoadVerifyFlag(applicationLike.getTinkerLoadVerifyFlag()).build();
Tinker.create(tinker);
tinker.install(applicationLike.getTinkerResultIntent(), resultServiceClass, upgradePatchProcessor, repairPatchProcessor);
}
传入的参数有:
- ApplicationLike:应用的代理application
- LoadReporter:加载合成的包的报告类
- PatchReporter:打修复包过程中的报告类
- PatchListener:对修复包最开始的检查
- ResultService:从合成进程取合成结果监听
- UpgradePatchProcessor:生成一个新的patch合成包
- ReparePatchProcessor:修复上一次合成失败的修复包
看一下Tinker中核心的install方法: