【问题标题】:How to use ndk-stack with shared library in AAR file如何在 AAR 文件中将 ndk-stack 与共享库一起使用
【发布时间】:2017-03-09 16:14:43
【问题描述】:

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

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

ndk-stack 的用法是

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

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

【问题讨论】:

    标签: android android-studio android-ndk


    【解决方案1】:

    您应该记住,并非每个.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&lt;module_name&gt;/build/intermediates/ndk
    • 对于基于CMake的它在&lt;module_name&gt;/build/intermediates/cmake

    此外,开箱即用的 android gradle 插件似乎无法将未剥离的库打包到您的 aar,所以这里唯一的方法是在您的 build.gradle 中执行一些自定义任务。

    【讨论】:

    • 另一个投票给某人以展示如何将基于 cmake 的系统和 aars 与 ndk-stack 一起使用。
    • @EdgarAroutiounian 我已经更新了一些答案。虽然它没有揭示一些概念上的新事物。
    猜你喜欢
    • 2021-03-16
    • 2015-10-23
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2023-03-21
    相关资源
    最近更新 更多