一个奇怪的 Java .lang.UnsatisfiedLinkError 异常 异常描述为找不到 libyuv.so

2021-09-29 15:02:55 +08:00
 honhon
这是堆栈信息
java.lang.Runtime.loadLibrary0(Runtime.java:1011)
java.lang.System.loadLibrary(System.java:1657)
a.a.a.a.<clinit>(SrsEncoder.java:370)
a.a.a.b.onReceive(Unknown Source:20)
android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_53617(LoadedApk.java:1339)
android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.$m$7(Unknown Source:4)
android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.run(Unknown Source:39)
android.os.Handler.handleCallback(Handler.java:790)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:192)
android.app.ActivityThread.main(ActivityThread.java:6896)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:875)

经判断此调用栈未动态注册广播的回调,但是怎么也找不到 a.a.a.b 这个类在哪里,反编译和各种方式分析 apk 没有发现。
请大佬们救救孩子
10144 次点击
所在节点    Android
23 条回复
zhanlanhuizhang
2021-09-29 15:24:23 +08:00
反编译看看是否存在
honhon
2021-09-29 15:28:28 +08:00
@zhanlanhuizhang 已经反编译查看过,并没有找到该类
FATEQiang
2021-09-29 15:54:42 +08:00
有可能就是 so 没有被 load 呀,解压 apk 看 so 在里面没有,还有就是编译 so 的选择的架构平台是否支持
honhon
2021-09-29 15:57:40 +08:00
我现在非常想找到这个 a.a.a.b 的类在哪里,他什么时候注册的
honhon
2021-09-29 15:58:17 +08:00
@FATEQiang so 不是关键,关键是他是在什么时候调用的
honhon
2021-09-29 16:22:48 +08:00
不知大家是否熟悉 libyuv.so 这个库
yorek
2021-09-29 16:35:31 +08:00
你把编译时的 mapping 文件找出来,在里面搜 a.a.a.b 看他混淆前是个啥
honhon
2021-09-29 16:38:40 +08:00
@yorek 没有开启混淆
honhon
2021-09-29 16:40:19 +08:00
持续等大佬们指教
crayygy
2021-09-29 16:41:26 +08:00
libyuv 是做颜色空间转换的,你的 app 或者是 SDK 有用到这个 lib 吗?
这里你能看到的 a.a.a.a 这类消息肯定是被混淆过了,需要编译的时候对应的编译产出的 mapping 文件才能解析的出来。
至于混淆开没开,看一下 proguard 文件。
honhon
2021-09-29 16:43:44 +08:00
@crayygy app 没有混淆 a.a.a.a 这个类是可以在 sdk 中找到的,但是没有找到 a.a.a.a 的调用地方
yorek
2021-09-29 16:48:17 +08:00
@honhon 那应该是已经混淆后的三方库引入的,解包看看 manifest,确认这个广播是静态注册还是动态注册。如果是静态注册,查下 menifest merge 日志文件,动态注册的话编译期用插件扫描 API 调用吧。
honhon
2021-09-29 16:49:55 +08:00
@yorek 推断是动态注册,静态注册的调用栈不是这样的
crayygy
2021-09-29 16:50:46 +08:00
唯一有用的信息是这个
a.a.a.a.<clinit>(SrsEncoder.java:370)
a.a.a.b.onReceive(Unknown Source:20)

这里的 SrsEncoder 看起来也的确像是可能用到 libyuv 的地方,做视频编码的时候需要做 rgb to yuv 。
这个类是你的 SDK 里面带的吗? 一般如果是 SDK 的话,这个 so 应该已经被打包在里面了,除非你用的 armeabi-v7a 的 sdk,然后自己编译安装的版本又是一个 armabi-v8a 的版本。 这个就得看 SDK 的配置文件和你 APK 里面具体的文件了。
yorek
2021-09-29 16:51:39 +08:00
@honhon #11 楼 看调用栈是在 aaab 这个广播的 onReceive 方法中,通过 SrsEncoder 这个类型间接调用。得查下 SrsEncoder
yorek
2021-09-29 16:55:40 +08:00
@honhon 你们有配置 ndkFilter 仅仅为 armeabi 吗 这也有可能出现这种问题 一般三方 SDK 只会提供了 v7 v8 两种
honhon
2021-09-29 17:51:03 +08:00
@yorek 现在情况是 a.a.a.a 这个类反编译能找到,a.a.a.b 反编译没有发现,插件扫描的方式可以指导一下么?或者推荐一下插件,感谢
honhon
2021-09-29 19:21:40 +08:00
@yorek SrsEncoder 没有注册广播操作
essicaj
2021-09-29 20:32:15 +08:00
可以把 apk 包抛出来让大家帮你看看
kekxv
2021-09-29 21:09:02 +08:00
就不能下断点吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/805161

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX