Android 热修复基础篇(一),flutter 图片压缩
AndFix(已经没人用了)
==============
在 native 动态替换 java 层的方法,通过 native 层 hook java 层代码。
大致思路:
?伪代码如下:
?详细步骤:
补丁白的实质是 .dex 文件
具体的替换是用 c++ 实现的:AndFix/art_method_replace_4_4.cpp at master · alibaba/AndFix · GitHub
Robust
======
对每个函数都在编译打包阶段自动的插入了一段代码,类似于代理,将方法执行的代码重定向到其他方法中。
![](https://img-blog.csdnimg.cn/20210724212054613.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,
shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxODg1Njcz,size_16,color_FFFFFF,t_70)
缺点显而易见,apk 变大了。
伪代码理解
你自己写了一个类,如下:
经过 Robust,在编译期间改造后,如下:
打的补丁类,如下:
经过 类加载 和 反射 拿到 StatePatch 类,然后赋值给 State.changeQuickRedirect ,这样就成功的改变了代码执行路径了,赋值代码如下:
技术点:类加载 反射 字节码插桩?
Tinker
=======
Tinker 通过计算对比指定的 Base Apk 中的 dex 与修改后的 Apk 中的 dex 的区别,补丁包中的内容即为两者差分的描述。运行时将 Base Apk 中的 dex 与补丁包进行合成,重启后加载全新的合成后的 dex 文件。
补充:如何拿到 已安装 在手机中的 .dex 源文件呢?
ApplicationInfo applicationInfo = null;
try {
applicationInfo = getPackageManager().getApplicationInfo(getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
String dexPath = applicationInfo.sourceDir;
评论