Skip to content

feat(diagnostics): crash and startup reports from snapshot builds - #620

Merged
whes1015 merged 3 commits into
mainfrom
feat/prerelease-diagnostics
Oct 16, 2026
Merged

whes1015 merged 3 commits into
mainfrom
feat/prerelease-diagnostics

Conversation

@whes1015

@whes1015 whes1015 commented Oct 15, 2026 •

Copy link
Copy Markdown
Member

Stack 第 1/2 層:#620 → #621,請由下往上合併(#614、#616、#615、#618、#619 已合併)。這是最底層,base 是 main。

這個 PR 做了什麼

目前只看得到自己手上那幾支手機的問題:CrashSink 只有介面沒有實作,啟動時間只寫進裝置 log,iOS 推播有沒有送到也無從得知。這個 PR 加上只在 snapshot(預覽版)建置啟用的診斷:當機回報、啟動與畫格時間摘要,以及 iOS 推播送達紀錄。正式版不收集任何資料。

改動內容

正式程式碼

  • 5d4cee03 snapshot 建置回報當機
    • 新增 firebase_crashlytics: 5.2.4(固定版本)。這是和 firebase_core 4.11.0 同一批釋出的版本,已從 pub cache 確認 podspec、Package.swift、Gradle 都不會提高最低版本:iOS 15.0、Android minSdk 23、firebase-ios-sdk 12.15.0、Android BoM 34.15.0 都相同。之後的 5.2.x 都需要更新的 firebase_core。
    • 哪些建置會送: debug、profile,以及 release.yml 標上 --dart-define=DPIP_PRERELEASE=true 的 release 建置(只有 snapshot)。其他一律視為正式版,包括沒有標記的 release 建置,所以漏標時是安全的。prerelease 輸出原本就存在於 release.yml,這裡只是傳下去。
    • 預設關閉收集: AndroidManifest 的 meta-data 和 Info.plist 的 key。SDK 會跨啟動記住開關,所以正式版每次啟動都會重新關掉並刪除未送出的報告。
    • 送什麼: 網路錯誤不送;同一個錯誤每個 session 只送一次;每個 session 最多 8 則。custom key:版本標籤/代碼、安裝來源、RAM、Android SDK、render tier。Log 的內容不會送出,因為有些含座標。
    • 修正 Android 啟動崩潰: 沒套 Crashlytics Gradle plugin 時,SDK 會在啟動時直接結束程序(所有建置都會)。用 res/values/crashlytics.xml 關掉 build-ID 檢查;release 的資源壓縮會刪掉這個設定,所以也列進 res/raw/keep.xml(要用底線拼法,點號拼法不會命中)。
  • 426a39f1 snapshot 建置回報啟動時間摘要
    • bootstrap 各階段時間,加上 20 秒的畫格時間(最多 1,200 格),只計算首頁或地圖分頁在畫面上時的畫格。
    • 回報 build/raster 的 p50/p90/p99,慢格以裝置自己的更新率判斷。
    • 每個 session 最多一則 non-fatal StartupPerformanceReport,數字放在 custom key;少於 60 格不送,debug 建置不送。
  • 4906aff1 iOS 用 Notification Service Extension 記錄推播送達
    • 新的 ios/NotificationService target:每則推播寫一行(id、頻道、APNs id,不含標題和內容)到既有的 app-group log ring;app 啟動時本來就會把這個 ring 匯入 app 內 log,所以 Dart 端不用改。
    • 絕不延遲通知: 不論檔案寫入結果如何,200 ms 內原封不動交回內容。
    • 設定:bundle id com.exptech.dpip.dpip.NotificationService、team 98Q7JARYZF、iOS 15.0、app-group entitlement、嵌入 Runner。
    • 推播的 aps 要帶 mutable-content: 1 擴充才會執行;這部分在後端另外處理。

測試

  • 建置管道判斷、收集開關、限流、去重、custom key、畫格摘要與送出條件。
  • 6 個新的 Swift 測試(NSE 的紀錄格式與時間上限)。

相關 issue

沒有對應的 issue。

怎麼驗

  • tool/commit.sh --push 通過(analyze、codegen、全部 Dart 測試)。
  • tool/dev/test_ios.sh 通過,包含 6 個新測試;xcodebuild -list 看得到新 target;未簽章的 release 建置(tool/dev/build.sh ios)裡有 NotificationService.appex,版本和 app 一致。
  • Android API 35 模擬器、壓縮過的 release APK:
    • app 正常啟動;snapshot 建置會打開收集。
    • 在上面覆蓋安裝正式版,第一次啟動約 0.6 秒後關掉收集,之後一直保持關閉。這 0.6 秒內發生的原生崩潰仍會被送出。
    • 模擬器送出的測試事件(包含一則 StartupPerformanceReport)已經出現在專案的 Crashlytics。
  • 合併前必須先做:
    • Apple Developer 後台建立 App ID com.exptech.dpip.dpip.NotificationService,開啟 App Groups 並加入 group.com.exptech.dpip.dpip.widgets。用 API key 自動簽章可能會自己建立,但 PR 的 iOS CI 不簽章,第一次跑 release.yml 前不會有任何檢查。
    • App Store 隱私標籤與 Play 資料安全表單:snapshot 建置現在會收集當機和效能資料(不連結身分、不用於追蹤),可能也要更新隱私權政策。
  • 還沒驗證: 實機收到真實推播時 NSE 的行為,以及簽章後的 archive。
  • 已知限制: iOS 的 dSYM 沒有上傳到 Firebase,原生 iOS 堆疊不會被符號化;Dart 堆疊可以讀。Crashlytics 也會被連結進正式版,模擬器上啟動成本約 11 ms。
  • 沒有做「發送真實推播」測試按鈕:後端沒有可以推送給單一裝置的端點。最接近的是 GET /api/v2/notify/{token},伺服器沒有這個 token 紀錄時回 401,但無法判斷 token 在 Apple/Google 端是否仍有效,也無法確認推播真的送達。

