在 Android 12 中使用 DebugFS

以 Android 12 啟動且使用核心的裝置 v5.4 以上版本都必須與 GKI 核心一併出貨。以上就是 合作夥伴在 GKI 上開發時,可在使用者偵錯版本中存取 DebugFS 核心,GKI 定義中的核心設定 CONFIG_DEBUG_FS 已啟用。 一律不要在使用者版本中掛接 DebugFS,以支援裝置 我們在 Android 12 上發布的應用程式

使用者偵錯版本的測試涵蓋範圍優於使用者建構,且大幅取得 在整個開發週期中進行測試下列計劃可將 與 DebugFS 存取權相關的兩種建構類型之間的差異。 好處如下:

  • 可避免因 DebugFS 而異,意外防止使用者偵錯建構作業 以便取得新功能
  • 確保因缺少 DebugFS 而損毀的現有功能 是關於開發週期初期得知的資訊

Debugfs 存取使用者偵錯版本的行為會歸類為 如下:

  1. DebugFS 檔案在裝置啟動期間初始化,例如 啟用 DebugFS 中檔案的寫入權限,以便啟用偵錯資料收集功能。
  2. 產生錯誤報告:在下列情況下,轉儲狀態 HAL 會讀取 DebugFS 檔案 DumpstateBoard() 是由 dumpstate 叫用。這個 相關資訊會納入錯誤報告中。
  3. 特定裝置的測試與驗證。

下表說明這三種類別 Android 12 支援的部分功能。請注意, 由於 DebugFS 無法 掛接於使用者的建構作業中

用途 Android 12 使用者偵錯版本
一次性 DebugFS 檔案在啟動期間初始化。 這項存取權在啟動期間「隻共享一次」。 Dumpstate HAL 會在 HAL 初始化期間執行這項作業。如要啟用這項功能 在 HAL 初始化之前,init 會在使用者偵錯版本掛接 DebugFSInit 會在以下情況呼叫 DebugFS 上的 umount(): 裝置已完成啟動
產生錯誤報告:傾印狀態 HAL 讀取 DebugFS 檔案,包含在錯誤報告中。 由轉儲狀態叫用時,由 DumpstateBoard() 內的轉儲狀態 HAL 完成 (DumpstateDevice.cpp)。 轉儲狀態工具 (Android 架構的一部分) 可確保 DebugFS 會在叫用期間掛接。
特定裝置的測試與驗證 Adb 根層級和殼層。使用以下指令,從 ADB 殼層掛接 DebugFS 根目錄存取權1

1若要從 adb shell 掛接 DebugFS, ,請使用以下指令:

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

必要的合作夥伴動作

合作夥伴必須根據這些異動生效後,採取下列行動: Android 12 裝置:

  • 開始執行 DebugFS 個節點的所有啟動時間初始化作業 在轉儲狀態 HAL 初始化期間如需操作範例,請參閱: DNM: DebugFS 檔案的啟動時間初始化範例
  • 禁止在執行階段期間存取 DebugFS。以下例外狀況 適用範圍:
    • 產生錯誤報告 (擷取自轉儲狀態 HAL)
    • 測試和驗證 (adb rootshell 可以存取) - 確認先已掛接 DebugFS)

開發人員可以設定偵錯永久屬性 persist.dbg.keep_debugfs_mounted,讓 DebugFs固定在下列位置: 會在 userdebug 和 eng 版本上重新啟動。

並測試 GTS 法規遵循測試,確保 DebugFS 檔案系統未 掛接於使用者的建構作業中Sepolicy neverallow 陳述式可確保在裝置中 在 Android 12 以上版本中啟動、提供未經授權的程序 存取 DebugFs