ベンダー スナップショットの生成

Android 11 では、VNDK スナップショットのビルド アーティファクトとベンダー スナップショットがサポートされています。これらを使用すると、ソースツリーの Android バージョンに関係なく vendor.img をビルドできます。これにより、古いベンダー イメージと新しいシステム イメージなど、複数のバージョンのイメージを組み合わせることができます。

複数のバージョンのイメージの組み合わせは以下ではサポートされていません。

  • Android.mk.。Soong がベンダー スナップショットを生成するため、Android.mk で定義されたモジュールはベンダー スナップショットとしてキャプチャされません(Android.mk の SoC 独自のモジュールは、必ずしも機能するとは限りません)。

  • サニタイザー。サニタイザー バリアントは個別にビルドする必要があるため、ベンダーと VNDK のスナップショットはサニタイザーをサポートしていません。

ベンダー スナップショットについて

ベンダー スナップショットは OEM が所有するスナップショットです。ビルド済みの C++ モジュールのセットで、/vendor にインストールされていますが、AOSP で維持されます。以前の Android バージョンのベンダー スナップショットをキャプチャしていない場合、新しい Android バージョンにアップグレードすることで、ベンダー パーティションが破損することがあります。これは、ベンダー スナップショット モジュールが API や ABI の互換性なしで削除または変更されることがあるためです。

ベンダー スナップショットには、AOSP の次のモジュールが含まれています。

  • vendor: true または vendor_available: true が指定されている共有、静的、ヘッダー ライブラリ
  • vendor_available: true が指定されている VNDK 静的ライブラリ
  • vendor: true または vendor_available: true が指定されている実行可能ファイルとオブジェクト ファイル

次のディレクトリにあるモジュールは、SoC 所有のハードウェア コードと見なされ、無視されます。

  • device/
  • vendor/
  • hardware/(ただし、以下を除く)
    • hardware/interfaces
    • hardware/libhardware
    • hardware/libhardware_legacy

SoC 所有のハードウェア コードは他のディレクトリに存在する場合もあります。現時点では、ベンダー スナップショットはそのような構成をサポートしていません。

ベンダー スナップショットをビルドする

次のコマンドを使用してベンダー スナップショットをビルドします。

. build/envsetup.sh
lunch target
m dist vendor-snapshot

これらのコマンドにより、$DIST_DIRvendor-$(TARGET_DEVICE).zip ファイルが作成されます。次の例は、ベンダー スナップショットの ZIP ファイルを示しています。

vendor-$(TARGET_DEVICE).zip
├── arch-arm64-armv8-a
│   ├── binary         -> binary files, *.json files
│   ├── header         -> *.json files
│   ├── object         -> *.o files, *.json files
│   ├── shared         -> *.so files, *.json files
│   └── static         -> *.a files, *.json files
├── arch-arm-armv8-a   -> (arch-arm64-armv8-a)
├── configs            -> *.rc files, *.xml files
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files
  • JSON ファイルには、モジュール名、エクスポートされたディレクトリ、init_rc ファイル、vintf_fragments ファイルなどのフラグが含まれます。
  • configs ディレクトリには、init_rc および vintf_fragments フラグの .rc ファイルと .xml ファイルが含まれます。

ベンダー スナップショットをインストールする

ベンダー スナップショットをインストールするには、保存先ディレクトリに移動し、次のコマンドを使用します。

python3 development/vendor_snapshot/update.py --local $DIST_DIR --install-dir \
    vendor/vendor name/vendor_snapshot VER

このコマンドにより、/vendor/vendor name/vendor_snapshot/vVER/$(TARGET_ARCH)/Android.bp が生成されます。次の例は、ベンダー スナップショットのディレクトリ構造を示しています。

vendor/vendor name/vendor_snapshot/
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a
│   │   │   ├── binary         -> (prebuilt libs)
│   │   │   ├── object         -> (prebuilt libs)
│   │   │   ├── shared         -> (prebuilt libs)
│   │   │   └── static         -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (same as above)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (snapshot modules)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   └── x86                    -> (same as above)
└── (other vendor versions)    -> (same as above)

ベンダー イメージをビルドする

VNDK スナップショットのビルド アーティファクトとベンダー スナップショットを使用すると、ソースツリーの Android のバージョンに関係なく vendor.img をビルドできるため、複数のバージョンのイメージの組み合わせることができます。VNDK スナップショットとベンダー スナップショットの両方をインストールしたら、BOARD_VNDK_VERSION をベンダーのバージョンに設定します。次に例を示します。

# BoardConfig.mk
BOARD_VNDK_VERSION := 29

BOARD_VNDK_VERSIONcurrent 以外の値に設定されている場合、ビルドシステムは次を実行します。

  • BOARD_VNDK_VERSION の VNDK スナップショット モジュールとベンダー スナップショット モジュールを有効にします。各スナップショット モジュールが、同じ名前を持つ C++ ソース モジュールをオーバーライドします。
  • ro.vndk.versionBOARD_VNDK_VERSION に設定します。
  • BOARD_VNDK_VERSION の VNDK スナップショット モジュールを system_ext にインストールします。