产品分区

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
  • 不可更新;通常在出厂时刷写一次。
  • 针对细微差异而构建,例如品牌和颜色。拥有不同的 oem 分区内容并不意味着产品软件不同。
  • system 分区不依赖于 oem 分区。(仅当在 oem 分区中找到特定文件时,才会使用 oem 分区)。
  • 仅使用 system 分区上的公共 API。
product
  • 可更新
  • 与系统映像耦合(它们一起更新)
  • 针对产品或产品系列构建。
  • 系统分区可以依赖于 product 分区。
  • 由于它们是同时更新的,因此可以使用非公共 API。
product(强制执行接口)
  • 可更新
  • 与系统映像解耦。
  • 针对产品或产品系列构建。
  • system 分区不依赖于 product 分区。
  • 无法使用隐藏 API,但在 system 分区上仅使用公共和系统 API。

由于这些原因,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 分区的扩展。productsystem 分区之间存在较弱的 ABI,因此必须同时升级两者,并且 ABI 应基于系统 SDK。如果系统 SDK 未涵盖 productsystem 之间的所有 API 表面,则 OEM 必须在两个分区之间维护其自己的 ABI。

productsystem 分区可以相互依赖。但是,使用通用系统映像 (GSI) 进行的测试必须在没有 product 分区的情况下正常工作。

当强制执行 product 接口时,product 分区将与 system 分区解耦。product 分区仅使用来自 system 分区的允许接口。

product 分区不得通过不稳定的接口依赖于 vendor 分区。禁止 productvendor 分区之间直接交互。(这由 SEpolicy 强制执行。)

实现产品分区

在实现新的产品分区之前,请查看 AOSP 中相关的产品分区更改。然后,要设置 product,请包含以下主板或产品构建标志

  • BOARD_USES_PRODUCTIMAGE
  • BOARD_PRODUCTIMAGE_PARTITION_SIZE
  • BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
  • 用于 /product/build.propPRODUCT_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)(就像您对 vendorsystem 分区所做的那样)。要启用 AVB,请包含以下构建标志:BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS