作者:壹路上有祢_522 | 来源:互联网 | 2023-09-15 11:31
最近游戏联运商反馈了一个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'
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&#43;&#43;代码中是否有该函数&#xff1a;
void JNICALL Java_org_appplay_lib_AppPlayNatives_nativeOnIdle(JNIEnv *env, jclass){if(s_App)s_App->onIdle();}
因此,排除了c&#43;&#43;层代码没实现可能性。
2.检查so库中是否有该函数信息&#xff1a;
根据so对应的cpu类型,选择对应ndk中objump
工具。这里&#xff0c;报错设备是areambi
选择arm-linux-androideabi-4.9
其次使用其-d 命令 查看未strip 的so库中方法信息&#xff0c;中执行以下语句&#xff0c;
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 &#xff0c;如下图所示:
![在这里插入图片描述](https://img.php1.cn/3cd4a/94ce/a6e/865776f6fe3d5f59.jpeg#pic_center)
在其中,检索nativeOnIdle
关键字&#xff0c;找到有关信息。
00cc6494 <Java_org_appplay_lib_AppPlayNatives_nativeOnIdle>:cc6494: e59f0014 ldr r0, [pc, #20] ; cc64b0 <Java_org_appplay_lib_AppPlayNatives_nativeOnIdle&#43;0x1c>cc6498: e79f0000 ldr r0, [pc, r0]cc649c: e3500000 cmp r0, #0cc64a0: 012fff1e bxeq lrcc64a4: e5901000 ldr r1, [r0]cc64a8: e5911028 ldr r1, [r1, #40] ; 0x28cc64ac: e12fff11 bx r1cc64b0: 03057e60 .word 0x03057e60
因此,排除了没有将代码打包进去so库可能性。
3.检查是否加载对应cpu的so库问题&#xff1a;
3.1 缺少cpu 即abi支持so库&#xff1a;
根据捕捉到日志&#xff0c;可知当该设备支持armeabi-v7a,armeabi
。
查看下渠道包apk, 已经带有armeabi-v7a
的支持&#xff0c;因此排除了该问题。
若是调试过程遇到该问题&#xff0c;则可以通过执行&#xff1a;
adb shell
和cat /proc/cpuinfo
查看下支持abi,如下图所示&#xff1a;
![在这里插入图片描述](https://img.php1.cn/3cd4a/1e618/bdf/129913486c37ddf6.jpeg#pic_center)
3.2 调用相应方法前没有加载so库&#xff1a;
检查调用nativeOnIdle()
是在GLThread 异步线程中&#xff0c;但加载so库的过程是主线程中。其次,调用前并没有检查是否so库加载好的逻辑&#xff0c;是该原因导致。
解决方式&#xff1a; 调用前&#xff0c;检查so库是否已经load状态。