- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
代码比较简单,可以分三部分理解:
我们看一眼模板文件:
package %PACKAGE%;import com.tencent.tinker.loader.app.TinkerApplication;/**** Generated application for tinker life cycle**/public class %APPLICATION% extends TinkerApplication {public %APPLICATION%() {super(%TINKER_FLAGS%, "%APPLICATION_LIFE_CYCLE%", "%TINKER_LOADER_CLASS%", %TINKER_LOAD_VERIFY_FLAG%);}}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
对应我们的,
@DefaultLifeCycle(application = ".SimpleTinkerInApplication",flags = ShareConstants.TINKER_ENABLE_ALL,loadVerifyFlag = false)public class SimpleTinkerInApplicationLike extends ApplicationLike {}
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
主要就几个占位符:
于是最终生成的代码为:
/**** Generated application for tinker life cycle**/public class SimpleTinkerInApplication extends TinkerApplication {public SimpleTinkerInApplication() {super(7, "com.zhy.tinkersimplein.SimpleTinkerInApplicationLike", "com.tencent.tinker.loader.TinkerLoader", false);}}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这么做的目的,文档上是这么说的:
为了减少错误的出现,推荐使用生成类 。
这样大致了解了是如何生成的 。
接下来我们大致看一下的原理 。
四、原理
文章插图
来源于:
贴了一张大致的原理图 。
可以看出:
将old.apk和new.apk做了diff,拿到patch.dex,然后将patch.dex与本机中apk的.dex做了合并,生成新的.dex,运行时通过反射将合并后的dex文件放置在加载的数组的前面 。
运行时替代的原理,其实和Qzone的方案差不多,都是去反射修改 。
两者的差异是:Qzone是直接将patch.dex插到数组的前面;而是将patch.dex与app中的.dex合并后的全量dex插在数组的前面 。- HA Keepalived案例一:Keepalived双机热备精讲
- 2023年小暑热吗
- 十 LiveVideoStackCon讲师热身分享 —— “新潮”AI硬
- CSZ CMS 1.2.7 用户私信XSS漏洞复现+审计+修复建议
- Ubuntu 18.04.5 LTS 引导修复
- NOIP2017列队
- 【Python爬虫】CSDN热榜文章热门词汇分析
- 韩国进口方便面煮面三养火鸡面热干拌面要怎么吃
- amd积热是什么意思
- ipc开头的热点是啥