増分ファイル システム

Android 11 で導入された増分ファイル システム(IncFS)カーネル モジュールにより、Android OS は Android Debug Bridge(ADB)を介して配信される APK を受信できるようになりました。

この自己完結型のカーネル モジュールは、既存の Android ファイル システムを基盤とする新しい仮想ファイル システムを作成します。フレームワークと SDK の変更を補完し、アプリとゲームのデベロッパーが Android 11 以降を搭載したデバイスに ADB を介して大容量の APK をデプロイできるようにしています。

カーネルの変更により、新しい APK 署名スキーム v4 形式を使用できるようになり、Android Package Manager での Android フレームワークの変更、新しいシステム サービス、ADB の変更がサポートされます。

実装

IncFS を実装するには、OEM と SoC のメーカーは、Android デバイスのビルドに新しいカーネル ドライバを追加する必要があります。

Android 11 の場合のみ、カーネル ドライバがモジュールとしてビルドされている場合は、オンデマンドで読み込まれます。ADB を介した増分インストールでインストールされるアプリがない場合、デバイスはカーネル ドライバを読み込みません。

それ以外の場合で、カーネル イメージの一部としてビルドされていれば、ドライバは常に読み込まれます。この実装は Android 12 以降で有効であり、Android 11 から使用できます。カーネル ドライバを Android 12 にアップグレードする方法については、カーネル ドライバのアップグレードをご覧ください。

カーネル ドライバは、配信される APK のインストールを可能にする大規模なシステムの一部です。サンプル実装に IncFS コードが提供されていますが、OEM やベンダーはこれとまったく同じものを使用する必要はありません。ただし、すべてのデバイスで一貫したエクスペリエンスを実現するには、増分 FS 用のユーザー空間インターフェースのドキュメントで定義されているファイルの読み取り機能とディレクトリの読み取り / 書き込み機能を備えたファイル システムが API 実装にあることを確認する必要があります。

さらに、機能的に IncFS のサンプル実装と一致するマウント オプション特別なファイルも実装に必要です。

次に、実装に必要な変更について説明します。

  1. カーネルをビルドするための開発マシンをセットアップします。
  2. common-android-mainline ブランチの共通カーネルをターゲットに設定します。
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. IncFS に必要な次の変更がブランチ チェックアウトにあることを確認します。
  4. CONFIG_INCREMENTAL_FS=y または CONFIG_INCREMENTAL_FS=m(Android 11 のみ)のいずれかを defconfig ファイルの一番下に追加します。下記のリンクのいずれかをクリックすると、例が表示されます。
  5. カーネルをビルドします。
  6. カーネルを Android デバイスのイメージビルドに埋め込みます。
  7. ターゲットの Android デバイスでは、device.mk ファイルに次のいずれかのベンダー固有のシステム プロパティ行を追加します(Android 12 以降を搭載してリリースされたデバイスでは省略可)。
  8. CONFIG_INCREMENTAL_FS=y を使用している場合は、次のいずれかをファイルに追加します。

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=yes

    CONFIG_INCREMENTAL_FS=m を使用している場合は(Android 11 の場合のみ)、以下のいずれかをファイルに追加します。

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. Android Emulator と Google Pixel 4device.mk ファイルの例をご覧ください。
  10. Android 11 の場合のみ: CONFIG_INCREMENTAL_FS=m を使用している場合は、SE Linux ルールを追加します。
  11. 次の内容の vold.te ファイルを作成して、デバイスの /system/sepolicy/vendor フォルダに追加します。

    • vold.te

    増分ファイル システム ドライバの読み込みを許可します。

    • allow vold self:capability sys_module;
    • allow vold vendor_incremental_module:file r_file_perms;
    • allow vold vendor_incremental_module:system module_load;

    次の SE Linux ルールを、/system/sepolicy/vendor フォルダにある既存の file.te ファイルに追加します。

    • file.te ファイル - 例については、こちらの file.te ファイルをご覧ください。
    • 増分ファイル システム ドライバ
    • type vendor_incremental_module, vendor_file_type, file_type;

    次の SE Linux ルールを、/system/sepolicy/vendor フォルダにある既存の file_contents ファイルに追加します。

    • file_contents ファイル - 例については、こちらの file_contents ファイルをご覧ください。
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

カーネル ドライバのアップグレード

Android 12 にアップグレードするデバイスには、古いバージョンの IncFS ドライバが含まれている可能性があります。そのようなデバイスについては、AOSP は IncFS ドライバを現在のバージョン(この場合は v2)に更新することをおすすめしています。理由は次のとおりです。

  • Android 11 でリリースされたバージョンは IncFS の初期実装であり、ADB インストールのサポートのみを対象としています。
  • Android 12 は、Play ゲームのストリーミング インストールに IncFS ドライバを使用し、ユーザー エクスペリエンスの向上のため IncFS v2 の新機能と最適化を必要とします。
  • V1 もゲーム ストリーミングをサポートしますが、その際にパフォーマンスの低下を招くうえ、バッテリー使用量、CPU 使用量、RAM 使用量が v2 より増えます。
  • V2 ではストリーミングの UX が向上し、アニメーションの進行がスムーズになり、ディスクの使用容量を正確に把握できるほか、サードパーティのアプリ ストリーミング干渉を防ぐことができます。

カーネルの IncFS ドライバをアップグレードするには、カーネル 4.14 またはカーネル 4.19 向けの次のパッチを適用します。

その他のカスタム カーネル バージョンの場合は、いずれかのパッチセットを移植してください。影響を受けるのは fs/incfs ディレクトリのみで、既存の v1 コードにクリーンに適用されます。

IncFS ドライバは、元の(ただし今ではアップグレードされた)Android 11 の場合と同じ方法で、カーネル イメージの組み込み部分として、または個別のモジュールとして引き続きご使用ください。システム ボードやシステム プロパティの設定を変更しないでください。

GKI カーネル イメージを使用する新しいデバイスは、カーネル イメージの一部として設定された、最新の(v2)IncFS ドライバを自動的に入手します。追加の手順は必要ありません。

読み込み可能モジュールの設定は Android 12 でサポートが終了し、新しいデバイスではサポートされていません。これがモジュールとして元のカーネルにすでに組み込まれている場合は、アップグレードまたはベンダー イメージのフリーズに対してのみ許可されます。

リファレンス実装

この実装は、カーネル イメージの一部、または(Android 11 の場合のみ)読み込み可能モジュールと見なすことができます。

読み込み可能モジュール(Google Pixel 4 デバイス) Android Emulator(カーネル イメージの一部として)

検証とテスト

機能ユニットテスト、CTS、GTS を使用して実装を検証します。

CTS

CtsIncrementalInstallHostTestCases を使用します。

GTS

atest GtsIncrementalInstallTestCases:

/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java

IncFS をテストする

  1. 開発環境をセットアップします。
  2. 実装のセクションで概説した実装タスクを完了します。
  3. 次の手動テストを実行します。
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

Android SDK を使用して IncFS をテストする(ADB と apksigner)

  • 開発環境をセットアップします。
  • 実装のセクションで概説した実装タスクを完了します。
  • 次に、ターゲットの実機またはエミュレータにビルドをフラッシュします。
  • APK を生成するか、既存の APK を取得します。
  • デバッグ用の署名鍵を作成します。
  • build-tools フォルダから v4 署名形式を使用して APK に署名します。
    ./apksigner sign --ks debug.keystore game.apk
  • platform-tools フォルダからオンデバイスで APK をインストールします。
    ./adb install game.apk
インストールの例
図 1: インストールの例

以下のテストを探す