Android 如何在AAR文件中使用ndk堆栈和共享库

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产生两种

我正在Android应用程序中使用共享对象库。这些共享对象库位于
.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我已经更新了一点答案。虽然它没有透露一些新的概念。