如何避免剥离Android应用程序的本机代码符号

4nt*_*ine 18 android stripping gradle android-ndk

我正在sigsegv 11使用本机代码,我需要避免剥离以了解什么是错误的.该应用程序使用库(aar),我能够避免使用'cmd-strip' 黑客攻击 aar .但是在apk中剥离版本.so仍然被使用,所以应用程序剥离符号,可能在transformNative_libsWithStripDebugSymbolForDebuggradle任务时.有什么改变可以避免吗?

PS.在SO上发现了类似的问题,但它有点不同(在我的情况下使用aar而不是剥离的符号).

Way*_*Cai 35

在packagingOptions中有一个未记录的方法'doNotStrip',只需在build.gradle中添加以下行

packagingOptions{
    doNotStrip "*/armeabi/*.so"
    doNotStrip "*/armeabi-v7a/*.so"
    doNotStrip "*/x86/*.so"
}
Run Code Online (Sandbox Code Playgroud)

  • 仅因为某些.so文件已加密并且如果被剥离会被破坏,则仅需要此文件。 (2认同)
  • 好吧,使用 simpleperf 分析应用程序时需要 **,如 [此处](https://android.googlesource.com/platform/prebuilts/simpleperf/+/ndk-r14-beta1/README.md) 所述,因为没有这个符号在配置文件报告中丢失。此外,当使用 Android Studio 的本机分析器时,它不会显示符号 **即使 ** 如果本机库没有被剥离,这意味着它不会在内部使用 `simpleperf`... (2认同)

Dan*_*ert 8

幸运的是,您实际上并不需要在应用程序中保留符号.NDK提供了一个名为ndk-stack(它位于NDK根目录中)的工具,它可以为您标记堆栈跟踪:https://developer.android.com/ndk/guides/ndk-stack.html

  • 我们找不到在不使用 doNotStrip 的情况下使用 lldb 进行任何类型调试的方法。调试堆栈中没有符号名称,没有局部变量名称,没有断点等(使用 NDK 21 和 Android Studio beta)。在哪里报告错误(NDK 或 Android Studio)?与简单地在 logcat 中查看回溯相比,使用 ndk-stack 也非常麻烦。也许 Android Studio 可以自动化这个?谢谢 (3认同)