我在Android应用程序中使用共享对象库。这些共享对象库位于.aar
文件中。
一个库正在崩溃。为了检查崩溃日志和确切的行号。我用的是ndk-stack
。
ndk-stack
的用法
$ adb logcat | ndk-stack -sym <Path to your shared libraries>
现在我如何在AAR文件中获得共享库的路径?
您应该记住,并非每个.so
文件都对ndk-stack
有用。Android NDK产生两种.so
文件:剥离和非剥离。最大的区别是最后一个包含调试信息,这是ndk-stack
需要的,而第一个不需要。readelf
可以帮助检查特定文件是否被剥离:
$ readelf <non-stripped-lib> -S | grep debug
[23] .debug_info PROGBITS 00000000 00302c 0052d9 00 0 0 1
[24] .debug_abbrev PROGBITS 00000000 008305 000879 00 0 0 1
[25] .debug_loc PROGBITS 00000000 008b7e 001aa7 00 0 0 1
[26] .debug_aranges PROGBITS 00000000 00a628 000088 00 0 0 8
[27] .debug_ranges PROGBITS 00000000 00a6b0 0000d0 00 0 0 1
[28] .debug_line PROGBITS 00000000 00a780 0009de 00 0 0 1
[29] .debug_str PROGBITS 00000000 00b15e 002387 01 MS 0 0 1
[30] .debug_frame PROGBITS 00000000 00d4e8 0003d0 00 0 0 4
$
$ readelf <stripped-lib> -S | grep debug
$
如您所见,未剥离的ELF有许多.debug_*
节,其中确实包含行号,私有/静态函数名等。
.aar
文件,无论是调试文件还是发布文件,都只有剥离的二进制文件。所以它们对ndk-stack
是没用的。
AFAIK,唯一可以找到非剥离二进制文件的地方是obj/
目录。它的位置取决于使用的构建系统:
- 对于
ndk-build
,它位于<module_name>/build/intermediates/ndk
基于 - 在
<module_name>/build/intermediates/cmake
下
CMake
的而且它看起来像开箱的android gradle插件没有办法将未剥离的库打包到你的aar
中,所以唯一的方法是在你的build.gradle
中进行一些自定义任务。