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_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
にインストールします。