檢查清單

  • tool/check/commits.sh 通過
  • 一個 commit 一件事
  • analyze 與測試通過(tool/commit.sh --push)
  • 沒有新的使用者可見字串
  • 沒有 UI 變更

@codecov

codecov Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 81.81818% with 32 lines in your changes missing coverage. Please review.
✅ Project coverage is 94.49%. Comparing base (15abd92) to head (4906aff).

Files with missing lines Patch % Lines
lib/core/diagnostics/crash_reporting.dart 68.42% 12 Missing ⚠️
lib/bootstrap.dart 0.00% 9 Missing ⚠️
lib/core/diagnostics/prerelease_diagnostics.dart 86.66% 6 Missing ⚠️
lib/app/shell/main_shell.dart 50.00% 5 Missing ⚠️

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@whes1015

Copy link
Copy Markdown
Member Author

Force-push:rebase 到目前的 main(807f5d9d),並把開著的 PR 排成 stack:#614 → #616 → #615 → #618 → #619 → #620 → #621,base 改成下面那一層的分支。

和 main 及其他 PR 的衝突都是兩邊各自新增的內容,雙方都保留;ARB 在檔尾補逗號後重新產生 l10n。每一層都單獨跑過 analyze 和完整測試,頂端跑過 tool/commit.sh --push。

這一層的 commit 內容沒有變,只有上下文不同。

@whes1015
whes1015 added this pull request to stack #626 October 16, 2026 19:21
@whes1015
whes1015 force-pushed the feat/prerelease-diagnostics branch from 08078a5 to 5275159 Compare October 16, 2026 19:31
@whes1015

Copy link
Copy Markdown
Member Author

Force-push:#614 合併後 rebase 到新的 main(238297ea),拿掉 #614 合併前的舊 commit。

內容沒有變:main 上合併進來的 tree 和 stack 第一層完全相同,搬過去之後每一層的 tree 也都和之前一樣,所以先前各層的 analyze 和測試結果仍然有效。

@whes1015
whes1015 force-pushed the feat/prerelease-diagnostics branch from 5275159 to 4fbc054 Compare October 16, 2026 19:37
@whes1015

Copy link
Copy Markdown
Member Author

Force-push:#616 合併後 rebase 到新的 main(34336fb6),拿掉 #616 合併前的舊 commit。

內容沒有變:main 上合併進來的 tree 和 stack 第一層完全相同,搬過去之後每一層的 tree 也都和之前一樣。push 前 gate 全過。

@whes1015
whes1015 force-pushed the feat/prerelease-diagnostics branch from 4fbc054 to 4d77652 Compare October 16, 2026 19:44
@whes1015
whes1015 force-pushed the feat/prerelease-diagnostics branch from 4d77652 to 76105f1 Compare October 16, 2026 19:48
@whes1015

Copy link
Copy Markdown
Member Author

Force-push:#615、#618 合併後 rebase 到新的 main(690e746f)。

「Update branch」會把這一層疊在下面那層 commit 的副本上,所以先前多出 #615、#618 的重複 commit;這次 rebase 把它們拿掉了。內容沒有變:每一層的 tree 和之前相同,push 前 gate 全過。

Base automatically changed from fix/small-ux-and-perf to main October 16, 2026 19:50
Platform: all

New(zh-Hant): 測試版會自動把錯誤回報給開發團隊,正式版不會傳送任何錯誤報告
New(en-US): snapshot builds report errors to the developers automatically;
  release builds send no error reports
Platform: all

New(zh-Hant): 測試版會回報啟動速度與地圖畫面的流暢度,協助改善低階手機的效能
New(en-US): snapshot builds report launch time and map smoothness, to help
  speed the app up on low-end phones
@whes1015
whes1015 force-pushed the feat/prerelease-diagnostics branch from 76105f1 to 4906aff Compare October 16, 2026 19:53
@whes1015

Copy link
Copy Markdown
Member Author

Force-push:#619 合併後 rebase 到新的 main(15abd92d),拿掉 #619 合併前的舊 commit。

內容沒有變:每一層的 tree 和之前相同,push 前 gate 全過。

@whes1015
whes1015 merged commit e4075e6 into main Oct 16, 2026
8 checks passed
@whes1015
whes1015 deleted the feat/prerelease-diagnostics branch October 16, 2026 20:21
@lowrt lowrt added this to the v26.4 milestone Oct 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants