Tinker 资源修复
资源修复的原理参考了 Instant Run warm swap 的技术方案:
构建一个新的AssertManager,通过反射调用它的addAssetPath方法把新push到设备上的改动资源的路径加进去,然后还是通过反射把当前所有使用中的AssertManager替换成这个新的,再重启就能找到修改后的资源
资源的diff
资源的 diff 在 ResDiffDecoder.java 中完成:
|
|
|
|
总结一下上面的 diff 过程,遍历新包和老包中的资源文件列表,将新增文件、删除文件、修改的文件分别保存到对应集合中,并且将信息写入日志文件。
资源的合并
差分包的合成是在 UpgradePatch.java 的 tryPatch 方法中完成的。该方法中调用了 tryRecoverResourceFiles 方法来完成资源的合并 :
|
|
tryRecoverResourceFiles -> patchResourceExtractViaResourceDiff -> extractResourceDiffInternals:
|
|
资源的加载
Tinker 加载资源是在 TinkerResourceLoader 类的 loadTinkerResources 方法:
|
|
接着看 monkeyPatchExistingResources 方法:
|
|
Tinker的方案虽然采用全量的替换,但是在下发patch中依然采用差量资源的方式获取差分包,下发到手机后再合成全量的资源文件,有效的控制了补丁文件的大小。
参考链接: 深入理解Instant Run——原理篇