2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
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)の安定性を考慮する場合は、次のアーキテクチャに留意してください。
図 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
などがあります。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-07-27 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-07-27 UTC。"],[],[],null,["# ODM partitions\n\nAndroid 10 includes support for building\n`odm` partitions using the Android build system.\n\nAbout ODM partitions\n--------------------\n\n\nOriginal design manufacturers (ODMs) customize system-on-chip (SoC) vendor\nboard-support packages (BSPs) to their specific devices (their boards). This\nenables them to implement kernel modules for board-specific components,\nboard-specific daemons, or their own features on hardware abstraction layers\n(HALs). They might also want to replace or customize SoC components.\n\n\nIn lower Android releases, such customizations prevented the use of a single\nvendor image for devices with the same SoC (or with different SoCs, but in the\nsame family). In Android 10 and higher, you can use a\nseparate `odm` partition for customizations, which enables you to\nuse a single vendor image for multiple hardware SKUs.\n\n### Use product and ODM partitions\n\n\nAndroid 9 added support for building\n[`product`\npartitions](/docs/core/architecture/bootloader/partitions/product-partitions), enabling the use of a single system image for multiple software\nSKUs supplied by different `product.img` images. While the\n`product` partition is intended for software SKUs, the\n`odm` partition is intended for hardware SKUs.\n\n\nWith dedicated product and ODM partitions, you can use the `system`\npartition to host generic code for sharing among many software SKUs, and the\n`vendor` partition to host SoC-specific BSP code to share among\nmultiple devices based on the given SoC.\n\n\nUsing separate partitions has disadvantages, such as the difficulty in managing\ndisk space (for example, you must reserve a limited amount of space for future\ngrowth). However, Android 10 support for\n[dynamic partitions](/docs/core/ota/dynamic_partitions)\nremoves the disk issue, and makes repartitioning a device during an\n[over-the-air (OTA)](/docs/core/ota) update possible.\n\n### ODM components\n\n\nThe `odm` partition contains the following ODM-specific components\n(similar to the `vendor` partition), listed in the following table.\n\n| ODM-specific component | Location |\n|-------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|\n| Loadable kernel modules (LKMs) | `/odm/lib/modules/*.ko` |\n| Native libraries | `/odm/lib[64]` |\n| HALs | `/odm/lib[64]/hw` |\n| SEPolicy | `/odm/etc/selinux` |\n| [VINTF object data](/docs/core/architecture/vintf/objects) | `/odm/etc/vintf` |\n| [`init.rc` files](https://android.googlesource.com/platform/system/core/+/android16-release/init/README.md) | `/odm/etc/init` |\n| System properties | `/odm/build.prop` |\n| Runtime resource overlays (RROs) | `/odm/overlay/*.apk` |\n| Apps | `/odm/app/*.apk` |\n| Priv-apps | `/odm/priv-app/*.apk` |\n| Java libraries | `/odm/framework/*.jar` |\n| Android Framework system configs | `/odm/etc/sysconfig/*` and `/odm/etc/permissions/*` |\n\n### No custom images\n\n\nDon't use\n[custom\nimages](https://android.googlesource.com/platform/build/+/bc7e3f98f41108c03a06abbf98add08ad4a05040/cor\ne/tasks/build_custom_images.mk#53) because they lack support for the following:\n\n- **Installation of a module to a specific target.** Custom images support copying artifacts into an image, but can't install a module into a specific partition by specifying the target partition as a part of a build rule.\n- **Soong.** `custom_images` can't be built using the Soong build system.\n- **OTA update.** Custom images are used as factory ROM images that can't be OTA-ed.\n\n### Maintain ABIs between partitions\n\n\nThe `odm` partition is an extension of the `vendor`\npartition. When considering application binary interface (ABI) stability, keep\nthe following architecture in mind.\n\n**Figure 1.** Maintaining ABI between partitions.\n\n- There's no ABI stability between `odm` and `vendor` partitions. Both partitions must be upgraded at the same time.\n- The `odm` and `vendor` partitions can depend on each other, but the `vendor` partition **must** work without an `odm` partition.\n- The ABI between `odm` and `system` is the same as the ABI between `vendor` and `system`.\n\n\nDirect interaction between the `product` partition and the\n`vendor` or `odm` partition **isn't\nallowed**. (This is enforced by SEpolicy.)\n\nImplement ODM partitions\n------------------------\n\n\nBefore implementing a new partition, review the\n[related AOSP\nchanges](https://android-review.googlesource.com/q/topic:odm_partition_+OR+topic:odm_partition+(status:open+OR+status:merged)).\n\n### Set up ODM partitions\n\n\nTo set up `odm` partitions, include these build flags:\n\n- `BOARD_ODMIMAGE_PARTITION_SIZE` for a fixed partition size\n- `PRODUCT_USE_DYNAMIC_PARTITIONS` and `BOARD_ODMIMAGE_PARTITION_RESERVED_SIZE` for a [dynamic partition](/docs/core/ota/dynamic_partitions) size\n- `BOARD_ODMIMAGE_FILE_SYSTEM_TYPE` file system type used for the ODM image\n- `PRODUCT_ODM_PROPERTIES` for `/odm/build.prop` for use within a `$(call inherit-product path/to/device.mk)`, as in `PRODUCT_ODM_PROPERTIES += product.abc=ok`\n\n### Install a module to an ODM partition\n\n\nUse these build flags to install a module to an `odm` partition:\n\n- `device_specific: true` in `Android.bp`\n- `LOCAL_ODM_MODULE := true` in `Android.mk`\n\n### Enable Verified Boot\n\n\nTo prevent malicious software from tampering with `odm` partitions,\nenable [Android Verified Boot\n(AVB)](/docs/security/features/verifiedboot/avb) for those partitions (just as you do for `vendor` and\n`system` partitions).\n\n\nTo enable AVB, include the build flag\n`BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS`. For details on configuring\nAVB on dynamic partitions, see\n[AVB configuration\nchanges](/docs/core/ota/dynamic_partitions/implement#avb-configuration-changes).\n\n### Treat /odm as another /vendor partition\n\n\nTo ensure that the system handles the `odm` partition as a\n`vendor` partition, replace any hard-coded `vendor`\nreferences with a set of hardware-oriented partitions (currently\n`odm` and `vendor`). Notable `vendor`\nreference locations in the platform include\n[dynamic\nlinker](https://android.googlesource.com/platform/bionic/+/android16-release/linker/),\n[package\nmanager](https://android.googlesource.com/platform/frameworks/base/+/android16-release/services/core/java/com/andr\noid/server/pm/PackageManagerService.java), and `shell/libc`."]]