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)の安定性を考慮する場合は、次のアーキテクチャに留意してください。
図 1. パーティション間の 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 などがあります。