精神哥讲Crash(一):UnsatisfiedLinkError

大家好,我是腾讯Bugly的精神哥(英文名:spirit),是Bugly资深码奴的同时,又是Bugly神秘的Crash实验室研究员哦!我的主要任务就是泡在实验室里,嗑着瓜子嚼着鸡爪,研究移动App中各种Crash(专挑疑难、坑爹、时髦、有趣的Crash),并通过“精神哥讲Crash”系列定期分享给大家!

今天精神哥给大家分享的第一个Crash是“UnsatisfiedLinkError” 。

一、UnsatisfiedLinkError基本介绍

全名

java.lang.UnsatisfiedLinkError

官方解释

Throw if the java Virtural Machine cannot find an appropriate native-language definition of method declared native意思就是JVM找不到native method的native实现!

影响力排名

出错量排名第16位

精神哥点评

抛出这异常,肯定是你加载SO的姿势不对!

现在App很多功能都是通过集成第三方工具实现的,第三方工具很有可能在SO动态库里实现核心功能(Bugly提供的libBugly.so,能捕获这类C/C++异常!),所以就算你不用NDK开发也一定会跟SO打交道,你确定你加载SO的姿势都对了吗?

二、错误场景分析

1、低级错误——根本木有SO,你加载个球啊!

code

System.loadLibrary(Bugly);

libs

运行设备

Android ARM设备

运行结果

Crash!java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.tencent.bugly.demo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /systemb]]] couldn't find "libBugly.so"

原因分析

apk安装时,系统会把apk中libs目录下armeabi的SO拷贝到应用的私有目录下。所以libs里没有放入SO,运行时肯定找不到SO。

修复方式

添加SO:libs\armeabi\libBugly.so或加载代码注释掉://System.loadLibrary(Bugly) ;

2、进阶错误——根本木有X86的SO,在X86的设备上你加载个球啊!

code

System.loadLibrary(Bugly);

libs

libs\armeabi\libBugly.so

运行设备

Android X86设备

运行结果

Crash!java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.tencent.bugly.demo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /systemb]]] couldn't find "libBugly.so"

原因分析

apk安装时,x86设备上系统会把apk中libs目录下x86的SO,拷贝到应用的私有目录下。虽然libs下有armeabi的SO,但没有放入x86的SO,运行时还是找不到libbugly.so。

修复方式

添加SO:libs\armeabi\libBugly.so或加载代码注释掉://System.loadLibrary(Bugly) ;

3、大坑——尼玛,好难发现!

code

if(getArch().contain(“arm”)){ //只在arm下加载 System.loadLibrary(Bugly) ; System.loadLibrary(Bugly2);}

libs

libs\armeabi\libBugly.so libs\armeabi\libBugly2.solibs\armeabi-v7a\libBugly.so

运行设备

Android ARMv7设备

运行结果

Crash!java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.tencent.bugly.demo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /systemb]]] couldn't find "libBugly2.so"

原因分析

apk安装时,系统会把apk中libs目录下armeabi-v7a整个目录下的SO拷贝到应用的私有目录下。因为armeabi-v7a下没有放入libBugly2.so,运行时找不到libBugly2.so。 不同的工具兼容的CPU架构不一致,就容易出这个错误了!例如:libBugly.so提供armeabi、armeabi-v7a、x86三种。但其它产品可能只提供了armeabi。如果把这些so都直接拷贝进apk,就会因为上述的原因直接crash,会误以为该Crash是因为不同产品的so不能兼容导致的!

修复方式

添加SO:libs\armeabi-v7a\libBugly2.so或直接删除armeabi-v7a目录,arm设备上系统会自动选择armeabi

三、精神哥有话说

虽然出错原因很简单,但犯错的人很确实多,这货都挤到Bugly Crash影响力第16位了!

精神哥发现java.lang.UnsatisfiedLinkErrorcouldn't find “XX.so”的占比非常高,上面提的三个场景都是这种错误!

但你见过下面这种错误吗?

java.lang.UnsatisfiedLinkError:dlopen failed: “**/*/arm/*.so" has unexpected e_machine: 3

这是天坑啊,肯定是实习生挖的!

想知道怎么发生的?

原文发布于微信公众号 - 腾讯Bugly(weixinBugly)

原文发表时间:2014-11-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小白安全

危险漫步利用图片链接完成注入渗透

利用图片链接完成注入渗透 最近危险漫步闲着无聊就翻墙去国外看了一看黑客新闻,有一条新闻引起了我的关注,那就是国外某黑客黑了Word文档,导致了一家公司...

3127
来自专栏冷冷

Spring Cloud Gateway 原生支持接口限流该怎么玩

基于Spring Cloud、oAuth2.0开发基于Vue前后分离的开发平台,支持账号、短信、SSO等多种登录,提供配套视频开发教程。

2472
来自专栏FreeBuf

论如何优雅地蹭饭:克隆篡改公司饭卡(M1卡)

最近借了Proxmark3来娱乐性的玩下RFID技术,工资甚低的我只好拿公司饭卡实验,优雅地蹭几顿。物业大叔表打我啊!以下操作纯属学习目的,初学难免错误较多,望...

2175
来自专栏JavaEdge

RESTful架构REST名称REST的出处RESTful API各端的具体实现

3585
来自专栏美团技术团队

日志级别动态调整——小工具解决大问题

背景 随着外卖业务的快速发展,业务复杂度不断增加,线上系统环境有任何细小波动,对整个外卖业务都可能产生巨大的影响,甚至形成灾难性的雪崩效应,造成巨大的经济损失。...

8695
来自专栏程序猿DD

极大提高工作效率的几十种神兵利器

来源:https://www.liutf.com/posts/3720794851.html

2313
来自专栏Linyb极客之路

我珍藏的神兵利器 - 效率工具

快速启动应用+文件搜索+各种实用插件(计算器、翻译、网页快速访问等)。我的最爱,没有它我几乎半残。

2384
来自专栏EAWorld

揭秘:RESTEasy如何完美支持JAVA 微服务中的多种数据格式

本文获得stackify.com授权翻译发表,转载需要注明来自公众号EAWorld。

1574
来自专栏java架构学习交流

如何用比较快速的方法掌握Spring的核心——依赖注入,Java web轻量级开发面试教程 读书笔记

      我们知道,Java方面的高级程序员一定得掌握Spring的技能,其中包括Spring 依赖注入(IOC),面向切面(AOP),和数据库的整合(比如和...

21510
来自专栏葡萄城控件技术团队

.NET控件Designer架构设计

总体结构 ? Designer总体上由三大部分组成:View,ViewModel和Model,这个结构借鉴了流行的MVVM模式。这三部分的职责分工是: View...

2095

扫码关注云+社区

领取腾讯云代金券