Android 如何在AAR文件中使用ndk堆栈和共享库
我正在Android应用程序中使用共享对象库。这些共享对象库位于Android 如何在AAR文件中使用ndk堆栈和共享库,android,android-studio,android-ndk,Android,Android Studio,Android Ndk,我正在Android应用程序中使用共享对象库。这些共享对象库位于.aar文件中 其中一个图书馆正在崩溃。为了检查崩溃日志和准确的行号,我正在使用ndk堆栈take ndk堆栈的用法是 $ adb logcat | ndk-stack -sym <Path to your shared libraries> $adb logcat | ndk堆栈-sym 现在如何在AAR文件中获取共享库的路径 您应该记住,并非每个。因此文件对于ndk堆栈都很有用。Android NDK产生两种
.aar
文件中
其中一个图书馆正在崩溃。为了检查崩溃日志和准确的行号,我正在使用ndk堆栈
take
ndk堆栈的用法是
$ adb logcat | ndk-stack -sym <Path to your shared libraries>
$adb logcat | ndk堆栈-sym
现在如何在AAR文件中获取共享库的路径 您应该记住,并非每个。因此
文件对于ndk堆栈
都很有用。Android NDK产生两种。因此文件:剥离和非剥离。最大的区别是最后一个包含调试信息,这是ndk堆栈所需要的,而第一个不需要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
$
$readelf-S | grep调试
[23].调试信息程序00000000 00302c 0052d9 00 1
[24].调试abbrev程序位00000000 008305 000879 00 0 1
[25]。调试位置程序00000000 008b7e 001aa7 00 0 1
[26].调试程序00000000A628 00008800 00 08
[27]。调试范围程序位00000000 A6B0 0000D000 1
[28].调试行程序00000000 00a780 0009de 00 0 1
[29].调试\u str程序位00000000 00b15e 002387 01 MS 0 1
[30]。调试帧程序位00000000D4E8 0003d0 4
$
$readelf-S | grep调试
$
正如您所看到的,ELF有很多.debug.*
部分,其中确实包含行号、私有/静态函数名等
接下来,.aar
文件,包括调试文件和发布文件,只有剥离的二进制文件。因此,它们对于ndk堆栈是无用的
好吧,唯一可以找到非剥离二进制文件的地方是obj/
dir。其位置稍微取决于使用的构建系统:
- 对于
ndk build
,它位于/build/intermediates/ndk
- 对于基于
CMake
,它位于/build/intermediates/CMake
另外,android gradle插件似乎还没有现成的方法将未压缩的库打包到您的aar
,所以这里唯一的方法就是在构建中执行一些自定义任务。gradle
另一个投票给某人,让他演示如何使用基于cmake的系统&aars和ndk堆栈。@Edgararroutiounian我已经更新了一点答案。虽然它没有透露一些新的概念。