Android 热修复

应用场景

  • 刚发布的版本出现了严重的Bug,这就需要去解决Bug、测试并打包在各个应用市场上重新发布,

    这会耗费大量的人力和物力,代价会比较大。

  • 版本升级率不高,并且需要很长时间来完成版本覆盖,此前版本的Bug就会一直影响不升级版本的用户。

​ 热修复可以在不重装的情况下,替换某些模块

代码修复

类加载(重启App)

基于 Dex 分包方案,其中一个环节就是调用DexPathList的findClass的方法

Element内部封装了DexFile,DexFile用于加载dex文件,因此每个dex文件对应一个Element。

多个Element组成了有序的Element数组dexElements。

把需要替换的Element封装类放到前面,提前被搜索到即可

底层替换

与类加载方案不同的是,底层替换方案不会再次加载新类,而是直接在Native层修改原有类,底层替换方案和反射的原理有些关联

通过执行入口就可以跳过去执行show方法。替换ArtMethod结构体中的字段或者替换整个ArtMethod结构体,这就是底层替换方案

Instant Run

Instant Run在第一次构建APK时,使用ASM在每一个方法中注入了一段代码,(未完待续)

资源修复

Instant Run

一种运行机制,只构建和部署更改的部分,Instant Run部署有三种方式,

Hot swap:代码的增量改变不需要重启App,甚至不需要重启当前的Activity。修改一个现有方法中的代码时会采用Hot Swap。

Warm Swap:App不需重启,但是Activity需要重启。修改或删除一个现有的资源文件时会采用Warm Swap。

Cold Swap:App需要重启,但是不需要重新安装。比如添加、删除或修改一个字段和方法、添加一个类等。

(1)创建新的AssetManager,通过反射调用addAssetPath方法加载外部的资源,这样新创建的AssetManager就含有了外部资源。

(2)将AssetManager类型的mAssets字段的引用全部替换为新创建的AssetManager。

动态链接库修复(SO)

Android平台的动态链接库主要指的是so库。

热修复框架的so的修复的主要是更新so,换句话说就是重新加载so,因此so的修复的基础原理就是加载so。

加载so主要用到了System类的load和loadLibarary方法

(1)将so补丁插入到NativeLibraryElement数组的前部,让so补丁的路径先被返回和加载。

(2)调用System的load方法来接管so的加载入口。

原文地址:https://www.cnblogs.com/lukelmouse/p/14521502.html