Android 10 は、Android ビルドシステムを使用した /odm
パーティションの作成をサポートしています。
ODM パーティションについて
ODM は、特定のデバイス(ボード)向けに、システム オン チップ(SoC)ベンダーのボード サポート パッケージ(BSP)をカスタマイズします。それによって、ハードウェア抽象化レイヤ(HAL)に、ボード固有のコンポーネント、ボード固有のデーモン、または独自の機能のカーネル モジュールを実装できます。また、SoC コンポーネントを交換またはカスタマイズすることもできます。
以前の Android リリースでは、そのようなカスタマイズでは、1 つのベンダー イメージを、同じ SoC(または同じファミリーの別の SoC)を持つデバイスに使用できませんでした。Android 10 では、個別の /odm
パーティションをカスタマイズに使用でき、それによって複数のハードウェア SKU に 1 つのベンダー イメージを使用できます。
プロダクト パーティションと ODM パーティションの使用
Android 9 では、/product
パーティションの作成に対するサポートが追加され、1 つのシステム イメージを、さまざまな product.img
イメージから得られる複数のソフトウェア SKU に使用できるようになりました。/product
パーティションはソフトウェア SKU 用ですが、/odm
パーティションはハードウェア SKU 用です。
専用のプロダクト パーティションと ODM パーティションを使用すると、/system
パーティションを使用して、多くのソフトウェア SKU 間で共有するための汎用コードをホストできます。また、/vendor
パーティションを使用して、指定された SoC に基づいて複数のデバイス間で共有するための、SoC 固有の BSP コードをホストできます。
パーティションを分割して使用することには、ディスク容量の管理が困難になるなどのデメリットがあります(一定の容量を将来の拡張に備えて予約しておく必要があるなど)。Android 10 は動的パーティションをサポートしているため、ディスクの問題が解消され、無線(OTA)アップデート中にデバイスを再パーティショニングできます。
/odm のコンポーネント
/odm
パーティションには、次の表に記載された ODM 固有のコンポーネント(/vendor
パーティションと同様)が含まれます。
ODM 固有のコンポーネント | 場所 |
---|---|
ローダブル カーネル モジュール(LKM) | /odm/lib/modules/*.ko |
ネイティブ ライブラリ | /odm/lib[64] |
HAL | /odm/lib[64]/hw |
SEPolicy | /odm/etc/selinux |
VINTF オブジェクト データ | /odm/etc/vintf |
init.rc
ファイル |
/odm/etc/init |
システム プロパティ | /odm/build.prop |
ランタイム リソース オーバーレイ(RRO) | /odm/overlay/*.apk |
アプリ | /odm/app/*.apk |
Priv-apps | /odm/priv-app/*.apk |
Java ライブラリ | /odm/framework/*.jar |
Android フレームワークのシステム構成 | /odm/etc/sysconfig/* と /odm/etc/permissions/* |
custom_images は使用不可
custom images は次のものをサポートしていないため、使用しないでください。
- 特定のターゲットへのモジュールのインストール。
custom_images
ではアーティファクトをイメージにコピーできますが、ビルドルールの一部としてターゲット パーティションを指定し、モジュールを特定のパーティションにインストールすることはできません。 - Soong。
Soong ビルドシステムを使用して
custom_images
を作成することはできません。 - OTA アップデート
custom_images
は、OTA に対応していないファクトリ ROM イメージとして使用されます。
パーティション間の ABI の維持
/odm
パーティションは、/vendor
パーティションの拡張版です。アプリケーション バイナリ インターフェース(ABI)の安定性を考慮する場合は、次のアーキテクチャに留意してください。
/odm
パーティションと/vendor
パーティションの間に ABI の安定性はありません。 両方のパーティションを同時にアップグレードする必要があります。/odm
パーティションと/vendor
パーティションは相互に依存できますが、/vendor
パーティションは/odm
パーティションなしで機能する必要があります。/odm
と/system
の間の ABI は、/vendor
と/system
の間の ABI と同じです。
/product
パーティションと /vendor
パーティションまたは /odm
パーティションとの直接のやり取りは許可されていません(これは SEpolicy によって強制されます)。
ODM パーティションの実装
新しいパーティションを実装する前に、関連する AOSP の変更を確認してください。
ODM パーティションの設定
/odm
パーティションを設定するには、次のビルドフラグを含めます。
BOARD_ODMIMAGE_PARTITION_SIZE
(固定パーティション サイズ用)PRODUCT_USE_DYNAMIC_PARTITIONS
とBOARD_ODMIMAGE_PARTITION_RESERVED_SIZE
(動的パーティション サイズ用)BOARD_ODMIMAGE_FILE_SYSTEM_TYPE
(ODM イメージに使用されるファイル システム タイプ)PRODUCT_ODM_PROPERTIES
(/odm/build.prop
用)
これを、PRODUCT_ODM_PROPERTIES += product.abc=ok
のように$(call inherit-product path/to/device.mk)
内で使用します。
ODM パーティションへのモジュールのインストール
次のビルドフラグを使用して、モジュールを /odm
パーティションにインストールします。
Android.bp
のdevice_specific: true
Android.mk
のLOCAL_ODM_MODULE := true
確認付きブートの有効化
悪意のあるソフトウェアによる /odm
パーティションの改ざんを防ぐには、Android の確認付きブート(AVB)を使用します(/vendor
パーティションおよび /system
パーティションと同様)。
AVB を有効にするには、ビルドフラグ BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS
を含めます。動的パーティションの AVB 構成の詳細については、AVB 構成の変更を参照してください。
/odm をもう 1 つの /vendor パーティションとして扱う
システムが /odm
パーティションを /vendor
パーティションとして処理するようにするには、ハードコードされた /vendor
の参照を、ハードウェア指向のパーティションのセット(現在は /odm
と /vendor
)に置き換えます。プラットフォーム内の重要な /vendor
の参照場所としては、ダイナミック リンカー、パッケージ マネージャー、shell/libc
などがあります。