美文网首页
so动态加载

so动态加载

作者: couriravant | 来源:发表于2023-04-24 20:49 被阅读0次

so文件较多占比较大的时候,一般可以采用动态加载so文件,减小包体积大小

我们知道本地加载so文件,需要把so放到固定的目录下,使用时通过System.loadLibrary("myso");来加载。

image.png

如果我们通过网络下载得到的so文件,直接使用System.loadLibrary("myso")会发现报错,因为ClassLoader 的 nativeLibraryDirectories 里并没有“myso”的对应的路径。
这个nativeLibraryDirectories是在app启动时,在ActivityThread中初始化pathClassloader时,把so文件的目录遍历路径放到了nativeLibraryDirectories中(还有一个pathlist,存放了dex文件的路径,可以替换用来实现热修复),但是动态加载的so并不在app的so路径里,所以会报错。(Android Framework 会遍历当前上下文的 ClassLoader 实例里的 nativeLibraryDirectories 数组,在数组里所有的文件路径下查找文件名为 libxxx.so 的文件)
所以我们需要通过反射来动态替换掉这个nativeLibraryDirectories,插入新下载so的路径。

不同的系统版本实现细节不同,可以参考tinker中的相关逻辑来适配。

当然加载so文件还有一种方式,那就是通过System.load("/path/to/libmyso.so"); 这个方法可以直接传入路径来加载,但是会有些不合适:
1.调试阶段会有麻烦(需要不断修改加载方式)

  1. 对第三方sdk中通过System.loadLibrary()来加载so的方式也不能兼容
  2. 加载路径也有权限限制
    所以最好的方案还是通过nativeLibraryDirectories来实现。
    refer:
    https://blog.csdn.net/c6E5UlI1N/article/details/125650241
    https://cloud.tencent.com/developer/article/1592672

相关文章

网友评论

      本文标题:so动态加载

      本文链接:https://www.haomeiwen.com/subject/xgkyrdtx.html