Android 12 での DebugFS の使用

v5.4 以上のカーネル バージョンを使用する Android 12 を搭載してリリースするデバイスには、GKI カーネルを搭載して出荷する必要があります。パートナーが GKI カーネルで開発を行う間 userdebug ビルドで DebugFS にアクセスできるように、GKI defconfig でカーネル構成 CONFIG_DEBUG_FS が有効になっています。Android 12 を搭載してリリースするデバイスのユーザービルドには DebugFS をマウントしないでください

userdebug ビルドはユーザービルドよりもテスト カバレッジが広く、開発サイクル全体で徹底的にテストされます。以下のように計画することで、DebugFS へのアクセスに関してその 2 つのビルドタイプ間の相違を最小限に抑え、次のようなメリットを得ることができます。

  • userdebug ビルドが新機能に関して誤って DebugFS に依存することがなくなる
  • DebugFS が欠如していて互換性のない既存の機能を、開発サイクルの早い段階で認識できるようになる

userdebug ビルド内での Debugfs へのアクセスは、以下のカテゴリに分類されます。

  1. デバイスの起動中での DebugFS ファイルの初期化: デバッグデータの収集を有効にするための DebugFS でのファイルへの書き込みアクセス権など。
  2. バグレポートの生成: dumpstateDumpstateBoard() を呼び出すと、dumpstate HAL が DebugFS ファイルを読み取ります。この情報がバグレポートの一部になります。
  3. デバイス固有のテストと検証。

次の表に、Android 12 でこの 3 つのカテゴリがそれぞれどのようにサポートされるかを示します。ユーザービルドには DebugFS をマウントできないため、以下は userdebug ビルドのみ該当します。

ユースケース Android 12 の userdebug ビルド
1 回限りの DebugFS ファイルの初期化(起動中): このアクセスは起動中に 1 回だけ行われます dumpstate HAL が HAL の初期化中にこれを実行します。これを有効にするために、init が HAL の初期化より前に userdebug ビルドに DebugFS をマウントします。デバイスの起動が完了すると、InitDebugFS 上で umount() を呼び出します。
バグレポートの生成: dumpstate HAL がバグレポートの一部となる DebugFS ファイルを読み取ります。 dumpstate(DumpstateDevice.cpp)によって呼び出されたときに、DumpstateBoard() 内の dumpstate HAL が実行します。dumpstate ツール(Android フレームワークの一部)により、呼び出し中に DebugFS がマウントされます。
デバイス固有のテストと検証 adb の root とシェル。root アクセス権を使って adb シェルから DebugFS をマウントします1

1root アクセス権を使って adb shell から DebugFS をマウントするには、次のコマンドを使用します。

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

パートナーに必要なアクション

パートナーは、Android 12 搭載デバイスにおける上記の変更に基づいて、以下を行う必要があります。

  • DebugFS ノードの起動時の初期化はすべて、dumpstate HAL の初期化中に行うようにします。その方法の例については、DNM: 起動時における DebugFS ファイルの初期化の例をご覧ください。
  • ランタイムでの DebugFS へのアクセスは許可しないでください。ただし、以下の例外があります
    • バグレポートの生成(dumpstate HAL から)
    • テストと検証(adb rootshell でアクセスできる - 先に DebugFS がマウントされていることを確認する)

デベロッパーは、デバッグ用の永続的プロパティ persist.dbg.keep_debugfs_mounted を設定して、userdebug ビルドと eng ビルドの再起動後も DebugFs をマウントした状態を保持できます。

GTS コンプライアンス テストでは、DebugFS ファイルシステムがユーザービルドにマウントされていないことが確認されます。Sepolicy の neverallow ステートメントを使用すると、Android 12 以上を搭載してリリースされたデバイス内で、未承認プロセスに DebugFs へのアクセスが許可されないように徹底できます。