InstantRun 及Tinker原理

Instant Run

Instant Run 热部署,提升app安装部署的速度
首先要在android studio 设置中开启 Instant Run
Preferences -> Build,Execution,Deployment -> Instant Run

  1. tinker 会和instant Run 起冲突
  2. AndFix的实现与Instant Run的热插拔有点类似
    Alt text
加载补丁dex

Tinker采用的是下发差分包,然后在手机端合成全量的dex文件进行加载

工作流程
hook Classloader 在DexPathList 中dexElements数组中
插入dex,并且插入到最前面

加载补丁资源

Tinker的资源更新采用的InstantRun的资源补丁方式,全量替换资源
Tinker的这套方案虽然也采用全量的替换,但是在下发patch中依然采用差量资源的方式获取差分包,下发到手机后再合成全量的资源文件,有效的控制了补丁文件的大小。

  1. 修改变量属性,修改资源属性不需要重启Activity,修改方法内不需要重启Activity
  2. 新增类或者,新增资源属性需要重启Activity
  3. 新增属性需要重启Activity

简单来说,在编译时通过新旧两个Dex生成差异path.dex。在运行时,将差异patch.dex重新跟原始安装包的旧Dex还原为新的Dex。这个过程可能比较耗费时间与内存,所以我们是单独放在一个后台进程:patch中。为了补丁包尽量的小,微信自研了DexDiff算法,它深度利用Dex的格式来减少差异的大小。它的粒度是Dex格式的每一项,可以充分利用原本Dex的信息,而BsDiff的粒度是文件,AndFix/QZone的粒度为class。

热拔插

热拔插:代码改变被应用、投射到APP上,不需要重启应用,不需要重建当前activity。
场景:适用于多数的简单改变(包括一些方法实现的修改,或者变量值修改

温拔插

温拔插:activity需要被重启才能看到所需更改。
场景:典型的情况是代码修改涉及到了资源文件,即resources

冷拔插

冷拔插:app需要被重启(但是仍然不需要重新安装)
场景:任何涉及结构性变化的,比如:修改了继承规则、修改了方法签名等。

参考文章

Dexposed github (https://github.com/alibaba/dexposed)
AndFix github (https://github.com/alibaba/AndFix)
Nuwa github (https://github.com/jasonross/Nuwa)
QZone实现原理解析 (https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a)
Instant Run英文原文 (https://medium.com/google-developers/instant-run-how-does-it-work-294a1633367f#.c088qhdxu)
Instant Run工作原理及用法中文翻译稿 (http://www.jianshu.com/p/2e23ba9ff14b)
Buck exopackage 介绍 (https://buckbuild.com/article/exopackage.html)
各大热补丁方案分析和比较 (http://blog.zhaiyifan.cn/2015/11/20/HotPatchCompare/)

微信Android热补丁实践演进之路
(https://github.com/WeMobileDev/article/blob/master/%E5%BE%AE%E4%BF%A1Android%E7%83%AD%E8%A1%A5%E4%B8%81%E5%AE%9E%E8%B7%B5%E6%BC%94%E8%BF%9B%E4%B9%8B%E8%B7%AF.md)