前言:之前已经在文章中对Tinker的Dex热更新、资源热更新的源码做了分析,今天接着开始对Tinker的so热更新做源码的分析,废话不多说直接出发。
开始先回顾一下Android里面关于so的加载的两种方式:
- System.loadLibrary: 这种方式传入的是so的名字,会直接从系统的目录去加载so文件,系统的路径包括/data/data/${package_name}/lib、/system/lib、/vender/lib等这类路径。
- System.load:这种方式传入的是so的绝对路径,直接从这个路径加载so文件。
相对于Dex和资源的更新,so文件的更新简单很多,Tinker的so文件热更新的原理就是通过方式二,直接加载新的so实现的。
so文件的热更新流程同dex、资源文件一样,包含补丁生成,补丁合成,补丁加载三个部分。
生成补丁时比较新旧so文件使用BSdiff算法生成补丁包,然后在下发补丁成功后根据BSpatch算法将补丁包和旧的library合成新的library,
并将更新后的Library库文件保存在tinker下面的目录下,