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 更新。自定义映像用作无法进行 OTA 更新的工厂 ROM 映像。

维护分区之间的 ABI

odm 分区是 vendor 分区的扩展。在考虑应用程序二进制接口 (ABI) 稳定性时,请牢记以下架构。

Maintaining ABI between partitions

图 1. 维护分区之间的 ABI。

  • odmvendor 分区之间没有 ABI 稳定性。必须同时升级这两个分区。
  • odmvendor 分区可以相互依赖,但 vendor 分区 必须 在没有 odm 分区的情况下工作。
  • odmsystem 之间的 ABI 与 vendorsystem 之间的 ABI 相同。

**不允许** product 分区与 vendorodm 分区之间直接交互。(这由 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,以便在 $(call inherit-product path/to/device.mk) 中使用,如 PRODUCT_ODM_PROPERTIES += product.abc=ok 中所示

将模块安装到 ODM 分区

使用以下构建标志将模块安装到 odm 分区

  • device_specific: trueAndroid.bp
  • LOCAL_ODM_MODULE := trueAndroid.mk

启用 Verified Boot

为防止恶意软件篡改 odm 分区,请为这些分区启用 Android Verified Boot (AVB)(就像您对 vendorsystem 分区所做的那样)。

要启用 AVB,请包含构建标志 BOARD_AVB_ODM_ADD_HASHTREE_FOOTER_ARGS。有关在动态分区上配置 AVB 的详细信息,请参阅 AVB 配置变更

将 /odm 视为另一个 /vendor 分区

为确保系统将 odm 分区视为 vendor 分区,请将任何硬编码的 vendor 引用替换为一组面向硬件的分区(目前为 odmvendor)。平台中值得注意的 vendor 引用位置包括 动态链接器包管理器shell/libc