tinker热修复

Tinker的集成总结:首先在我们的gradle文件中去配置一个注解库,一个核心的SDK库,有了这两个库,我们还需要定义一个Tinkmanager对tinker API层做一层封装。有了这个Tinkmanager以后,我们第三步定义了一个CustomTinkerLike,这个对象继承于ApplicationLinke,在这个类中完成tinker的初始化,而为什么需要这个ApplicationLike对象呢?因为它是一个委托类,tinker内部会在这个类中通过对application对象生命周期鉴定来完成 各种复杂的初始化工作。通过注解可以帮我们生成MyTinkerApplication类,就是整个应用的入口,后续我们的应用所有初始化工作就可以在MyTinkerApplication完成。

然后当产生bug时,如何生成patch文件?

Patch文件生成方式有两种:

第一种:命令行工具方式

第二种:tinker在gradle脚本中的配置所有tinker相关参数

首先我们将tinker相关的过程都放到一个开关语句块中,通过if判断我们可以轻松的通过改变变量值来决定本次编译是否采用tinker。

如果启用了tinker,我们首先导入tinker.patch给我们提供的这个包。

导入这个包以后我们就可以指定这些tinkerpath的所有参数配置,在tinker path中我们首先定义了几个基础配置。包括:我们的old apk,是否使用签名,是否启动tinker等等,在配置了这几个必须的变量以后,我们就分模块配置。

第一个配置buildConfig模块。指定了我们patch文件生成必须要使用的一些基础文件。包括我们基准apk打包的混淆路径,基准apk文件的资源路径,以及我们的tinker ID。

第二个配置dex模块。指定dex文件操作模式;指定dex文件目录;指定加载patch文件时用到的类;

第三个配置lib模块。指定so文件在我们整个工程中的路径。

第四个配置res模块。指定tinker可以修改的资源路径。指定不受影响的资源路径。

第四个配置packageConfig模块。通常会指定patchmessage来标明我们patch文件干了些什么,及当前patch它的一个版本号。

执行过程如上所示。

 

对文件的处理流程:在UpdataGradPatch中,它有一个调用,他会调用DexDiffPatchIntenal.tryRecoverDexFiles这个方法去完成我们dex文件的修改,在经过几个方法的嵌套后最终传到DexPatchApplier,真正的去创建每个字段的算法,然后通过这个算法去修改我们dex文件中每个区段的偏移量,这样就将我们dex文件中的数据真正的写入到我们那个apk文件中的。

 

发布了36 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/j18874964028sss/article/details/78534455