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/interfaceshardware/libhardwarehardware/libhardware_legacy
SoC 所有のハードウェア コードは他のディレクトリに存在する場合もあります。現時点では、ベンダー スナップショットはそのような構成をサポートしていません。
ベンダー スナップショットをビルドする
次のコマンドを使用してベンダー スナップショットをビルドします。
. build/envsetup.shlunch targetm dist vendor-snapshot
これらのコマンドにより、$DIST_DIR に vendor-$(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_VERSION が current 以外の値に設定されている場合、ビルドシステムは次を実行します。
BOARD_VNDK_VERSIONの VNDK スナップショット モジュールとベンダー スナップショット モジュールを有効にします。各スナップショット モジュールが、同じ名前を持つ C++ ソース モジュールをオーバーライドします。ro.vndk.versionをBOARD_VNDK_VERSIONに設定します。BOARD_VNDK_VERSIONの VNDK スナップショット モジュールをsystem_extにインストールします。