作为源码分析的第一篇文章,我们先从一个相对简单的开源库开始:Relinker。这库由来已久了,github也有1000+的star。我在工作中虽然有用到这个库,却一直没仔细看过源码,今天我们就来分析一下。
开始之前先来讲讲背景。
开发中我们常常会遇到这样的异常:java.lang.UnsatisfiedLinkError: Couldn’t load xxxx from loader dalvik.system.PathClassLoader。我们都知道这表示App没有找到对应的so。
有一种情况,为了减小包体积,我们通常只保留arm架构的so,而删除x86、mips等平台的so。这样就导致有些手机上会报找不到so的情况。这样的问题我们可以通过查看手机的CPU架构来辨别。而对于arm架构的手机,也会存在找不到so的情况。这又是因为什么原因呢?
从网上找到的一些文章来看,找不到so的一部分原因可能是由于PackageManager安装包的时候出错了。Relinker就是为了处理这种情况。它的整体思路其实很简单,先尝试使用系统原生方式去加载so,如果加载失败,Relinker会尝试从apk中拷贝so到App沙箱目录下,然后再去尝试加载so。最终,我们可以使用 ReLinker.loadLibrary(context, “mylibrary”) 来代替原生的加载方式System.loadLibrary(“mylibrary”)。
下面就来具体分析一下Relinker的代码。
Relinker库的代码结构如下图(确实非常简单~~)