簡體   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