Android 热修复基础篇(一),flutter 图片压缩
AndFix(已经没人用了)
==============
在 native 动态替换 java 层的方法,通过 native 层 hook java 层代码。
大致思路:

?伪代码如下:

?详细步骤:
补丁白的实质是 .dex 文件

具体的替换是用 c++ 实现的:AndFix/art_method_replace_4_4.cpp at master · alibaba/AndFix · GitHub
Robust
======
对每个函数都在编译打包阶段自动的插入了一段代码,类似于代理,将方法执行的代码重定向到其他方法中。

缺点显而易见,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;
评论