Android 9 及更高版本支持使用 Android 构建系统构建 product
分区。以前,Android 8.x 强制将 SoC 专用组件从 system
分区分离到 vendor
分区,而没有为通过 Android 构建系统构建的 OEM 专用组件分配空间。Android 9 及更高版本提供了额外的权限和许可名单功能,这些功能适用于不同分区上的特权应用。
关于产品分区
许多 OEM 都会自定义 AOSP 系统映像,以实现自己的功能以及运营商要求。但是,此类自定义操作使得无法将单个系统映像用于多个软件 SKU。每个映像都必须不同,才能支持自定义操作,例如支持不同的语言区域或运营商。使用单独的 product
分区来包含自定义项,便可以将单个系统映像用于多个软件 SKU。(system
分区托管可在多个软件 SKU 之间共享的通用代码)。vendor
分区继续托管 SoC 专用 BSP 代码,这些代码可在基于给定 SoC 的多个设备之间共享。
使用单独的分区有一些缺点,例如管理磁盘空间(必须保留有限的空间量以供未来增长)以及在分区之间维护稳定的应用二进制接口 (ABI)。在决定使用 product
分区之前,请花时间考虑您独特的 AOSP 实现以及可能的缓解策略(例如在无线下载 (OTA) 更新期间重新分区设备,这不是 Google 完成的,但某些 OEM 会这样做)。动态分区是解决此问题的好方案。
产品分区和权限
在 Android 9 及更高版本中,权限和许可名单流程的更改会影响您如何在 `product` 分区中授予特权应用权限。permissions.xml
文件必须与特权应用位于同一分区中。即使 permissions.xml
文件位于特权应用的 system
分区中,也不会将这些权限扩展到 product
分区中的特权应用,即使前者是后者的扩展。如需详细了解权限和许可名单流程,请参阅特权权限许可名单。
旧版 /oem 与 /product
根据产品接口强制执行,product
分区有两种属性。此外,product
分区不同于旧版 oem
分区
分区 | 属性 |
---|---|
oem |
|
product |
|
product (强制执行接口) |
|
由于这些原因,Android 9 支持 product
分区,同时保留对旧版 oem
分区的支持,以用于依赖于它的设备。为了将 product
分区与 system
分区解耦,Android 11 支持强制执行 product
接口。
/product 组件
product
分区包含以下组件
- 产品特定的系统属性 (
/product/build.prop
) - 产品特定的 RRO (
/product/overlay/*.apk
) - 产品特定的应用 (
/product/app/*.apk
) - 产品特定的 priv-apps (
/product/priv-app/*.apk
) - 产品特定的库 (
/product/lib/*
) - 产品特定的 Java 库 (
/product/framework/*.jar
) - 产品特定的 Android Framework 系统配置 (
/product/etc/sysconfig/*
和/product/etc/permissions/*
) - 产品特定的媒体文件 (
/product/media/audio/*
) - 产品特定的
bootanimation
文件
无 custom_images
您无法使用 custom_images
。它们缺少对以下内容的支持
- 将模块安装到特定目标。
custom_images
支持将工件复制到映像中,但无法通过指定模块的目标分区作为构建规则的一部分,将模块安装到特定分区中。 - Soong 支持。
custom_images
无法使用 Soong 构建系统构建。 - OTA 更新支持。
custom_images
用作无法接收 OTA 更新的工厂 ROM 映像。
在分区之间维护 ABI
Android 9 中的 product
分区是 system
分区的扩展。product
和 system
分区之间存在较弱的 ABI,因此必须同时升级两者,并且 ABI 应基于系统 SDK。如果系统 SDK 未涵盖 product
和 system
之间的所有 API 表面,则 OEM 必须在两个分区之间维护其自己的 ABI。
product
和 system
分区可以相互依赖。但是,使用通用系统映像 (GSI) 进行的测试必须在没有 product
分区的情况下正常工作。
当强制执行 product
接口时,product
分区将与 system
分区解耦。product
分区仅使用来自 system
分区的允许接口。
product
分区不得通过不稳定的接口依赖于 vendor
分区。禁止 product
和 vendor
分区之间直接交互。(这由 SEpolicy 强制执行。)
实现产品分区
在实现新的产品分区之前,请查看 AOSP 中相关的产品分区更改。然后,要设置 product
,请包含以下主板或产品构建标志
BOARD_USES_PRODUCTIMAGE
BOARD_PRODUCTIMAGE_PARTITION_SIZE
BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
- 用于
/product/build.prop
的PRODUCT_PRODUCT_PROPERTIES
。这些必须在$(call inherit-product path/to/device.mk)
中,如PRODUCT_PRODUCT_PROPERTIES += product.abc=ok
中所示。
将模块安装到产品分区
使用以下构建标志将模块安装到 product
分区。
Android.bp
中的product_specific: true
Android.mk
中的LOCAL_PRODUCT_MODULE := true
启用 Verified Boot
为了防止恶意软件篡改 product
分区,请为该分区启用 Android Verified Boot (AVB)(就像您对 vendor
和 system
分区所做的那样)。要启用 AVB,请包含以下构建标志:BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS
。