fuchsia.feedback

新增:7

通訊協定

ComponentDataRegister

定義於 fuchsia.feedback/data_register.fidl

註冊可附加在意見回饋報告 (當機、使用者意見回饋或錯誤報告) 中的實用資料。

元件可使用這項功能,擴充所有意見回饋報表附加的資料。根據預設,意見回饋服務會附加向平台公開的資料。如果某些產品中的特定元件知道資料,但未向平台公開,這個通訊協定就很有用。

ZX_ERR_INVALID_ARGS 墓誌銘表示用戶端傳送的要求無效。請參閱下方說明,瞭解各項要求可能無效的原因。

ZX_ERR_NO_RESOURCES 墓誌銘表示伺服器無法再儲存其他元件資料,且不會為新連線提供服務。

新增或更新

更新或插入要納入意見回饋報告的額外元件資料。

系統會根據命名空間和每個註解鍵,決定要更新或插入註解。如果相同命名空間中的指定鍵已有註解,請更新值,否則請在該命名空間下插入具有該鍵的註解。

舉例來說,假設伺服器已保留這些資料 (來自先前對 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 伺服器的設定。

警告:這項作業可能需要幾分鐘才能完成。不建議以同步方式呼叫這個函式。

新增:11

要求

名稱類型
report CrashReport

回應

名稱類型
payload CrashReporter_FileReport_Result

CrashReportingProductRegister

定義於 fuchsia.feedback/crash_register.fidl

允許元件選擇不同的當機回報產品,以便回報該元件的當機情形。

根據預設,平台偵測到的所有當機事件都會歸入當機伺服器上的單一產品。這個 API 可讓元件選擇自己的產品,同時仍可受益於平台的例外狀況處理和當機回報功能。

新增或更新

更新或插入指定元件網址的當機回報產品。

如果後續對同一個元件網址呼叫 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

提供可附加至意見回饋報告的實用資料,例如系統提交的當機報告、使用者提交的使用者意見回饋報告,或開發人員提交的錯誤報告。

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 字串索引鍵。註解是簡短字串,例如主機板名稱或建構版本。

新增:23

欄位類型說明預設
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

新增:11

名稱值說明
0
1
2
3
4

FilingSuccess 彈性

類型:uint32

定義於 fuchsia.feedback/crash_reporter.fidl

「記憶體」是指非永久位置,例如記憶體支援的檔案系統。

新增:11

名稱值說明
0
1
2
3
4

RebootReason 彈性

類型:uint16

定義於 fuchsia.feedback/last_reboot_info.fidl

裝置上次重新啟動的原因。

名稱值說明
0

如果伺服器傳送了用戶端未編譯的新列舉值,用戶端就會取得這個值。

新增:9
2

裝置從冷啟動狀態啟動。

這很可能是因為裝置長時間未通電,或首次使用 Fuchsia 啟動。

3

裝置因短暫斷電而重新啟動。

在某些硬體上,這可能是因為使用者快速連續拔除並重新連接裝置的電源。

4

裝置電壓低於允許值,但未降至 0,因此重新啟動。

5
6
7
8
19

使用者空間根工作終止,因此裝置重新啟動,這很可能是因為其中一項重要程序異常終止。

28

使用者刻意按住電源鍵,強制重設裝置,因此裝置重新啟動。

新增:31
9

裝置使用者啟動重新啟動程序,因此裝置已重新啟動。

請勿用於任何與使用者明確重新啟動動作無直接關聯的程式碼路徑。請改用下方的 DEVELOPER_REQUEST。

26

裝置因當機而由使用者重新啟動。

新增:31
22

開發人員啟動重新啟動程序,通常是透過殼層指令或類似介面 (包括在自動化測試中),因此裝置重新啟動。

新增:28
17

套用 OTA 失敗,因此裝置重新啟動,我們想重試。

11

系統判定裝置過熱,因此重新啟動。

12

裝置因工作階段問題而重新啟動,或工作階段管理員無法從錯誤中復原。

15

系統管理員 (sysmgr) 無法從錯誤中復原,因此裝置重新啟動。

14

裝置已恢復原廠設定並重新啟動。 請參閱 fuchsia.recovery.FactoryReset。

16

sysmgr 管理的重要元件故障,因此裝置重新啟動。

18

裝置已重新啟動,套用 Zircon 開機映像檔的切換。

21

Starnix 無法辨識 Android 啟動重新啟動的原因。

新增:28
25

Android 啟動關機程序,但 Starnix 不知道原因。

新增:30
23

Android 呼叫「RescueParty」,因此裝置重新啟動。

新增:29
24

Android 的其中一項重要程序失敗,因此裝置重新啟動。

新增:29
27

裝置電池電量耗盡。

新增:31
29

系統無法在預期時間內暫停或恢復。

新增:32
30

重要驅動程式庫故障,導致裝置重新啟動。

新增:HEAD
10

裝置因 OTA 重新啟動。

20

Netstack 元件正在變更版本。

移除:NEXT 新增:26

ShutdownAction 彈性

類型:uint32

定義於 fuchsia.feedback/last_reboot_info.fidl

裝置上次關機的方式。

新增:29

名稱值說明
1
2
3
4

TABLES

註解

定義於 fuchsia.feedback/data_provider.fidl

裝置狀態的註解。

客戶通常會直接將資料上傳到伺服器。因此,資料會以任意鍵/值組合的形式傳送,用戶端可以直接轉送至伺服器。

序數欄位類型說明
annotations2 vector<Annotation>:512

鍵/值字串組合的向量。鍵保證不重複。

新增:25

ComponentData

定義於 fuchsia.feedback/data_register.fidl

元件已知但未向平台公開的資料,可附加至意見回饋報告。

序數欄位類型說明
namespace string:32

與資料相關聯的頂層命名空間:

  • 用於將相關資料分組,並減少命名空間之間的資料鍵衝突。
  • 可由多個用戶端共用,例如,同一個元件或多個元件中可能有多個用戶端想要公開相關資料,且這些用戶端都會使用相同的命名空間。
  • 在所有意見回饋報告中,系統會將這個前置字串加到該命名空間內傳遞的每個資料鍵前面。舉例來說,如果命名空間是「foo」,則在所有意見回饋報告中,註解「version」會顯示為「foo.version」。
  • 必須符合 [a-z-]+,也就是只能使用小寫英文字母和連字號,否則會導致 ZX_ERR_INVALID_ARGS 墓誌銘。
  • 不得與平台資料內部使用的保留命名空間 (例如「build」) 相符,否則會導致 ZX_ERR_INVALID_ARGS 墓誌銘。保留的命名空間清單為內部清單,目前可能會有變動。
annotations vector<Annotation>:16

鍵/值字串組合的向量,例如 <"version", "1.2.3.45">。

金鑰:

  • 應為不重複的值,因為系統只會考量向量中指定鍵的最新值。
  • 必須符合 [a-z-.]+,也就是只能使用小寫英文字母、連字號和半形句號。使用句號建立子命名空間,例如「build.label」和「build.type」,這樣一來,相關註解 (此處與「build」相關) 就會按照字母順序分組。

CrashReport 資源

定義於 fuchsia.feedback/crash_reporter.fidl

代表當機報告。

序數欄位類型說明
program_name string:1024

當機程式的名稱,例如程序或元件的名稱。

在內部,程式名稱用於在無法立即上傳報告時保留報告。因此,當做檔案系統路徑使用時,系統會進行清理,例如移除任何 fuchsia-pkg:// 前置字元。如果經過清理的程式名稱為下列任一項,系統會傳回 ZX_ERR_INVALID_ARGS:

  • ""
  • "。
  • ".."
specific_report SpecificCrashReport

特定報表,取決於當機類型。

如需傳送當機程式的其他資訊 (例如小型傾印),請設定這個欄位。

annotations vector<Annotation>:32

鍵/值字串組合的向量,代表應附加至當機報告的任意資料。

鍵不得重複,因為系統只會考量向量中指定鍵的最新值。

attachments vector<Attachment>:16

鍵/值字串對 VMO 配對的向量,代表應附加至當機報告的任意資料。

鍵不得重複,因為系統只會考量向量中指定鍵的最新值。

如果符合下列任一情況,系統會傳回 ZX_ERR_INVALID_ARGS:

  • 鍵為「」
  • a 鍵是「.」
  • 鍵為「..」
  • 鍵包含正斜線「/」
  • 鍵包含空格「 」
  • 金鑰包含可列印 ASCII 以外的字元
  • 意見回饋專用鍵:
    • annotations.json
    • minidump.dmp
    • snapshot_uuid.txt
    • snapshot.zip
    • uploadFileMinidump
event_id string:128

當機伺服器可使用的文字 ID,用於將與同一事件相關的多個當機報告分組。

與當機簽章不同,共用相同 ID 的當機報告對應到不同的當機,但可以視為屬於同一個事件,例如低層級伺服器當機導致高層級 UI 小工具當機。

program_uptime zx/Duration

程式在當機前執行的時間。

crash_signature string:128

當機伺服器可用來追蹤相同異常終止情形的文字簽章,例如「核心錯誤」或「記憶體不足」。這個簽章的優先順序高於從其餘資料衍生的任何自動簽章。

與事件 ID 不同,共用相同簽章的當機報告對應到相同的當機,但發生在多個事件中,例如,每當伺服器收到相同要求時,就會發生空值指標例外狀況。

必須符合 [a-z][a-z-]*,也就是只能使用小寫英文字母和連字號,否則會導致 ZX_ERR_INVALID_ARGS 墓誌銘。

is_fatal bool

指出當機報告是否針對執行中程序、元件或系統本身的非典型停止。

以下是會導致嚴重當機報告的事件範例:

  • ELF 程序異常終止
  • 系統因記憶體不足而重新啟動。
  • 系統因重要元件當機而重新啟動。
  • 裝置過熱,系統重新啟動。

以下是會產生非致命當機報告的事件示例:

  • Dart 程式中未捕捉到的例外狀況,其中包含多個執行環境。執行階段可能會選擇終止該特定執行環境,並為其提交當機報告,而不是整個程式。
  • 偵測到嚴重事件 (例如 OOM) 的元件可能很快就會發生,但不保證一定會發生。

這個欄位主要用於將當機情形分為致命、非致命和未知,分別對應到設為 true、設為 false 或未設定的欄位。

weight uint32

選用。用於表示這份報告不只代表這個當機例項。舉例來說,如果選擇每 10 個這類當機事件只回報 1 個,則應將這個欄位設為 10。

如未設定這個欄位,則會使用權重 1。明確設定的值為 0 則無效,系統會拒絕。

新增:28

CrashReportingProduct

定義於 fuchsia.feedback/crash_register.fidl

要回報給當機伺服器的產品資訊。

序數欄位類型說明
name string

當機伺服器上的產品名稱。

  • 第一個字元必須是英數字元。其餘字元必須是可顯示的字元,但不能是空格,因此 ASCII 表中的值為 33 到 127。任何其他字元都會導致 ZX_ERR_INVALID_ARGS 墓誌銘。
  • 如果缺少這個必要欄位,會導致 ZX_ERR_INVALID_ARGS 墓誌銘。
version string

元件的產品版本 (選用)。

  • 第一個字元必須是英數字元。其餘字元必須是可顯示的字元,但不能是空格,因此 ASCII 表中的值為 33 到 127。任何其他字元都會導致 ZX_ERR_INVALID_ARGS 墓誌銘。

如未指定版本,則不會向當機伺服器回報任何版本。

channel string

元件的選用產品發布管道,例如「canary」、「beta」、「stable」。

如未指定,就不會向當機伺服器回報任何管道。

FileReportResults

定義於 fuchsia.feedback/crash_reporter.fidl

新增:11

序數欄位類型說明
result FilingSuccess

成功類型。

report_id string:64

如果 |result| 為 FilingSuccess::REPORT_UPLOADED,則為非空值。

GetAnnotationsParameters

定義於 fuchsia.feedback/data_provider.fidl

DataProvider::GetAnnotations() 方法的參數。

序數欄位類型說明
collection_timeout_per_annotation zx/Duration

系統會從平台上的多個位置平行收集註解,每個位置都有逾時限制。

collection_timeout_per_annotation 可讓用戶端控管每個註解集合的時間。用戶端可在特定時間內取得部分註解。

GetSnapshotParameters 資源

定義於 fuchsia.feedback/data_provider.fidl

DataProvider::GetSnapshot() 方法的參數。

序數欄位類型說明
collection_timeout_per_data zx/Duration

快照會匯總從平台平行收集的各種資料 (裝置運作時間、記錄、檢查資料等)。在內部,每項資料收集作業都會在逾時時間內完成。

collection_timeout_per_data 可讓用戶端控制每次資料收集的時間。用戶端可藉此在特定時間內取得部分但有效的快照。

請注意,這項設定不會控管快照生成作業可能耗費的總時間,因為用戶端可以透過在呼叫 GetSnapshot() 時設定逾時時間,來控管總時間,因此總時間在結構上會高於 collection_timeout_per_data。

response_channel handle<channel>

如果設定,系統會透過這個管道將快照封存檔傳送為 |fuchsia.io.File|,而不是在 |Snapshot| 回應的 |archive| 欄位中設定。如果用戶端位於主機上,且不支援 VMO,這個方法通常很實用。

LastReboot

定義於 fuchsia.feedback/last_reboot_info.fidl

裝置上次重新啟動的原因。

序數欄位類型說明
graceful bool

上次重新啟動是否正常,也就是裝置並非因錯誤而重新啟動,而是以受控方式重新啟動。

用戶端可透過這個欄位,瞭解上次重新啟動是否正常,而不必剖析選用的 |reason| 欄位。如果未設定 |reason| (例如系統只知道重新啟動正常,但不知道其他資訊),或 API 演進到支援新的 RebootReason 值,但用戶端尚未更新,這個方法就很有用。

如果提供 |reason|,這個欄位一律會有值。不過,|reason| 不一定會提供這個欄位的值。

reason RebootReason

裝置上次重新啟動的原因。

uptime zx/Duration

裝置重新啟動前的正常運作時間。這是自開機後經過的時間,包括在暫停至閒置狀態的時間。

planned bool

上次重新啟動是否為預定,即裝置是否按照系統套用的排程重新啟動。

用戶端可透過這個欄位,瞭解上次重新啟動是否為預定作業,不必剖析 |reason| 欄位。

計畫性重新啟動作業本質上是正常關機。

新增:26
runtime zx/Duration

裝置重新啟動前的執行時間。這是指自開機以來經過的時間,不包括在暫停至閒置狀態中花費的時間。

新增:27
action ShutdownAction

裝置上次關機的方式。

新增:29

NativeCrashReport 資源

定義於 fuchsia.feedback/crash_reporter.fidl

代表原生例外狀況的當機報告,用戶端已根據該例外狀況建立 minidump。

序數欄位類型說明
minidump fuchsia.mem/Buffer

Minidump 格式的核心 dump。

process_name string:64

當機程序的名稱。

process_koid zx/Koid

當機程序的核心物件 ID。

thread_name string:64

當機執行緒的名稱。

thread_koid zx/Koid

當機執行緒的核心物件 ID。

RuntimeCrashReport 資源

定義於 fuchsia.feedback/crash_reporter.fidl

代表執行階段例外狀況的當機報告,適用於大多數語言。

序數欄位類型說明
exception_type string:128

例外狀況類型,例如「FileSystemException」。

exception_message string:4096

例外狀況訊息,例如「無法開啟檔案」。

exception_stack_trace fuchsia.mem/Buffer

例外狀況堆疊追蹤的文字表示法。

快照資源

定義於 fuchsia.feedback/data_provider.fidl

裝置狀態的快照。

客戶通常會直接將資料上傳到伺服器。因此,資料會以任意鍵/值組合的形式傳送,用戶端可以直接轉送至伺服器。

序數欄位類型說明
archive Attachment

<檔案名稱, ZIP 封存檔> 配對。

ZIP 封存檔包含多個檔案,對應從平台收集的各種資料。通常會有一個檔案包含所有註解 (裝置運作時間、建構版本等),以及一個檔案包含每個附件 (記錄、檢查資料等)。

如果要求中已設定 |response_channel|,則不會設定。

annotations2 vector<Annotation>:512

鍵/值字串組合的向量。鍵保證不重複。

雖然 ZIP 封存檔本身就包含註解,但有些用戶端也希望個別取得註解,以便建立索引或擴充註解,因此我們也會個別提供註解。

新增:25

TextBacktraceCrashReport 資源

定義於 fuchsia.feedback/crash_reporter.fidl

代表含有文字堆疊追蹤的當機報告。

新增:HEAD

序數欄位類型說明
fuchsia_backtrace fuchsia.mem/Buffer

Fuchsia 符號標記格式的回溯文字表示法。

process_name string:64

當機程序的名稱。

process_koid zx/Koid

當機程序的核心物件 ID。

thread_name string:64

當機執行緒的名稱。

thread_koid zx/Koid

當機執行緒的核心物件 ID。

UNIONS

CrashReporter_FileReport_Result strict

定義於 fuchsia.feedback/crash_reporter.fidl

序數Variant類型說明
response CrashReporter_FileReport_Response
err FilingError

SpecificCrashReport 彈性 資源

定義於 fuchsia.feedback/crash_reporter.fidl

代表特定當機報告。

如果伺服器需要特殊案例,說明如何處理特定類型當機事件的特定註解和附件,請新增成員,例如 Javascript 的 RuntimeCrashReport。

序數Variant類型說明
native NativeCrashReport

用於原生例外狀況。

dart RuntimeCrashReport

適用於 Dart 例外狀況。

text_backtrace TextBacktraceCrashReport

適用於 Fuchsia 符號標記格式的文字堆疊追蹤。

新增: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