构建 ODM 分区

Android 10 支持使用 Android 构建系统构建 /odm 分区。

ODM 分区简介

原始设计制造商 (ODM) 能够为其特定设备(开发板)自定义系统芯片 (SoC) 供应商板级支持包 (BSP)。这样,他们就可以为板级组件、板级守护进程或者其基于硬件抽象层 (HAL) 的自有功能实现内核模块。他们可能还需要替换或自定义 SoC 组件。

在之前的 Android 版本中,对于使用相同 SoC(或使用同一系列中的不同 SoC)的设备,此类自定义会阻止使用单个供应商映像。在 Android 10 中,您可以为自定义使用单独的 /odm 分区,因而能够针对多个硬件 SKU 使用单个供应商映像。

使用产品分区和 ODM 分区

Android 9 添加了对构建 /product 分区的支持,让您可以针对由不同 product.img 映像提供的多个软件 SKU 使用单个系统映像。/product 分区适用于软件 SKU,而 /odm 分区适用于硬件 SKU。

有了专用的产品分区和 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/*

不得使用 custom_images

请勿使用 custom images,因为它们缺乏对以下方面的支持:

  • 将模块安装到特定目标分区中。custom_images 支持将软件工件复制到映像中,但无法通过将目标分区指定为构建规则的一部分,来将模块安装到特定分区中。
  • Soong。 无法使用 Soong 构建系统构建 custom_images
  • OTA 更新。custom_images 用作出厂 ROM 映像,无法执行 OTA 更新。

维护分区之间的 ABI

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

维护分区之间的 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_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 分区中安装模块:

  • Android.bp 中的 device_specific: true
  • Android.mk 中的 LOCAL_ODM_MODULE := true

启用启动时验证

要防止恶意软件篡改 /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