写点什么

Android 热修复基础篇(一),flutter 图片压缩

用户头像
Android架构
关注
发布于: 刚刚

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,


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


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;

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android热修复基础篇(一),flutter图片压缩