Android NDK

重要

Visual Studio App Center 计划于 2025 年 3 月 31 日停用。 虽然可以继续使用 Visual Studio App Center,直到它完全停用,但你可以考虑迁移到几个建议的替代方法。

详细了解支持时间线和替代方案。

Android NDK 允许使用 C 和 C++ 实现 Android 应用的某些部分。 可以使用 Android 应用的 Google Breakpad 客户端库在本机代码中接收有效的堆栈跟踪。 堆栈跟踪只能包含内存地址。 它们不显示读取和理解崩溃所需的类名、方法、文件名和行号。 若要获取为 Android NDK 应用翻译的内存地址,必须为每个生成上传应用程序符号。

若要了解如何报告 NDK 崩溃,请参阅 适用于 Android 应用的 Android SDK 文档 或 Unity 应用的 Unity SDK 文档

如果要将 Breakpad 崩溃从其他平台发送到 App Center,请参阅 上传自定义崩溃文档

未分配的崩溃

App Center 诊断部分中会显示未分配的崩溃,因此即使在上传符号之前,也可以查看一些详细信息。 这些崩溃中缺少的符号将显示在“unsymbolicated”选项卡中。如果上传缺少的符号,则未分配的崩溃组将被符号化崩溃组替换。

注意

App Center 不支持对来自系统库的帧进行符号化。 鉴于 Android 和其他平台的系统二进制文件高度碎片化(在任何给定的设备/OS 版本组合上可能有所不同),App Center 本身不会为系统二进制文件提供符号,并且会自动跳过符号化中的系统二进制文件帧。

生成要上传的 .zip 文件

App Center 可通过两种方式检索符号所需的符号。 App Center 可以从项目中使用的本机二进制文件生成它们,也可以直接上传 Breakpad 符号。

选项 1:上传本机二进制文件

将项目 obj/local/$ABI/ 目录中的所有 .so 文件放入 .zip 文件中。

选项 2:上传断点符号

  1. 使用 Breakpad 工具链转储符号,如“获取调试符号”部分的 Breakpad 文档 中所述。
  2. 使用以下结构创建 symbols.zip 文件:

注意

如果要从 macOS 上传符号,则必须清理任何无关文件夹的符号,例如生成__MACOS,若要删除此符号,可以使用 zip -d <symbols.zip> __MACOSX/\*

$ unzip -l symbols.zip
Archive:  symbols.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  07-22-13 15:07   symbols/
        0  07-22-13 15:07   symbols/libnative.so/
        0  07-22-13 15:07   symbols/libnative.so/EAC901FB6DDCCE8AED89E1A8E4A58360/
    12468  07-22-13 15:07   symbols/libnative.so/EAC901FB6DDCCE8AED89E1A8E4A58360/libnative.so.sym
        0  07-22-13 15:07   symbols/libnative.so/FDC5C9E715C4F16408C0B78F95855BF0/
    12467  07-22-13 15:07   symbols/libnative.so/FDC5C9E715C4F16408C0B78F95855BF0/libnative.so.sym
 --------                   -------
    24935                   6 files

上传符号

注意

App Center 生成和分发服务可以自动将符号转发到诊断服务。 如果使用 App Center 生成应用并将其自动分发给最终用户,则无需手动获取并上传符号文件,如以下步骤中所述。

App Center 门户

  1. 登录到 App Center 并选择你的应用。
  2. 在左侧菜单中,导航到“ 诊断 ”部分,然后 导航到“问题”。
  3. 如果应用程序尚未报告任何崩溃,则需要使用 API 或 CLI 上传 Breakpad 符号。
  4. 如果应用程序已报告需要符号的崩溃,检查 Unsymbolicated 选项卡,并且应该有一个缺少符号的版本组,请单击它以显示用于上传文件的菜单。
  5. App Center 为符号编制索引后,崩溃将为你进行符号化。

App Center API

通过 API 上传符号的过程涉及一系列三个 API 调用:一个用于在后端分配空间,一个用于上传文件,另一个用于更新上传状态。 第一次 API 调用的正文应设置为 symbol_typeBreakpad

  1. POST触发对symbol_uploads API 的请求。 此调用在后端为文件分配空间,并返回 symbol_upload_idupload_url 属性。
curl -X POST 'https://api.appcenter.ms/v0.1/apps/{owner_name}/{app_name}/symbol_uploads' \
    -H 'accept: application/json' \
    -H 'X-API-Token: {API TOKEN}' \
    -H 'Content-Type: application/json' \
    -d '{JSON BODY}'
  1. upload_url使用从第一步返回的属性,使用 标头发出PUT请求,"x-ms-blob-type: BlockBlob"并提供文件在磁盘上的位置。 此调用将文件上传到后端存储帐户。 详细了解 PUT Blob 请求标头
curl -X PUT '{upload_url}' \
    -H 'x-ms-blob-type: BlockBlob' \
    --upload-file '{path to file}'
  1. 使用从第一PATCH步返回的属性向symbol_uploads API 发出请求。symbol_upload_id 在请求正文中,指定是要将上传 committed 状态设置为 (上载过程) 成功完成,还是 aborted () 未成功完成。
curl -X PATCH 'https://api.appcenter.ms/v0.1/apps/{owner_name}/{app_name}/symbol_uploads/{symbol_upload_id}' \
    -H 'accept: application/json' \
    -H 'X-API-Token: {API TOKEN}' \
    -H 'Content-Type: application/json' \
    -d '{ "status": "committed" }'

注意

符号上传 API 不适用于大于 256MB 的文件。 使用 App Center CLI 上传这些文件。 可以按照 App Center CLI 存储库中的说明安装 App Center CLI

App Center CLI

还可以使用 CLI 上传符号文件:

appcenter crashes upload-symbols --breakpad {symbols file}

忽略符号

当 App Center 没有用于对故障报告进行完全符号化的所有符号文件时,崩溃将列在“ 取消符号 化”选项卡中。如果有权访问所需的符号,将从此页面上传这些符号。

如果无法上传符号,可以通过选择表中的行并单击“忽略版本”按钮,将它们标记为“已忽略”。 此按钮告知 App Center 处理崩溃,并尽可能使用文件中的符号对其进行符号化。 完成处理后,它们将显示在部分符号化的 “崩溃 ”选项卡中。 同样依赖于标记为“已忽略”的相同符号 ID 的新崩溃将绕过“ 无符号 ”选项卡,因为它们传入并流经系统。