Android so库中UnsatisfiedLinkError

Posted 新根

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android so库中UnsatisfiedLinkError相关的知识,希望对你有一定的参考价值。

最近游戏联运商反馈了一个so库中方法找不到,该问题比较常见,记录下排查过程:

报错日志:

Tombstone maker: 'xCrash 3.0.0'
Crash type: 'java'
Start time: '2022-09-06T13:05:49.347+0800'
Crash time: '2022-09-06T13:05:58.850+0800'
App ID: 'com.xxx.meta'
App version: '3.34.0.2'
Rooted: 'No'
API level: '29'
OS version: '10'
ABI list: 'armeabi-v7a,armeabi' //该手机cpu支持abi
Manufacturer: 'HUAWEI'
Brand: 'HUAWEI'
Model: 'MAR-TL00'
Build fingerprint: 'HUAWEI/MAR-TL00/HWMAR:10/HUAWEIMAR-TL00/10.0.0.161C01:user/release-keys'
pid: 16152, tid: 17111, name: GLThread 4240  >>> com.xxxxx.meta <<< //报错线程和进程名
java stacktrace: //详细报错信息
java.lang.UnsatisfiedLinkError: No implementation found for void org.appplay.lib.AppPlayNatives.nativeOnIdle() (tried Java_org_appplay_lib_AppPlayNatives_nativeOnIdle and Java_org_appplay_lib_AppPlayNatives_nativeOnIdle__)
	at org.appplay.lib.AppPlayNatives.nativeOnIdle(Native Method)
	at org.appplay.lib.AppPlayRenderer.onDrawFrame(AppPlayRenderer.java:71)
	at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1592)
	at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1281)

1.检查c++代码中是否有该函数

	void JNICALL Java_org_appplay_lib_AppPlayNatives_nativeOnIdle(JNIEnv *env, jclass)
	
		if(s_App)
			s_App->onIdle();
	

因此,排除了c++层代码没实现可能性。

2.检查so库中是否有该函数信息

根据so对应的cpu类型,选择对应ndk中objump 工具。这里,报错设备是areambi 选择arm-linux-androideabi-4.9

其次使用其-d 命令 查看未strip 的so库中方法信息,中执行以下语句,

xxxx\\toolchains\\arm-linux-androideabi-4.9\\prebuilt\\windows-x86_64\\bin\\arm-linux-androideabi-objdump.exe -d xxxx\\libAppPlayJNI.so>stacktrace.txt

执行完后,会生成带有函数信息的stacktrace.txt ,如下图所示:

在其中,检索nativeOnIdle关键字,找到有关信息。

00cc6494 <Java_org_appplay_lib_AppPlayNatives_nativeOnIdle>:
  cc6494:	e59f0014 	ldr	r0, [pc, #20]	; cc64b0 <Java_org_appplay_lib_AppPlayNatives_nativeOnIdle+0x1c>
  cc6498:	e79f0000 	ldr	r0, [pc, r0]
  cc649c:	e3500000 	cmp	r0, #0
  cc64a0:	012fff1e 	bxeq	lr
  cc64a4:	e5901000 	ldr	r1, [r0]
  cc64a8:	e5911028 	ldr	r1, [r1, #40]	; 0x28
  cc64ac:	e12fff11 	bx	r1
  cc64b0:	03057e60 	.word	0x03057e60

因此,排除了没有将代码打包进去so库可能性。

3.检查是否加载对应cpu的so库问题

3.1 缺少cpu 即abi支持so库

根据捕捉到日志,可知当该设备支持armeabi-v7a,armeabi

查看下渠道包apk, 已经带有armeabi-v7a 的支持,因此排除了该问题。

若是调试过程遇到该问题,则可以通过执行:
adb shellcat /proc/cpuinfo 查看下支持abi,如下图所示:

3.2 调用相应方法前没有加载so库

检查调用nativeOnIdle() 是在GLThread 异步线程中,但加载so库的过程是主线程中。其次,调用前并没有检查是否so库加载好的逻辑,是该原因导致。

解决方式: 调用前,检查so库是否已经load状态。

以上是关于Android so库中UnsatisfiedLinkError的主要内容,如果未能解决你的问题,请参考以下文章

Android so库中UnsatisfiedLinkError

Android so库中UnsatisfiedLinkError

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )(代

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )(代码片