-
-
[原创]Xposed高级用法 实现Tinker热修复
-
发表于:
2019-11-18 16:36
9384
-
[原创]Xposed高级用法 实现Tinker热修复
Hi ,大家好 我是珍惜
给大家简单 介绍一下 如何用Xposed 实现 对某个类的 替换 覆盖
在不编译源码的情况 直接修改 原Class 内容
(之前的这篇帖子 也不错 xposed实现 Native层 Hook
当我们 在 findClas的时候 其实 我们最终都会去 dexElements数组里面 去寻找 我们需要的类
路径 为 :
ClassLoder.java->
BaseDexClassLoader.java->
DexPathList.java->
dexElements
这个寻找其实是 遍历 如下图
也就是说 我们只需要 我们想加载的 类 放在前面 在通过 反射 set 即可 做到 热修复
腾讯的 Tinker其实大概原理也是这样 阿里的是 动态修改 了 insns数组 直接修改 某个方法的字节码
这也是 热修复 分为冷插拔 和热插拔的 区分 (是否需要 二次启动 )
后面会详细 跟大家说 具体 原因
下面给大家 简单复现一下流程
很简单 当我点按钮的时候 会进行Testclass的 获取 会进行遍历 elements数组 生成这个类
调用方法 以后 肯定会崩掉 这种情况 xposed无论如何Hook都 很无力 (可以Try)
我们先首先生成一份正确的 dex 如下图
可以看到 在 Test函数 里面 我已经将 原来的异常 换成 Log 打印
xposed模块里面 写 先Hook attach拿到 对方进程的 classloader
在 attach 执行完毕 里面 进行 修复 因为这个时候 dex已经 加载完毕了 直接进行修复即可
(需要提前开启 被修复 app的 sd卡读写权限 因为 我是用对方的进程去读写 sd卡 内容的 )
在HookMain里面 进行 class的 初始化 拿到 每个 classloader里面的 element数组
然后进行合并 详细 功能 可以看一下 注释
将生成的dex放到 sd/dex/目录下面
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课