Android 微信热补丁Tinker -- 补丁流程

本文详细介绍了Android微信热补丁Tinker的补丁流程,包括补丁合成、加载和校验等关键步骤。通过源码跟踪,揭示了Tinker在安全校验、版本管理和加载过程中的实现细节,帮助开发者理解其设计理念。
摘要由CSDN通过智能技术生成

作为开发人员,会用别人的框架是远远不够的,我们可以学习别人的设计思想、实验原理,积累知识,才能不断提升自己。今天这一章主要给大家介绍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方法:


                
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值