自 2025 年 3 月 27 日起,我们建议您使用 android-latest-release
而非 aosp-main
构建 AOSP 并为其做出贡献。如需了解详情,请参阅 AOSP 的变更。
ODM 分区
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
Android 10 支持使用 Android 构建系统来构建 odm
分区。
ODM 分区简介
原始设计制造商 (ODM) 能够为其特定设备(开发板)自定义系统芯片 (SoC) 供应商板级支持包 (BSP)。通过这样的方式,他们可为板级组件、板级守护程序或者其基于硬件抽象层 (HAL) 的自有功能实现内核模块,还可以替换或自定义 SoC 组件。
在较低的 Android 版本中,对于使用相同 SoC(或使用同一系列中的不同 SoC)的多款设备,此类自定义会导致设备无法使用同一个供应商映像。在 Android 10 及更高版本中,您可为自定义设置使用单独的 odm
分区,因而可为多个硬件 SKU 使用同一个供应商映像。
使用 product 分区和 ODM 分区
Android 9 开始支持构建 product
分区,让您可为不同 product.img
映像提供的多个软件 SKU 使用同一个系统映像。product
分区适用于软件 SKU,而 odm
分区适用于硬件 SKU。
有了专用的 product 分区和 ODM 分区,您可以使用 system
分区来容纳通用代码(这类代码在许多软件 SKU 之间共享),并使用 vendor
分区来容纳 SoC 专属 BSP 代码(这类代码根据特定的 SoC 在多款设备之间共享)。
使用单独的分区存在一定弊端,例如,磁盘空间管理难度更高(您必须预留一定的空间以满足未来的空间需求增长)。但是,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 |
特权应用 |
/odm/priv-app/*.apk |
Java 库 |
/odm/framework/*.jar |
Android 框架系统配置 |
/odm/etc/sysconfig/* 和 /odm/etc/permissions/* |
不得使用自定义映像
请勿使用自定义映像,因为它们缺乏对以下方面的支持:
- 将模块安装到特定目标分区中。自定义映像支持将工件复制到映像中,但无法通过在构建规则中指定目标分区,将模块安装到特定分区中。
- Soong。无法使用 Soong 构建系统构建
custom_images
。
- OTA 更新。自定义映像用作出厂 ROM 映像,无法用于 OTA 更新。
维护分区之间的 ABI
odm
分区是 vendor
分区的扩展。在考虑应用二进制接口 (ABI) 稳定性时,请记住以下架构。
图 1. 维护分区之间的 ABI。
odm
和 vendor
分区之间不具有 ABI 稳定性。必须同时升级这两个分区。
odm
和 vendor
分区可以相互依赖,但是在没有 odm
分区的情况下,vendor
分区必须正常运行。
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 映像)
/odm/build.prop
的 PRODUCT_ODM_PROPERTIES
(在 $(call inherit-product path/to/device.mk)
内使用,如在 PRODUCT_ODM_PROPERTIES += product.abc=ok
中一样)
向 ODM 分区中安装模块
可使用以下构建标志向 odm
分区中安装模块:
device_specific: true
(在 Android.bp
中)
LOCAL_ODM_MODULE := true
(在 Android.mk
中)
启用启动时验证
为防止恶意软件篡改 odm
分区,可为这些分区启用 Android 启动时验证 (AVB)(就像为 vendor
和 system
分区启用一样)。
如需启用 AVB,请添加构建标志 BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS
。如需详细了解如何在动态分区上配置 AVB,请参阅 AVB 配置更改。
将 /odm 作为另一个 /vendor 分区处理
如需确保系统将 odm
分区当作 vendor
分区处理,请将所有硬编码的 vendor
引用替换为一组面向硬件的分区(当前为 odm
和 vendor
)。平台中值得注意的 vendor
引用位置包括动态链接器、软件包管理器和 shell/libc
。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-07-27。
[null,null,["最后更新时间 (UTC):2025-07-27。"],[],[],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`."]]