在 Android 12 中使用 DebugFS

如果裝置推出時的版本是 Android 12,且核心版本為 5.4 以上版本,則必須搭配 GKI 核心出貨。為了讓合作夥伴在使用 GKI 核心進行開發時,能夠在 userdebug 版本中存取 DebugFS,我們在 GKI defconfig 中啟用了核心設定 CONFIG_DEBUG_FS在 Android 12 上啟動裝置時,請勿在使用者版本中掛載 DebugFS

相較於使用者版本,Userdebug 版本的測試涵蓋率更高,且會在整個開發週期中接受大量測試。下列企劃書可將兩種建構類型在 DebugFS 存取權方面的差異降到最低,並提供以下優點:

  • 避免使用者偵錯版本意外依賴 DebugFS 取得新功能
  • 確保在開發週期初期,就能瞭解缺少 DebugFS 而導致的任何現有功能故障

在使用者偵錯版本中的 Debugfs 存取權分類如下:

  1. 裝置啟動期間的 DebugFS 檔案初始化作業,例如對 DebugFS 中的檔案執行寫入存取權,以便啟用偵錯資料收集作業。
  2. 產生 Bugreport:當 DumpstateBoard()dumpstate 叫用時,dumpstate HAL 會讀取 DebugFS 檔案。這項資訊會成為錯誤報告的一部分。
  3. 裝置專屬測試和驗證。

下表說明 Android 12 如何支援這三個類別。請注意,由於 DebugFS 無法在使用者版本中掛載,因此以下內容僅適用於 userdebug 版本。

用途 Android 12 使用者偵錯版本
在啟動期間初始化一次性 DebugFS 檔案。這項存取作業在啟動期間只會發生一次 Dumpstate HAL 會在 HAL 初始化期間執行這項操作。如要啟用相同功能,請在 HAL 初始化前,在 userdebug 版本中初始化掛載 DebugFSInit 會在裝置完成啟動時,對 DebugFS 呼叫 umount()
錯誤報告產生:dumpstate HAL 會讀取 DebugFS 檔案,並納入錯誤報告。 DumpstateBoard() 中的 dumpstate HAL 在由 dumpstate 呼叫時執行 (DumpstateDevice.cpp)。傾印狀態工具 (Android 架構的一部分) 可確保 DebugFS 在叫用期間掛載。
裝置專屬測試和驗證 ADB 根目錄和殼層。透過具有根存取權的 ADB 殼層1掛載 DebugFS

1如要透過 adb shell 以 root 存取權掛載 DebugFS,請使用下列指令:

adb shell mount -t debugfs debugfs /sys/kernel/debug

合作夥伴必須採取的行動

合作夥伴必須根據 Android 12 裝置的這些變更實施下列事項:

  • 請在 dumpstate HAL 初始化期間,執行 DebugFS 節點的所有啟動時間初始化作業。如需這項作業的範例,請參閱「DNM:DebugFS 檔案的啟動時間初始化範例」。
  • 請勿在執行階段允許 DebugFS 存取權。以下為例外狀況:
    • 產生錯誤報告 (來自 dumpstate HAL)
    • 測試和驗證 (可透過 adb rootshell 存取 - 請務必先掛載 DebugFS)

開發人員可以設定偵錯持續性屬性 persist.dbg.keep_debugfs_mounted,讓 DebugFs 在 userdebug 和 eng 版本重新啟動時保持掛載狀態。

GTS 相容性測試可確保 DebugFS 檔案系統不會在使用者版本中掛載。Sepolicy neverallow 陳述式可確保在搭載 Android 12 以上版本的裝置上,未經授權的程序不會提供 DebugFs 存取權。