android低版本so加载失败,Android 4.X 系统加载 so 失败的原因分析

Android 4.X 系统加载 so 失败的原因分析

1 so 加载过程

so 加载的过程可以参考小米的系统工程师的文章 loadLibrary 动态库加载过程分析

2 问题分析

2.1 问题

年前项目里新加了一个 so 库, 但发现 native 方法的找不到的 crash 好多, 好些都是报了

java.lang.unsatisfiedlinkerror native method not found

, 而且基本上是出现在 4.x 的系统里, 特别是 4.4,4.2 的系统在网络上搜索相关的可能导致到这个问题的原因:

so 文件没有在对应架构的目录里找到;

方法名有错误;

2.2 分析 1

我们最开始是怀疑应用在安装时没有正确解压出对应的 so 文件到相应目录, 因此加了相应统计来看发生 crash 的手机是否是因为找不到对应的 so 文件导致的; 但统计数据发现这些手机里都可以找到对应架构的 so 文件, 因此就排除了不存在 so 文件导致的 crash;

2.3 分析 2

我们同事以前有发现在 Android 4.x 系统里, 如果 so 文件是在应用启动时加载的, 但使用时机却在后面的时间点, so 加载进手机的内存可能会被系统由于资源紧张而回收掉, 这种情况下, 可以通过重新加载一次 so 文件来减少相关的 crash, 这种方法 fix 了某个量很高的 so 相关的 crash 但我们的 so 的 crash 明显是不属于这种情况的, 因为我们是通过 System.load() 方法加载完 so 文件后, 就调用相关的方法, 这时内存肯定是还在的在分析了一系列可能的原因后, 怀疑这个 crash 是因为应用安装时解压出来的 so 文件是损坏的, 因此我们尝试在第一次发生这个 crash 时, 将这个 crash catch 住, 然后在 catch 块将原来目录下的 so 文件删除掉, 并重新从应用的安装目录解压出对应的 so 文件放到原来的目录, 并加了相关的统计来验证 so 的加载用了 Relinkder 相关的简化版本代码如下:relinker.loadLibrary(getApplicationContext(),"so_name");

try{

// call native method

}catch(UnsatisfiedLinkErrore){

//some stats

Stringlibrary="so_name";

StringlibName=System.mapLibraryName(library);

FileworkaroundLibDir=getApplicationContext().getDir("lib",Context.MODE_PRIVATE);

FileworkaroundLibFile=newFile(workaroundLibDir,libName);

workaroundLibFile.delete();

apkLibraryInstaller.installLibrary(

getApplicationContext()

,supportedAbis()

,libName

,workaroundLibFile

,relinker

);

System.load(workaroundLibFile.getAbsolutePath());

//call native method

// some stats

}

2.4 分析 3

在使用的 2.3 的解决方法后, 我们的 so 的

java.lang.unsatisfiedlinkerror native method not found

大部分消失了理论上使用过一次重新解压 so 文件后, 这个用户在下一次升级前都应该不会再发生了类似的 crash 了, 但我们的统计数据发现, 有些用户每一次启动都需要进入 catch 块来避免 crash, 而每次都可以通过 reload 来正常使用我们的应用, 这至今还是个迷, 还没有想明白是什么情况会导致这个问题? 手机的存储有问题? 但其他的 so 又没有这个问题希望如果有同行解决过类似的问题的, 指点一下

3 总结

Android 4.X 系统加载 so 后, 出现

java.lang.unsatisfiedlinkerror native method not found

的 crash 的原因除了网上所说的 不存在这个 so 和 方法名有问题 (商用的应用应该不会有这个问题的) 外, 还有两个原因:

so 加载进系统的内存被系统由于资紧张而回收了, 这种情况下直接再 load 一下 so 文件就可以解决大部分;

so 文件有问题, 这种情况下, 可以通过重新从应用安装目录解压出对应的 so 文件并重新加载来解决大部分;

这两种方法不能保证可以 100% 解决问题, 但可以减少大部分问题(90%);

来源: http://www.bubuko.com/infodetail-2506363.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值