【问题标题】:How to avoid stripping for native code symbols for android app如何避免剥离 Android 应用程序的本机代码符号
【发布时间】:2017-03-14 07:18:48
【问题描述】:

我在本机代码中收到sigsegv 11,我需要避免剥离以了解问题所在。该应用程序使用库(aar),我能够避免使用“cmd-strip”hack 剥离 aar。但是在 apk 剥离版本的 .so 中无论如何都会使用,因此应用程序会剥离符号,可能是在 transformNative_libsWithStripDebugSymbolForDebug gradle 任务时。有什么改变可以避免吗?

PS。在 SO 上找到 similar question,但它有点不同(在我的情况下使用 aar 并没有剥离符号)。

【问题讨论】:

  • IMO,如果您确实需要将未剥离的二进制文件与您的 APK 一起发送,您应该三思而后行。缺点是共享库的大小大大增加并且逆向工程保护很差。如果您只想在某处找到未剥离的二进制文件 - 请查看 obj/local/。详情请见here
  • 只是为了解决问题,不是为了分发
  • 如果是这样 - ndk-build 已经创建了非剥离文件和剥离文件。请参阅我之前的评论。
  • 它们在构建 aar 时不会被剥离,但在构建应用程序时会被剥离。看看我的问题

标签: android gradle android-ndk stripping


【解决方案1】:

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

packagingOptions{
    doNotStrip "*/armeabi/*.so"
    doNotStrip "*/armeabi-v7a/*.so"
    doNotStrip "*/x86/*.so"
}

【讨论】:

  • 你不应该这样做。它会使您的 APK 变得巨大而且没有必要。请参阅我关于如何符号化堆栈跟踪的答案。
  • 需要它只是因为一些 .so 文件是加密的,如果剥离会被破坏。
  • fwiw,我遇到了与 Android Studio 3.1/3.2 和 gradle 4.4 完全相反的问题。它不再剥离调试符号,我找不到强制剥离的方法!不是大声笑。
  • @DanAlbert 我实际上打开了那个问题 ;)
  • 嗯,当使用 simpleperf 分析应用程序时需要此 ,如 here 所述,因为如果没有此符号,则配置文件报告中会丢失。此外,当使用 Android Studio 的原生分析器时,如果原生库没有被剥离,它不会显示符号 即使,这意味着它不会在内部使用 simpleperf...
【解决方案2】:

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

【讨论】:

  • 似乎需要 doNotStrip 才能在 logcat 中查看符号以防崩溃,并在 Android Studio 中使用 lldb 进行调试
  • 前者由ndk-stack处理,后者不成立。如果您看到后者,那是一个错误,您应该提交它。
  • 我们找不到在没有 doNotStrip 的情况下对 lldb 进行任何类型调试的方法。调试堆栈中没有符号名称,没有局部变量名称,没有断点等(使用 NDK 21 和 Android Studio 测试版)。在哪里报告错误(NDK 或 Android Studio)?与只在 logcat 中查看回溯相比,使用 ndk-stack 也非常麻烦。也许Android Studio可以自动化这个?谢谢
  • 这将是一个 Android Studio 错误。关注source.android.com/setup/contribute/report-bugs
  • "另外使用 ndk-stack 相比于在 logcat 中简单查看回溯非常麻烦。也许 Android Studio 可以自动执行此操作?"是的,那会很好。如果您提交 FR,我可以帮助找到它的所有者。
猜你喜欢
  • 2014-09-12
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
相关资源
最近更新 更多