繁体   English   中英

如何在 Android App Bundle 中包含预构建本机库的调试符号?

[英]How to include debug symbols for a pre-built native library inside an Android App Bundle?

背景资料

将应用程序上传到使用本机库的 Play 商店时,还需要上传本机调试符号以获取有用的崩溃/ANR 信息。

如果您上传时没有符号,您会收到以下警告:“此 App Bundle 包含本机代码,并且您尚未上传调试符号。我们建议您上传符号文件,以使您的崩溃和 ANR 更易于分析和调试。”

过去在将应用程序上传为.apk文件时,需要手动上传此类调试信息。 现在使用.aab如果本机库是通过 android studio 构建的,则可以设置android.defaultConfig.ndk.debugSymbolLevel = 'FULL' ,此时当您构建.aab时,它将自动包含调试信息,您上传此单文件,一切都已完成/工作。

预建库

然而,在 android studio 中构建库并不总是可能/理想/必要的。 有时有一些原因需要在外部预先构建库并仅由 android studio 使用,而不是由它构建; Android Studio 通过此处描述的目录结构支持这一点https://developer.android.com/studio/projects/gradle-external-native-builds#jniLibs简而言之,您只需将库复制到正确的src/main/jniLibs/{ABI}路径,它被拾取并成为捆绑包的一部分。

问题

  • Android Studio 可以构建一个.aab ,其中包含 Play 商店可以理解的调试信息,因此您无需手动上传。
  • 如果您将它们放置在正确的路径结构中,Android Studio 可以使用预构建的原生库
  • 我无法找到任何文档或方法来同时执行这两项操作,使用本地预构建库,但在.aab中包含它们的调试信息。 即使在逻辑上应该可以做到这一点。

我已经搜索了我认为的所有地方,但找不到任何人甚至真的在谈论这个,您如何/在哪里放置相应的调试信息,以便也可以将其作为.aab的一部分包含在内? 是否有单独的路径,它们是否只需要特定的文件扩展名,是否需要告诉 gradle 以某种方式处理它们? 这真的不可能吗?

我尝试过的事情:

  • 不要拆分调试信息,只需将它们留在 .so 文件中 - Play 商店不会剥离它们,因此您可以向用户提供构建的巨大调试版本
  • 将调试信息拆分为扩展名为.so.dbg的文件,并将它们放在 .so 文件旁边 - 它们不包含在.aab
  • 按照说明(此处为https://support.google.com/googleplay/android-developer/answer/9848633和其他地方)在上传.aab后手动压缩和上传符号 - 这似乎有效但不一样将它们放在.aab中一样方便
  • 我尝试使用 android studio 构建一个示例应用程序来构建一个库,而不是使用预构建的库来验证它是否包含调试信息以及它使用的文件扩展名。 样本内容..ab

经过更多挖掘后,我发现负责此任务的任务是“ExtractNativeDebugMetadataTask”,可以通过它来定制/更改一些工作以在此处执行自定义操作。

然而,这最终是不必要的,因为在深入研究时我发现它实际上已经有效。 至少到目前为止最新的 gradle 版本(不确定过去)。 它只是由于某些 NDK 路径混淆而失败,这不会导致包构建的构建/创建失败,但只会记录一条容易错过的信息消息。

最终,完成这项工作所需要做的就是:

  1. 使用-g -g3或类似工具构建您的外部.so文件
  2. 不要以任何方式剥离它们
  3. 将它们放在未剥离的jniLibs目录结构中
  4. 适当配置你的 build.gradle android{ ndk { debugSymbolLevel 'FULL' } ndkPath "$projectDir/path/to/NDK" }

生成的.aab将在正确的位置包含剥离的.so文件和拆分调试的.so.dbg文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM