背景说明
在业务开发过程中经常会进入一些三方sdk,这些三方的sdk引入so库,有些so库文件还比较大,这时候我们就需要考虑so库从网络获取异步加载,减少发布包的体积
传统方案
关于so异步加载方案,网上的资料随便搜下大把,核心思想
so库文件放到网络->下载到本地沙盒->通过System.load载入
看起来挺简单的 然而挺多资料没提到的是
so库存在依赖关系
比如当你把友链交易libunity.so下载下来通过
System.load("/data/data/com.example.soload/files/libunity.so")
加载的时候会得到如下异常
java.lang.UnsatisfiedLinkError: dlopen failed: library “libmain.so” not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1071)
at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
at java.lang.System.loadLibrary(System.java:1667)
解决方案
载入libunity.so之前需要先载入libmain.so
以上2个开源库 都有处理相关逻辑
核心思想就是解析so库ELF格式,分析依赖并递归,直到依赖库都加载完成再载入自身
这里不扩展开来 有兴趣的伙伴可以看源码研究下
text relocations问题
当你把liblbs.so下载下来通过
System.load("/data/data/com.example.soload/files/liblbs.so")的时候又出现意外了
java.lang.UnsatisfiedLinkError: dlopen f