协议
ComponentDataRegister
在 fuchsia.feedback/data_register.fidl 中定义
注册可在反馈报告(崩溃、用户反馈或 bug 报告)中附加的有用数据。
组件可以使用此功能来扩充附加到所有反馈报告的数据。默认情况下,反馈服务会附加向平台公开的数据。此协议适用于某些产品中的某些组件已知但未向平台公开的数据。
墓志铭 ZX_ERR_INVALID_ARGS 表示客户端正在发送无效请求。请参阅下文,了解每个请求可能无效的原因。
墓志铭 ZX_ERR_NO_RESOURCES 表示服务器无法再存储其他组件数据,并且不会为新连接提供服务。
Upsert
更新或插入要包含在反馈报告中的额外组件数据。
系统会根据命名空间和每个注释键来决定是更新还是插入注释。如果同一命名空间中已存在给定键的注释,则更新该值,否则在该命名空间下插入具有该键的注释。
例如,假设服务器已保存以下数据(来自之前对 Upsert() 的调用):
{
"bar": { # namespace
"channel": "stable",
},
"foo": { # namespace
"version": "0.2",
}
}
然后:
Upsert({
"namespace": "bar",
"annotations": [
"version": "1.2.3.45",
"channel": "beta",
]
})
会导致服务器现在持有:
{
"bar": { # namespace
"channel": "beta", # updated
"version": "1.2.3.45" # inserted
},
"foo": { # namespace
"version": "0.2", # untouched
}
}
请注意,服务器每个命名空间最多只能保留 MAX_NUM_ANNOTATIONS_PER_NAMESPACE 个不同的注释键,并会提取最新值。
请求
| 名称 | 类型 |
|---|---|
data |
ComponentData
|
响应
<EMPTY>
CrashReporter
在 fuchsia.feedback/crash_reporter.fidl 中定义
提供提交崩溃报告的功能。
FileReport
提交崩溃 report 并给出操作的最终结果。
这可能意味着在本地崩溃报告数据库中生成崩溃报告,或将崩溃报告上传到远程崩溃服务器,具体取决于 FIDL 服务器的配置。
警告:此操作可能需要几分钟时间。不建议以同步方式调用此函数。
请求
| 名称 | 类型 |
|---|---|
report |
CrashReport
|
响应
| 名称 | 类型 |
|---|---|
payload |
CrashReporter_FileReport_Result
|
CrashReportingProductRegister
在 fuchsia.feedback/crash_register.fidl 中定义
允许组件选择其他崩溃报告产品,以便在该产品下提交该组件的崩溃报告。
默认情况下,平台检测到的所有崩溃都会归入崩溃服务器上的单个产品下。此 API 允许组件选择自己的产品,同时仍可受益于平台的异常处理和崩溃报告。
Upsert
针对给定组件网址,更新或插入崩溃报告产品。
后续对同一组件网址调用 Upsert() 会覆盖该组件的 CrashReportingProduct。
如果组件本身也会提交崩溃报告,请首选 UpsertWithAck(),以避免竞态条件和错误归因。
请求
| 名称 | 类型 |
|---|---|
component_url |
string:2083
|
product |
CrashReportingProduct
|
UpsertWithAck
执行 upsert 操作(见上文),并在操作完成后通知客户端。
这样,客户端就可以防止在提交崩溃报告和调用 Upsert 之间发生竞态。 否则,如果在 upsert 完成之前提交了崩溃报告,该崩溃报告将被归因于错误的产品,从而可能导致崩溃数据不正确。
请求
| 名称 | 类型 |
|---|---|
component_url |
string:2083
|
product |
CrashReportingProduct
|
响应
<EMPTY>
DataProvider
在 fuchsia.feedback/data_provider.fidl 中定义
提供可附加到反馈报告中的有用数据,例如系统提交的崩溃报告、用户提交的用户反馈报告或开发者提交的 bug 报告。
GetAnnotations
返回一组关于设备状态的注释。
如果收集 annotations 时出现问题,则该字段可能为空。
这些注释与通过 GetSnapshot() 提供的注释相同。有些客户端只需要注释,而有些客户端则需要注释和快照,并且生成快照可能比收集注释花费的时间要长得多,例如,日志只是快照的一部分,而不是注释的一部分,可能需要一些时间。
请求
| 名称 | 类型 |
|---|---|
params |
GetAnnotationsParameters
|
响应
| 名称 | 类型 |
|---|---|
annotations |
Annotations
|
GetSnapshot
返回设备状态的快照。
如果生成快照时出现问题,snapshot 可能为空。
请求
| 名称 | 类型 |
|---|---|
params |
GetSnapshotParameters
|
响应
| 名称 | 类型 |
|---|---|
snapshot |
Snapshot
|
DeviceIdProvider
在 fuchsia.feedback/device_id_provider.fidl 中定义
提供设备的反馈 ID。
反馈 ID 是一个持久性 UUID,用于对反馈报告进行分组。该 ID 不得用于反馈以外的任何报告用途,例如,不得用于遥测。
GetId
返回设备的反馈 ID。
此方法遵循 hanging-get 模式,在自上次调用以来的 ID 发生更改之前,不会返回值。
请求
<EMPTY>
响应
| 名称 | 类型 |
|---|---|
feedback_id |
string:64
|
LastRebootInfoProvider
在 fuchsia.feedback/last_reboot_info.fidl 中定义
获取有关设备上次关机原因的信息。我们使用术语“重新启动”而不是“关机”,因为许多开发者会用“重新启动”来表达有关关机的问题,并且大多数组件都想知道系统为何刚刚重新启动。
获取
请求
<EMPTY>
响应
| 名称 | 类型 |
|---|---|
last_reboot |
LastReboot
|
STRUCTS
注释
在 fuchsia.feedback/annotation.fidl 中定义
注释及其纯 ASCII 字符串键。 注释是简短的字符串,例如开发板名称或 build 版本。
| 字段 | 类型 | 说明 | 默认 |
|---|---|---|---|
key |
string:128
|
无默认应用 | |
value |
string:1024
|
无默认应用 |
附件资源
在 fuchsia.feedback/attachment.fidl 中定义
附件及其纯 ASCII 字符串键。 附件是较大的对象,例如日志文件。它们可能是二进制数据或文本数据。
| 字段 | 类型 | 说明 | 默认 |
|---|---|---|---|
key |
string:128
|
无默认应用 | |
value |
fuchsia.mem/Buffer
|
无默认应用 |
CrashReporter_FileReport_Response
在 fuchsia.feedback/crash_reporter.fidl 中定义
| 字段 | 类型 | 说明 | 默认 |
|---|---|---|---|
results |
FileReportResults
|
无默认应用 |
枚举
FilingError 灵活
类型:uint32
在 fuchsia.feedback/crash_reporter.fidl 中定义
| 名称 | 值 | 说明 |
|---|---|---|
未知 |
0 |
|
INVALID_ARGS_ERROR |
1 |
|
SERVER_ERROR |
2 |
|
PERSISTENCE_ERROR |
3 |
|
QUOTA_REACHED_ERROR |
4 |
FilingSuccess flexible
类型:uint32
在 fuchsia.feedback/crash_reporter.fidl 中定义
“内存”是指非永久性位置,例如内存支持的文件系统。
| 名称 | 值 | 说明 |
|---|---|---|
未知 |
0 |
|
REPORT_UPLOADED |
1 |
|
REPORT_ON_DISK |
2 |
|
REPORT_IN_MEMORY |
3 |
|
REPORT_NOT_FILED_USER_OPTED_OUT |
4 |
RebootReason flexible
类型:uint16
在 fuchsia.feedback/last_reboot_info.fidl 中定义
设备上次重启的原因。
| 名称 | 值 | 说明 |
|---|---|---|
未知 |
0 |
如果服务器发送的新枚举值未在客户端中编译,则客户端将获取此值。 新增:9
|
冷 |
2 |
设备从冷状态启动。 这很可能是因为设备长时间断电,或者设备首次使用 Fuchsia 启动。 |
BRIEF_POWER_LOSS |
3 |
设备因短暂断电而重启。 在某些硬件上,这可能是用户快速连续断开并重新连接设备电源的结果。 |
BROWNOUT |
4 |
设备已重启,因为其电压降至允许的水平以下,但未降至 0。 |
KERNEL_PANIC |
5 |
|
SYSTEM_OUT_OF_MEMORY |
6 |
|
HARDWARE_WATCHDOG_TIMEOUT |
7 |
|
SOFTWARE_WATCHDOG_TIMEOUT |
8 |
|
ROOT_JOB_TERMINATION |
19 |
设备因用户空间根作业终止而重启,这很可能是因为其某个关键进程崩溃。 |
USER_HARD_RESET |
28 |
设备重启是因为用户故意按住电源按钮将其硬重置。 新增:31
|
USER_REQUEST |
9 |
设备已重启,因为设备的最终用户发起了重启。 请勿用于任何与最终用户明确重启操作不直接相关的代码路径。 请改用下方的 DEVELOPER_REQUEST。 |
USER_REQUEST_DEVICE_STUCK |
26 |
设备因卡住而由最终用户发起重启。 新增:31
|
DEVELOPER_REQUEST |
22 |
设备重启是因为开发者发起了重启,通常是通过 shell 命令或类似接口(包括在自动化测试中)发起的。 新增:28
|
RETRY_SYSTEM_UPDATE |
17 |
由于应用 OTA 失败,设备已重新启动,我们希望重试。 |
HIGH_TEMPERATURE |
11 |
设备因过热而重启。 |
SESSION_FAILURE |
12 |
设备因会话问题或会话管理器无法从错误中恢复而重启。 |
SYSMGR_FAILURE |
15 |
设备已重启,因为系统管理器 (sysmgr) 无法从错误中恢复。 |
FACTORY_DATA_RESET |
14 |
设备在恢复出厂默认设置后重新启动。 请参阅 fuchsia.recovery.FactoryReset。 |
CRITICAL_COMPONENT_FAILURE |
16 |
设备已重启,因为由 sysmgr 管理的关键组件发生故障。 |
ZBI_SWAP |
18 |
设备已重启,以应用 Zircon 启动映像的交换。 |
ANDROID_UNEXPECTED_REASON |
21 |
Starnix 无法识别的 Android 发起的重启原因。 新增:28
|
ANDROID_NO_REASON |
25 |
由 Android 发起的关机,Starnix 不知道原因。 新增:30
|
ANDROID_RESCUE_PARTY |
23 |
设备因 Android 调用“RescueParty”而重启。 添加:29
|
ANDROID_CRITICAL_PROCESS_FAILURE |
24 |
设备已重启,因为其中一个 Android 关键进程失败。 添加:29
|
BATTERY_DRAINED |
27 |
设备电池电量耗尽。 新增:31
|
SUSPENSION_FAILURE |
29 |
系统未能在预期时间内暂停或恢复。 新增:32
|
CRITICAL_DRIVER_FAILURE |
30 |
设备已重启,因为某个关键驱动程序发生故障。 Added: HEAD
|
SYSTEM_UPDATE |
10 |
设备因 OTA 而重启。 |
NETSTACK_MIGRATION |
20 |
Netstack 组件正在更改版本。 已移除:NEXT 已添加:26
|
ShutdownAction flexible
类型:uint32
在 fuchsia.feedback/last_reboot_info.fidl 中定义
设备上次关机的方式。
| 名称 | 值 | 说明 |
|---|---|---|
POWEROFF |
1 |
|
重启 |
2 |
|
REBOOT_TO_RECOVERY |
3 |
|
REBOOT_TO_BOOTLOADER |
4 |
TABLES
注释
在 fuchsia.feedback/data_provider.fidl 中定义
关于设备状态的注释。
客户通常会将数据直接上传到服务器。因此,数据以任意键值对的形式提供,客户端可以直接将其转发到服务器。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
2 |
annotations2 |
vector<Annotation>:512
|
键值对字符串的向量。键必须是唯一的。 新增:25
|
ComponentData
在 fuchsia.feedback/data_register.fidl 中定义
组件已知但未向平台公开的数据,用于附加到反馈报告。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
namespace |
string:32
|
与数据关联的顶级命名空间:
|
2 |
annotations |
vector<Annotation>:16
|
键值对字符串向量,例如 键:
|
CrashReport 资源
在 fuchsia.feedback/crash_reporter.fidl 中定义
表示崩溃报告。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
program_name |
string:1024
|
发生崩溃的程序的名称,例如进程或组件的名称。 在内部,程序名称用于在无法立即上传报告时保留报告。因此,当用作文件系统路径时,它会被清理,例如,剥离任何 fuchsia-pkg:// 前缀。如果经过清理的程序名称为以下任一名称,则会返回 ZX_ERR_INVALID_ARGS:
|
2 |
specific_report |
SpecificCrashReport
|
具体报告取决于崩溃类型。 如果需要发送有关崩溃程序的其他信息(例如,minidump),则应设置此字段。 |
3 |
annotations |
vector<Annotation>:32
|
一个由键值对字符串组成的向量,表示应附加到崩溃报告的任意数据。 键应具有唯一性,因为系统只会考虑向量中给定键的最新值。 |
4 |
attachments |
vector<Attachment>:16
|
由键值对(字符串到 VMO)组成的向量,表示应附加到崩溃报告的任意数据。 键应具有唯一性,因为系统只会考虑向量中给定键的最新值。 如果满足以下任一条件,系统将返回 ZX_ERR_INVALID_ARGS:
|
5 |
event_id |
string:128
|
崩溃服务器可用于对与同一事件相关的多个崩溃报告进行分组的文本 ID。 与崩溃签名不同,具有相同 ID 的崩溃报告对应于不同的崩溃,但可以被视为属于同一事件,例如,低级服务器中的崩溃导致高级界面 widget 发生崩溃。 |
6 |
program_uptime |
zx/Duration
|
程序在崩溃前运行了多长时间。 |
7 |
crash_signature |
string:128
|
崩溃服务器可用于跟踪同一崩溃随时间变化情况的文本签名,例如“内核崩溃”或“OOM”。此签名将优先于从其余数据派生的任何自动签名。 与事件 ID 不同,具有相同签名的崩溃报告对应于同一崩溃,但发生在多个事件中,例如,每当服务器收到相同请求时,就会发生 null 指针异常。 必须与 [a-z][a-z-]* 匹配,即只能包含小写字母和连字符,否则会导致 ZX_ERR_INVALID_ARGS 墓志铭。 |
8 |
is_fatal |
bool
|
指明崩溃报告是否针对运行中的进程、组件或系统本身的异常停止。 导致严重崩溃报告的事件示例如下:
以下是会导致非严重崩溃报告的事件示例:
此字段主要用于按致命、非致命和未知对崩溃进行分组,分别对应于该字段设置为 true、设置为 false 或未设置。 |
9 |
weight |
uint32
|
可选。用于指明此报告不仅代表此次崩溃。例如,如果选择仅针对每 10 个此类崩溃实例中的 1 个提交 bug,则此字段应设置为 10。 如果未设置该字段,则使用权重 1。明确设置的值 0 无效,将被拒绝。 新增:28
|
CrashReportingProduct
在 fuchsia.feedback/crash_register.fidl 中定义
要向崩溃服务器报告的商品信息。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
name |
string
|
崩溃服务器上的产品名称。
|
2 |
version |
string
|
组件的可选正式版。
如果未指定版本,则不会向崩溃服务器报告任何版本。 |
3 |
channel |
string
|
组件的可选发布渠道,例如“Canary 版”“Beta 版”“正式版”。 如果未指定渠道,则不会向崩溃服务器报告任何渠道。 |
FileReportResults
在 fuchsia.feedback/crash_reporter.fidl 中定义
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
result |
FilingSuccess
|
成功类型。 |
2 |
report_id |
string:64
|
如果 |result| 为 FilingSuccess::REPORT_UPLOADED,则为非空值。 |
GetAnnotationsParameters
在 fuchsia.feedback/data_provider.fidl 中定义
DataProvider::GetAnnotations() 方法的参数。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
collection_timeout_per_annotation |
zx/Duration
|
注解是从平台中的各个位置并行收集的,每个位置都有超时。
|
GetSnapshotParameters 资源
在 fuchsia.feedback/data_provider.fidl 中定义
DataProvider::GetSnapshot() 方法的参数。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
collection_timeout_per_data |
zx/Duration
|
快照会汇总从平台并行收集的各种数据(设备正常运行时间、日志、检查数据等)。在内部,每次数据收集都会在超时时间内完成。
请注意,这并不会控制快照生成可能花费的总时间,该时间在结构上高于 |
2 |
response_channel |
handle<channel>
|
如果设置了此字段,快照归档将通过此通道作为 |fuchsia.io.File| 发送,而不是在 |Snapshot| 响应的 |archive| 字段中设置。如果客户端位于主机上且不支持 VMO,此方法通常很有用。 |
LastReboot
在 fuchsia.feedback/last_reboot_info.fidl 中定义
关于设备上次重启原因的信息。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
graceful |
bool
|
上次重启是否为正常重启,即设备并非因错误而重启,而是以受控方式重启。 此字段可让客户端知道上次重启是否正常,而无需解析可选的 |reason| 字段。如果未设置 |reason|(例如,因为系统只知道重新启动是正常进行的),或者当 API 演变为支持新的 RebootReason 值且客户端尚未更新时,此字段非常有用。 如果提供了 |reason|,则此字段始终有值。不过,即使提供了此字段,|reason| 也可能并不总是有值。 |
2 |
reason |
RebootReason
|
设备上次重启的原因。 |
3 |
uptime |
zx/Duration
|
设备重启前的正常运行时间。这是自启动以来经过的时间,包括在挂起到空闲状态下花费的所有时间。 |
4 |
planned |
bool
|
上次重启是否为计划重启,即设备是否按照系统应用的计划重启。 此字段可让客户端知道上次重启是否是有计划的,而无需解析 |reason| 字段。 计划内重启本质上是正常重启。 添加:26
|
5 |
runtime |
zx/Duration
|
设备在重启前的运行时长。这是自启动以来经过的时间,不包括在挂起到空闲状态下花费的时间。 新增:27
|
6 |
action |
ShutdownAction
|
设备上次关机的方式。 添加:29
|
NativeCrashReport 资源
在 fuchsia.feedback/crash_reporter.fidl 中定义
表示客户端已为其构建小型转储的原生异常的崩溃报告。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
minidump |
fuchsia.mem/Buffer
|
Minidump 格式的核心转储。 |
2 |
process_name |
string:64
|
崩溃进程的名称。 |
3 |
process_koid |
zx/Koid
|
发生崩溃的进程的内核对象 ID。 |
4 |
thread_name |
string:64
|
发生崩溃的线程的名称。 |
5 |
thread_koid |
zx/Koid
|
发生崩溃的线程的内核对象 ID。 |
RuntimeCrashReport 资源
在 fuchsia.feedback/crash_reporter.fidl 中定义
表示运行时异常的崩溃报告,适用于大多数语言。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
exception_type |
string:128
|
异常类型,例如“FileSystemException”。 |
2 |
exception_message |
string:4096
|
异常消息,例如“无法打开文件”。 |
3 |
exception_stack_trace |
fuchsia.mem/Buffer
|
异常堆栈轨迹的文本表示。 |
快照资源
在 fuchsia.feedback/data_provider.fidl 中定义
设备状态的快照。
客户通常会将数据直接上传到服务器。因此,数据以任意键值对的形式提供,客户端可以直接将其转发到服务器。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
archive |
Attachment
|
<文件名, ZIP 归档文件> 对。 ZIP 归档文件包含多个文件,分别对应于从平台收集的各种数据。通常,所有注释(设备正常运行时间、build 版本等)对应一个文件,每个附件(日志、检查数据等)对应一个文件。 如果请求中设置了 |response_channel|,则不设置。 |
3 |
annotations2 |
vector<Annotation>:512
|
键值对字符串的向量。键必须是唯一的。 虽然 ZIP 归档文件本身包含注释,但有些客户也希望单独获取注释,以便对其进行索引或扩充,因此我们也单独提供注释。 新增:25
|
TextBacktraceCrashReport 资源
在 fuchsia.feedback/crash_reporter.fidl 中定义
表示包含文本堆栈轨迹的崩溃报告。
| 序数 | 字段 | 类型 | 说明 |
|---|---|---|---|
1 |
fuchsia_backtrace |
fuchsia.mem/Buffer
|
回溯的文本表示形式,采用 Fuchsia 的符号化标记格式。 |
2 |
process_name |
string:64
|
崩溃进程的名称。 |
3 |
process_koid |
zx/Koid
|
发生崩溃的进程的内核对象 ID。 |
4 |
thread_name |
string:64
|
发生崩溃的线程的名称。 |
5 |
thread_koid |
zx/Koid
|
发生崩溃的线程的内核对象 ID。 |
UNIONS
CrashReporter_FileReport_Result strict
在 fuchsia.feedback/crash_reporter.fidl 中定义
| 序数 | 变体 | 类型 | 说明 |
|---|---|---|---|
1 |
response |
CrashReporter_FileReport_Response
|
|
2 |
err |
FilingError
|
SpecificCrashReport 灵活 资源
在 fuchsia.feedback/crash_reporter.fidl 中定义
表示特定的崩溃报告。
当服务器需要针对特定类型的崩溃(例如 JavaScript 的 RuntimeCrashReport)特殊处理其注释和附件时,添加一个新成员。
| 序数 | 变体 | 类型 | 说明 |
|---|---|---|---|
2 |
native |
NativeCrashReport
|
适用于原生异常。 |
3 |
dart |
RuntimeCrashReport
|
适用于 Dart 异常。 |
4 |
text_backtrace |
TextBacktraceCrashReport
|
适用于 Fuchsia 符号化标记格式的文本堆栈轨迹。 Added: HEAD
|
常量
| 名称 | 值 | 类型 | 说明 |
|---|---|---|---|
| MAX_ANNOTATION_KEY_LENGTH |
128
|
uint64 |
注解键的长度上限。 添加:23
|
| MAX_ANNOTATION_VALUE_LENGTH |
1024
|
uint64 |
注释值的长度上限。 添加:23
|
| MAX_CRASH_SIGNATURE_LENGTH |
128
|
uint32 |
|
| MAX_EVENT_ID_LENGTH |
128
|
uint32 |
|
| MAX_EXCEPTION_MESSAGE_LENGTH |
4096
|
uint32 |
新增:10
|
| MAX_EXCEPTION_TYPE_LENGTH |
128
|
uint32 |
|
| MAX_NAMESPACE_LENGTH |
32
|
uint32 |
|
| MAX_NUM_ANNOTATIONS2_PROVIDED |
512
|
uint32 |
新增:25
|
| MAX_NUM_ANNOTATIONS_PER_CRASH_REPORT |
32
|
uint32 |
|
| MAX_NUM_ANNOTATIONS_PER_NAMESPACE |
16
|
uint32 |
|
| MAX_NUM_ATTACHMENTS_PER_CRASH_REPORT |
16
|
uint32 |
|
| MAX_PROCESS_NAME_LENGTH |
64
|
uint32 |
|
| MAX_PROGRAM_NAME_LENGTH |
1024
|
uint32 |
|
| MAX_REPORT_ID_LENGTH |
64
|
uint32 |
新增:11
|
| MAX_THREAD_NAME_LENGTH |
64
|
uint32 |