gpt4 book ai didi

android - 如何在 AAR 文件中将 ndk-stack 与共享库一起使用

转载 作者:行者123 更新时间:2023-11-29 15:41:06 25 4
gpt4 key购买 nike

我在 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_*部分,确实包含行号、私有(private)/静态函数名称等。

接下来,.aar文件,包括调试文件和发布文件,都只有剥离 二进制文件。所以它们对 ndk-stack 没用.

据我所知,唯一可以找到未剥离的二进制文件的地方是 obj/目录。它的位置稍微取决于使用的构建系统:

  • ndk-build它在 <module_name>/build/intermediates/ndk
  • CMake - 基于它在 <module_name>/build/intermediates/cmake

而且它看起来像开箱即用的 android gradle 插件无法将未剥离的库打包到您的 aar ,所以这里唯一的方法是在您的 build.gradle 中执行一些自定义任务.

关于android - 如何在 AAR 文件中将 ndk-stack 与共享库一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40276799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com