如何获取APK对应的libc.so以排查Android应用Native崩溃问题
我的Android应用出现Native崩溃,崩溃日志如下:
Crashed: Thread: SIGABRT 0x0000000000000000 #00 pc 0x51ba8 libc.so (BuildId: 8b687b4d600e1faa82af5a5197e82129) #01 pc 0x51b78 libc.so (BuildId: 8b687b4d600e1faa82af5a5197e82129) #02 pc 0x6d122c libart.so (BuildId: a49c773ef6221a996ecea990e9753caa) #03 pc 0x16ea8 libbase.so (BuildId: 420d56eac27a210c92900f3ddb760c86) #04 pc 0x6e10 liblog.so (BuildId: 28ea5154585a4fc544f1324fcd9ea010) #05 pc 0x4aef1c libhwui.so (BuildId: 8b1c450dc05daf2fbdb01856d197d12b) #06 pc 0x4c971c libhwui.so (BuildId: 8b1c450dc05daf2fbdb01856d197d12b) #07 pc 0x72bb5450 #08 pc 0x4cbc4 libc++.so (BuildId: c43691f579c6316722d646cc6daa2e0e)
解压APK后,仅在myapp.zip/lib/arm64-v8a目录下找到libc++_shared.so,需要获取对应BuildId的libc.so来排查崩溃原因。
获取对应libc.so的可行方法:
从崩溃设备直接提取
如果能拿到出现崩溃的设备,通过ADB命令拉取系统中的libc.so:adb pull /system/lib64/libc.so ./拉取完成后,用
readelf -n libc.so命令输出的BuildId,核对是否与崩溃日志中的8b687b4d600e1faa82af5a5197e82129一致。部分非Root设备可能无法直接访问系统目录,可尝试开启调试模式或使用备份工具导出。从匹配的系统镜像提取
libc.so是系统库,与设备的Android版本、架构(arm64-v8a)强绑定。找到崩溃设备对应Android版本的官方系统镜像,解压后在system/lib64/目录下找到libc.so,同样用readelf验证BuildId是否匹配。使用NDK sysroot(备选方案)
若知道应用编译时使用的NDK版本,可在NDK的sysroot目录中找到对应架构的libc.so,路径一般为${NDK_PATH}/platforms/android-<API_LEVEL>/arch-arm64/usr/lib/libc.so。但注意NDK中的libc.so可能与设备实际系统库存在差异,仅作为临时备选。
拿到libc.so后的排查步骤:
使用NDK toolchain中的addr2line工具解析崩溃地址,命令格式:
${NDK_PATH}/toolchains/llvm/prebuilt/<HOST_ARCH>/bin/aarch64-linux-android<API_LEVEL>-addr2line -f -e libc.so 0x51ba8 0x51b78
该命令会输出崩溃点对应的函数名和代码位置,帮助定位崩溃原因。
内容的提问来源于stack exchange,提问作者flamyoad

