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/*

custom_images は使用不可

custom images は次のものをサポートしていないため、使用しないでください。

  • 特定のターゲットへのモジュールのインストールcustom_images ではアーティファクトをイメージにコピーできますが、ビルドルールの一部としてターゲット パーティションを指定し、モジュールを特定のパーティションにインストールすることはできません。
  • Soong。 Soong ビルドシステムを使用して custom_images を作成することはできません。
  • OTA アップデートcustom_images は、OTA に対応していないファクトリ ROM イメージとして使用されます。

パーティション間の ABI の維持

/odm パーティションは、/vendor パーティションの拡張版です。アプリケーション バイナリ インターフェース(ABI)の安定性を考慮する場合は、次のアーキテクチャに留意してください。

パーティション間の 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_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 パーティションにインストールします。

  • Android.bpdevice_specific: true
  • Android.mkLOCAL_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 などがあります。