如何在AAR文件中使用ndk-stack和共享库

时间:2016-10-27 05:31:00

标签: android android-studio android-ndk

我在Android应用程序中使用共享对象库。这些共享对象库位于.aar文件中。

其中一个库正在崩溃。为了检查崩溃日志和确切的行号。我正在使用ndk-stack

ndk-stack的用法是

$ adb logcat |  ndk-stack -sym <Path to  your shared libraries>

现在如何在AAR文件中获取共享库的路径?

1 个答案:

答案 0 :(得分:4)

您应该记住,并非每个.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/目录。它的位置略微取决于使用的构建系统:

    {li> for ndk-build它位于<module_name>/build/intermediates/ndk
  • 代表CMake - 基于<module_name>/build/intermediates/cmake

此外,看起来开箱即用的Android gradle插件无法将未经剥离的库打包到aar,因此这里唯一的方法是build.gradle中的一些自定义任务。< / p>