对崩溃堆栈轨迹进行去混淆处理或符号化解析

Android 上的崩溃和 ANR 问题会生成堆栈轨迹,这是您的程序在崩溃之前调用过的嵌套函数序列的快照。这些快照可帮助您找出并修正源代码中的任何问题。

如果您的应用或游戏是使用 Java 开发的,并且您使用 ProGuard 对应用进行优化和混淆处理,则您可以在 Play 管理中心为每个应用版本上传 ProGuard 映射文件。如果您的应用或游戏是使用原生代码(如 C++)开发的,则您可以在 Play 管理中心为每个应用版本上传调试符号文件。这样可以更轻松地分析并修正崩溃和 ANR 问题。

重要提示:只有与 ReTrace 兼容的映射文件支持对使用 Java 编译的应用进行去混淆处理。此格式与 ProGuard 或 R8 使用的格式相同。

第 1 步:生成去混淆文件或符号化解析文件

如需对某个应用版本的崩溃和 ANR 问题进行去混淆处理或符号化解析,您首先需要为该应用版本生成所需的文件。您必须为应用的每个新版本生成相应文件并上传,去混淆处理或符号化解析才能正常执行。

Java:生成 ProGuard 映射文件

如需对 Java 堆栈轨迹进行去混淆处理,您首先需要生成 ProGuard 映射文件。如需了解具体方法,请访问 Google Developers 网站

原生:生成调试符号文件

Android Gradle 插件版本 4.1 及更高版本

如果您的项目构建的是 Android App Bundle,您可以在其中自动添加调试符号文件。如需添加此文件,请将以下内容添加到应用的 build.gradle 文件中:

  • android.defaultConfig.ndk.debugSymbolLevel = 'FULL'

注意:调试符号文件的大小上限为 800 MB。如果您的调试符号文件占用空间过大,请使用 SYMBOL_TABLE(而非 FULL),以便减小文件大小。

如果您的项目构建的是 APK,请使用上面的 build.gradle 构建设置单独生成调试符号文件。按照第 2 步:上传去混淆文件或符号化解析文件中的说明,手动将调试符号文件上传到 Google Play 管理中心。在构建流程中,Android Gradle 插件会在以下项目位置输出此文件:

  • app/build/outputs/native-debug-symbols/variant-name/native-debug-symbols.zip

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

在 app bundle 或 APK 构建流程中,Android Gradle 插件会在项目目录中保留未剥离的库的副本。此目录会采用与以下类似的结构:

app/build/intermediates/cmake/universal/release/obj

├── armeabi-v7a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── arm64-v8a/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

├── x86/

│   ├── libgamenegine.so

│   ├── libothercode.so

│   └── libvideocodec.so

└── x86_64/

    ├── libgameengine.so

    ├── libothercode.so

    └── libvideocodec.so

注意:如果您使用的是其他构建系统,可以对其进行修改,以便将未剥离的库存储在采用上述所需结构的目录中。

  1. 压缩此目录的内容:
    • $ cd app/build/intermediates/cmake/universal/release/obj
    • $ zip -r symbols.zip .
  2. 按照第 2 步:上传去混淆文件或符号化解析文件中的说明,手动将 symbols.zip 文件上传到 Play 管理中心。

调试符号文件的大小上限为 800 MB。如果您的文件过大,可能是因为您的 .so 文件包含符号表(函数名称)以及 DWARF 调试信息(文件名和代码行)。对代码进行符号化解析时并不需要使用这些内容,您可以通过运行以下命令将其移除:

  • $OBJCOPY --strip-debug lib.so lib.so.sym

注意$OBJCOPY 指向您要剥离的 ABI 的具体版本,例如:ndk-bundle/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy

第 2 步:上传去混淆文件或符号化解析文件

如需对某个应用版本的崩溃和 ANR 问题进行去混淆处理或符号化解析,您必须为每个应用版本上传去混淆文件或符号化解析文件。

重要提示:只有使用 APK 的开发者才需要执行此步骤。如果您使用的是 app bundle 和 Android Gradle 插件 4.1 或更高版本,无需执行任何操作。我们会自动从 app bundle 中获取去混淆文件,您可以跳至第 3 步:查看去混淆处理后的崩溃堆栈轨迹。您可以访问 Android 开发者网站详细了解 app bundle。

通过 Play 管理中心上传文件

如需上传去混淆文件或符号化解析文件,请按以下步骤操作:

  1. 打开 Play 管理中心
  2. 选择一款应用。
  3. 在左侧菜单中,依次选择测试和发布 > App bundle 资源管理器
  4. 使用右上角的选择器选择相关制品。
  5. 选择下载内容标签页,然后向下滚动到“资产”部分。
  6. 点击映射文件或调试符号文件(视情况而定)对应的上传箭头,以便为相应的应用版本上传去混淆文件或符号化解析文件。
使用 Google Play Developer API 上传文件

如需使用 Google Play Developer API 上传文件,请访问 Google Developers 网站

第 3 步:查看去混淆处理后的崩溃堆栈轨迹

在您为某个应用版本上传 ProGuard 映射文件或调试符号文件后,系统会对之后发生的崩溃和 ANR 问题进行去混淆处理。您可以在应用的崩溃和 ANR 页面上查看对各个崩溃和 ANR 问题进行去混淆处理后的堆栈轨迹。

  1. 打开 Play 管理中心
  2. 选择一款应用。
  3. 在左侧菜单中,依次选择监控和改进 > Android Vitals > 崩溃和 ANR
  4. 选择一种崩溃。
  5. 在“堆栈轨迹”部分中,您将看到去混淆处理和符号化解析后的堆栈轨迹。

