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/* |
カスタム イメージは使用不可
カスタム イメージは以下をサポートしていないため、使用しないでください。
- 特定のターゲットへのモジュールのインストール。 カスタム イメージでは、アーティファクトをイメージにコピーできますが、ビルドルールの一部としてターゲット パーティションを指定し、モジュールを特定のパーティションにインストールすることはできません。
- Soong。Soong ビルドシステムを使用して
custom_images
を作成することはできません。 - OTA アップデート。カスタム イメージは、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
パーティションにインストールします。
device_specific: true
(Android.bp
)LOCAL_ODM_MODULE := true
(Android.mk
)
確認付きブートの有効化
悪意のあるソフトウェアによる odm
パーティションの改ざんを防ぐには、(vendor
パーティションおよび system
パーティションの場合と同様に)このパーティションで Android 確認付きブート(AVB)を有効化します。
AVB を有効にするには、ビルドフラグ BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS
を含めます。動的パーティションの AVB 構成の詳細については、AVB 構成の変更を参照してください。
/odm をもう 1 つの /vendor パーティションとして扱う
システムが odm
パーティションを vendor
パーティションとして処理するようにするには、ハードコードされた vendor
参照を、ハードウェア指向のパーティションのセット(現在は odm
と vendor
)に置き換えます。プラットフォーム内の重要な vendor
参照の場所としては、ダイナミック リンカー、パッケージ マネージャー、shell/libc
などがあります。