在发布版本中包含原生符号

默认情况下,应用发布版本中的原生代码库会被剥离。此剥离操作会移除应用使用的任何原生库中包含的符号表和调试信息。剥离原生代码库可显著节省大小;但是,由于缺少信息(例如类名和函数名),无法在 Google Play 管理中心诊断崩溃。要调试崩溃,您必须在 Play 管理中心的应用中包含调试符号文件。

上传符号文件

Google Play 管理中心会在Android vitals下报告原生崩溃。只需几个步骤,您就可以为应用生成并上传原生调试符号文件。此文件可在 Android vitals 中实现符号化原生崩溃堆栈轨迹(包含类名和函数名),以帮助您在生产环境中调试应用。这些步骤因项目中使用 Android Gradle 插件的版本以及您是使用 Android App Bundle(推荐)还是 APK 而异。

Android Gradle 插件 4.1 或更高版本

如果您的项目构建 Android App Bundle (AAB),您可以配置您的构建以自动将原生调试符号文件包含在 AAB 中,以便在您发布应用时将其上传到 Play 管理中心。要在发布版本中包含此文件,请将以下内容添加到您的应用的 build.gradle.kts 文件中

android.buildTypes.release.ndk.debugSymbolLevel = { SYMBOL_TABLE | FULL }

从以下选项中选择调试符号级别

  • 使用 SYMBOL_TABLE 可在 Play 管理中心的符号化堆栈轨迹中获取函数名。此级别支持 tombstones
  • 使用 FULL 可在 Play 管理中心的符号化堆栈轨迹中获取函数名、文件和行号。

如果您的项目构建 APK,请使用前面所示的 android.buildTypes.release.ndk.debugSymbolLevel 设置单独生成原生调试符号文件。手动将原生调试符号文件上传到 Google Play 管理中心(此过程类似于上传映射文件以去混淆堆栈轨迹)。作为构建过程的一部分,Android Gradle 插件会将此文件输出到以下项目位置

app/build/outputs/native-debug-symbols/<var>variant-name</var>/native-debug-symbols.zip

Android Gradle 插件 4.0 或更早版本(以及其他构建系统)

作为构建过程的一部分,Android Gradle 插件会在项目目录中保留一份未剥离的库副本。此目录结构类似于以下内容

app/build/intermediates/cmake/universal/release/obj/
├── armeabi-v7a/
│   ├── libgameengine.so
│   ├── libothercode.so
│   └── libvideocodec.so
├── arm64-v8a/
│   ├── libgameengine.so
│   ├── libothercode.so
│   └── libvideocodec.so
├── x86/
│   ├── libgameengine.so
│   ├── libothercode.so
│   └── libvideocodec.so
└── x86_64/
    ├── libgameengine.so
    ├── libothercode.so
    └── libvideocodec.so
  1. 将此目录的内容压缩成 zip 文件

    cd app/build/intermediates/cmake/universal/release/obj
    zip -r symbols.zip .
    
  2. 手动symbols.zip 文件上传到 Google Play 管理中心。