ODM パーティション

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)の安定性を考慮する場合は、次のアーキテクチャに留意してください。

パーティション間の ABI の維持
図 1. パーティション間の ABI の維持
  • odm パーティションと vendor パーティションの間に ABI の安定性はありません。両方のパーティションを同時にアップグレードする必要があります。
  • odm パーティションと vendor パーティションは相互に依存できますが、vendor パーティションは odm パーティションなしで機能する必要があります
  • odmsystem の間の ABI は、vendorsystem の間の ABI と同じです。

product パーティションと vendor パーティションまたは odm パーティションとの直接のやり取りは許可されていません(これは SEpolicy によって強制されます)。

ODM パーティションの実装

新しいパーティションを実装する前に、関連する AOSP の変更を確認してください。

ODM パーティションの設定

odm パーティションを設定するには、次のビルドフラグを含めます。

  • BOARD_ODMIMAGE_PARTITION_SIZE(固定パーティション サイズ用)
  • PRODUCT_USE_DYNAMIC_PARTITIONSBOARD_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: trueAndroid.bp
  • LOCAL_ODM_MODULE := trueAndroid.mk

確認付きブートの有効化

悪意のあるソフトウェアによる odm パーティションの改ざんを防ぐには、(vendor パーティションおよび system パーティションの場合と同様に)このパーティションで Android 確認付きブート(AVB)を有効化します。

AVB を有効にするには、ビルドフラグ BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS を含めます。動的パーティションの AVB 構成の詳細については、AVB 構成の変更を参照してください。

/odm をもう 1 つの /vendor パーティションとして扱う

システムが odm パーティションを vendor パーティションとして処理するようにするには、ハードコードされた vendor 参照を、ハードウェア指向のパーティションのセット(現在は odmvendor)に置き換えます。プラットフォーム内の重要な vendor 参照の場所としては、ダイナミック リンカーパッケージ マネージャーshell/libc などがあります。