文档章节

完美解决加载SO库UnsatisfiedLinkError的错误

网易云捕
 网易云捕
发布于 2016/04/18 19:16
字数 909
阅读 535
收藏 17

Android 应用开发者应该对 UnsatisfiedLinkError 这种类型的错误比较熟悉了,这个问题一直困扰着广大的开发者,那么有没有想过有可能你什么都没做错,也会出现这个问题呢?

我们在 Android 应用开发测试过程中曾经碰到过这样的案例,apk 在某机型上安装完成之后运行即崩溃,报错 UnsatisfiedLinkError。


java.lang.UnsatisfiedLinkError: Couldn’t load mobsec from loader dalvik.system.PathClassLoader.....findLibrary returned null


首先怀疑是在 apk 中相应的 libs\abi 目录下没有放置 libmobsec.so,然而检查发现这个 so 在所有的 libs\abi 下都有放置过,继续排查;

然后的想法是放置的 so 不是对应 abi 的,比如由于粗心在 armeabi 目录下放置了 x86 指令集的 so,导致在 armeabi 指令集手机上加载出错,这个也被排除掉;

就在没有头绪的时候,想到 System.loadLibrary 函数加载 so 时,系统是从指定的路径下加载的,那么这个路径下 so 是否存在呢?

我们知道应用的私有 Native library 目录 /data/data/packagename/lib 是一个符号链接,链接到 /data/app-lib/<package name> 目录,System.loadLibrary 是到这个目录去尝试加载 so 的。

adb shell 到这个路径下,使用命令 ls 查看,果然这个 libmobsec.so 是不存在的。那么是什么原因导致的呢?

分析 Android 系统源码的实现,发现 /data/app-lib/<package name> 这个目录下的 so ,是在系统安装 apk 时从 apk 的 lib 目录下去抽取的。

在安装 app 时,Android package manager 代码需要分析当前手机支持的指令集并拷贝相关指令集的 so。从 Android2.X 到 Android6.0 系统,由于相继加入了 x86、64位等指令集的支持,这一部分代码处理逻辑有不少变动,然而这个代码是存在逻辑缺陷的,存在遗漏拷贝的可能,导致在一些机型上并不一定保证所有的 so 都能被正确抽取到 /data/app-lib/<package name> 目录下,从而导致应用在加载 so 的时候出现 UnsatisfiedLinkError 这样的错误。

已经有开发者意识到这个 bug,比如在 Chromium 的源代码的一段注释,说明了 Android package manager 中的问题:


                    * PackageManager may fail to update shared library.
                    *
                    * Native library directory in an updated package is a symbolic link
                    * to a directory in /data/app-lib/<package name>, for example:
                    * /data/data/com.android.chrome/lib -> /data/app-lib/com.android.chrome[-1].
                    * When updating the application, the PackageManager create a new directory,
                    * e.g., /data/app-lib/com.android.chrome-2, and remove the old symlink and
                    * recreate one to the new directory. However, on some devices (e.g. Sony Xperia),
                    * the symlink was updated, but fails to extract new native libraries from
                    * the new apk.


在 Android 平台上加载本地库的危险性”这篇文章中提到了作者遇到同样的问题,并基于 Chromium 给出的一种权宜的解决办法:封装 System.loadLibrary 接口为 ReLinker 接口,如果发现无法正常加载 so,则获取 apk 路径并解压相应指令集的 so,然后尝试去加载。这种方案经过验证是可以显著减少 UnsatisfiedLinkError 错误的出现,下图为作者使用了 ReLinker 接口后的日上报 UnsatisfiedLinkError 错误数的变化趋势图。

ReLinker 接口现在已经集成到网易云捕的SDK中,使用方法如下:

ReLinker.loadLibrary(context, “mylibrary”);

来代替

System.loadLibrary(“mylibrary”);


文章转载自 网易云捕技术博客,原文查看请戳这里。

© 著作权归作者所有

网易云捕
粉丝 9
博文 9
码字总数 12305
作品 0
杭州
私信 提问
加载中

评论(3)

今生
今生
try..catch到UnsatisfiedLinkError再手动加载so的思路不错..
d
deffing
So加载问题太蛋疼了,我们产品之前用Bugly搜集崩溃的,UnsatisfiedLinkError出现过好多次,虽然找到两台机子复现但就是没显示具体原因,现在已经在尝试这个了,其中一台是可以用的,希望能解决这类问题。
runing4life
runing4life
赞,这个问题开发中遇到过,很蛋疼
java.lang.UnsatisfiedLinkError和text relocations错误

这两天被2个System.loadLibrary异常给整懵了,后来Google了一圈,总算找到解决办法,先说下现象: 同样的so(存放路径都一样,如jniLibs/armeabi-v7a),不同的Project,在Android 4.4(可能是因...

山里来的鱼
2016/05/04
1K
0
关于Android Studio UnsatisfiedLinkError错误的解决办法

转载自:https://blog.csdn.net/yang451212/article/details/78327900 (一)Android Studio UnsatisfiedLinkError错误的解决办法 1:当程序报错: Caused by: java.lang.UnsatisfiedLinkEr......

犀牛有脾气
2018/11/27
0
0
android ndk程序UnsatisfiedLinkError解决方案

这个问题会出现两种情况。 第一种是UnsatisfiedlinkError:dll名称。说明dll没有放到合适的位置。对于Android开发,我们一般把so放在libs目录下,但是还是会出现这个错误。根本原因System.lo...

长平狐
2012/08/28
167
0
/usr/lib/jvm/jdk1.8.0_112/jre/lib/amd64/libawt_xawt.so: libXrender.so.1: cannot open shared object

问题:点击这里 具体错误: Caused by: java.lang.UnsatisfiedLinkError: /usr/lib/jvm/jdk1.8.0112/jre/lib/amd64/libawtxawt.so: libXrender.so.1: cannot open shared object file: No s......

楠木楠
2016/12/21
1K
0
android导入so库的小问题

今天android项目中,使用了讯飞的语音合成库,运行时初始化失败,异常信息 java.lang.UnsatisfiedLinkError: dlopen failed:.......ELF...found 0 bytes. 一开始以为是编译时候没搞进去so库,...

青春不再
2016/06/06
149
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
10
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
23
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部