Android NDK

重要

Visual Studio App Center 于 2025 年 3 月 31 日停用,但分析和诊断功能除外,这些功能将继续受支持,直到 2026 年 6 月 30 日。 了解详细信息

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

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

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

未符号化的崩溃

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

注释

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

生成要上传的 .zip 文件

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

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

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

选项 2:上传 Breakpad 符号

  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. 如果应用程序已经报告了需要符号的崩溃,请检查“未符号化”选项卡,并且应该有一个缺少符号的版本组,请单击它以显示上传文件的菜单。
  5. App Center 为符号编制索引后,崩溃日志将被符号化处理。

App Center API

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

  1. POST触发对symbol_uploads API 的请求。 此调用为您的文件在后端分配空间,并分别返回一个symbol_upload_id属性和一个upload_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_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 将绕过 未配置 选项卡,因为它们传入并流经系统。