重要提示:在您为某个应用版本上传映射文件后,系统只会对该应用版本未来发生的崩溃和 ANR 问题进行去混淆处理。对于在您为某个应用版本上传相应的映射文件之前发生的崩溃和 ANR 问题,系统不会进行去混淆处理。

常见问题解答

我不想使用 Play 管理中心进行去混淆处理/符号化解析。我可以在离线状态下执行相应操作吗?

Play 管理中心使用 ndk-stack 表示原生应用的堆栈轨迹,使用 ReTrace 表示 Java 崩溃的堆栈轨迹。如果您选择不分享去混淆文件,可以从 Play 管理中心复制经过混淆处理的崩溃堆栈,然后离线使用相应的工具对其进行符号化解析。不过,您必须针对每个崩溃堆栈手动完成此流程,这会导致此流程速度缓慢且非常耗时。您提供去混淆文件后,Play 管理中心可为您处理此流程。

我已经上传去混淆文件/符号化解析文件,为什么我的崩溃和 ANR 问题仍是经过混淆处理的状态?

在您为某个应用版本上传 ProGuard 映射文件或调试符号文件后,系统只会对之后发生的崩溃和 ANR 问题进行去混淆处理。您需要等待用户的设备报告新的崩溃和 ANR 问题,然后您才能在 Play 管理中心看到去混淆处理后的崩溃和 ANR 问题。

在上传去混淆文件/符号化解析文件后,为什么我的崩溃和 ANR 问题只有一部分经过了去混淆处理?

这是因为上传的去混淆文件/符号化解析文件不完整。请务必添加整个应用的符号化解析文件,尤其是当您使用复杂或多阶段的构建流程时。使用第三方库是造成部分去混淆处理的最常见原因之一。在这种情况下,您可以通过库提供商获取去混淆文件。

在上传去混淆文件/符号化解析文件后,为什么我的崩溃和 ANR 问题好像数量变少了,但程度更严重了?

如果未提供去混淆文件,32 位和 64 位设备或 ARM 和 Intel 设备上的同一崩溃或 ANR 问题会分开显示。您提供去混淆文件后,我们可以将这些崩溃问题汇总起来,让您更好地了解对您的应用影响最大的崩溃和 ANR 问题。

如果我忘记上传文件,会怎么样?

如果您忘记为应用的新版本上传文件,崩溃和 ANR 问题会恢复为经过混淆处理的状态。请立即按照上述说明上传文件。在您为某个应用版本上传 ProGuard 映射文件或调试符号文件后,系统只会对之后发生的崩溃和 ANR 问题进行去混淆处理。您需要等待用户的设备报告新的崩溃和 ANR 问题,然后您才能在 Play 管理中心看到去混淆处理后的崩溃和 ANR 问题。

为避免忘记上传文件,请考虑将构建流程更改为使用 Android Gradle 插件版本为 4.1 或更高版本的 app bundle。在这种情况下,您可以按照 Android 开发者网站上的说明,在 app bundle 中自动添加调试符号文件。

如果我上传了错误的文件,会怎么样?

如果您为某个应用版本上传了错误的文件,崩溃和 ANR 问题会恢复为经过混淆处理的状态。如需上传已更正的版本,请按以下步骤操作:

  1. 打开 Play 管理中心
  2. 选择一款应用。
  3. 在左侧菜单中,依次选择测试和发布 > App bundle 资源管理器
  4. 使用右上角的选择器选择相关制品。
  5. 选择下载内容标签页,然后向下滚动到“资产”部分。
  6. 点击错误的去混淆文件或符号化解析文件旁边的删除图标
  7. 删除错误版本后,点击上传图标,并为该应用版本上传正确的文件。

在您为某个应用版本上传正确的 ProGuard 映射文件或调试符号文件后,系统只会对之后发生的崩溃和 ANR 问题进行去混淆处理。您需要等待用户的设备报告新的崩溃和 ANR 问题,然后您才能在 Play 管理中心看到去混淆处理后的崩溃和 ANR 数据。

提示:为避免上传错误的文件版本,请考虑将构建流程更改为使用 Android Gradle 插件版本为 4.1 或更高版本的 app bundle。在这种情况下,您可以按照 Android 开发者网站上的说明,在 app bundle 中自动添加调试符号文件。

我目前使用的是 APK。如何才能改用 app bundle?

如需开始使用 app bundle,请访问 Android 开发者网站

我的应用同时包含原生代码和 Java 代码。我可以同时上传原生符号化解析文件和 Java 去混淆文件吗?

可以。

为什么有些 ANR 不显示堆栈轨迹?

有时系统遇到 ANR,但无法收集堆栈轨迹。在这种情况下,为了让您能更全面地了解应用稳定性,系统会显示 ANR,但无法显示堆栈轨迹本身。系统会按类型和活动对不含堆栈轨迹的 ANR 数据进行分门别类,因此了解并解决类似的 ANR 问题可能有助于减少不含堆栈轨迹的 ANR 数量。

该内容对您有帮助吗?

您有什么改进建议?
搜索
清除搜索内容
关闭搜索框
主菜单
13885855303764994304
true
搜索支持中心
true
true
true
true
true
92637
false
false