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) 稳定性时,请记住以下架构:
/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 映像)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
。