设备清单开发

在开发和发布新设备时,供应商可以在设备清单 (DM) 中定义和声明目标 FCM 版本。在为旧设备升级供应商映像时,供应商可以选择实现新的 HAL 版本并增加目标 FCM 版本。

开发新设备

在为新设备定义设备目标 FCM 版本时

  1. 保留未定义的 DEVICE_MANIFEST_FILEPRODUCT_ENFORCE_VINTF_MANIFEST
  2. 为目标 FCM 版本实现 HAL。
  3. 编写正确的设备清单文件。
  4. 将目标 FCM 版本写入设备清单文件。
  5. 设置 DEVICE_MANIFEST_FILE
  6. PRODUCT_ENFORCE_VINTF_MANIFEST 设置为 true

发布新设备

发布新设备时,需要确定其初始目标 FCM 版本,并在设备清单中声明为顶级 <manifest> 元素中的“target-level”属性。

例如,搭载 Android 9 发布的设备的目标 FCM 版本必须等于 3(此时可用的最高版本)。要在设备清单中声明此版本,请执行以下操作

<manifest version="1.0" type="device" target-level="3">
    <!-- ... -->
</manifest>

升级供应商映像

在为旧设备升级供应商映像时,供应商可以选择实现新的 HAL 版本并增加目标 FCM 版本。

升级 HAL

在供应商映像升级期间,供应商可以实现新的 HAL 版本,前提是 HAL 名称、接口名称和实例名称相同。例如:

  • Google Pixel 2 和 Pixel 2 XL 设备发布时目标 FCM 版本为 2,其中实现了所需的 audio 2.0 HAL android.hardware.audio@2.0::IDeviceFactory/default
  • 对于随 Android 9 发布的 audio 4.0 HAL,Google Pixel 2 和 Pixel 2 XL 设备可以使用完整 OTA 升级到 4.0 HAL,后者实现了 android.hardware.audio@4.0::IDeviceFactory/default
  • 即使 compatibility_matrix.2.xml 仅指定了 audio 2.0,但由于 Android 9 框架(FCM 版本 3)认为 audio 4.0 在功能上是 audio 2.0 HAL 的替代品,因此已放宽对目标 FCM 版本为 2 的供应商映像的要求。

总而言之,假设 compatibility_matrix.2.xml 需要 audio 2.0,而 compatibility_matrix.3.xml 需要 audio 4.0,则要求如下:

FCM 版本(系统) 目标 FCM 版本(供应商) 要求
2 (8.1) 2 (8.1) Audio 2.0
3 (9) 2 (8.1) Audio 2.0 或 4.0
3 (9) 3 (9) Audio 4.0

升级目标 FCM 版本

在供应商映像升级期间,供应商还可以增加目标 FCM 版本,以指定升级后的供应商映像可以使用的目标 FCM 版本。要增加设备的目标 FCM 版本,供应商需要:

  1. 为目标 FCM 版本实现所有新的必需 HAL 版本。
  2. 修改设备清单文件中的 HAL 版本。
  3. 修改设备清单文件中的目标 FCM 版本。
  4. 移除已弃用的 HAL 版本。

例如,Google Pixel 和 Pixel XL 设备发布时搭载 Android 7.0,因此其目标 FCM 版本必须至少为 legacy。但是,设备清单声明目标 FCM 版本为 2,因为供应商映像已更新为符合 compatibility_matrix.2.xml

<manifest version="1.0" type="device" target-level="2">

如果供应商未实现所有必需的新 HAL 版本或未移除已弃用的 HAL 版本,则无法升级目标 FCM 版本。

例如,Google Pixel 2 和 Pixel 2 XL 设备的目标 FCM 版本为 2。虽然它们确实实现了一些 compatibility_matrix.3.xml(例如 audio 4.0、health 2.0 等)所需的 HAL,但它们未移除在 FCM 版本 3 (Android 9) 中已弃用的 android.hardware.radio.deprecated@1.0。因此,这些设备无法将目标 FCM 版本升级到 3。

在 OTA 期间强制执行内核要求

从 Android 9 或更低版本更新设备

在搭载 Android 9 或更低版本的设备上,请确保挑选以下 CL:

这些更改引入了 build 标志 PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS,并且对于搭载 Android 9 或更低版本发布的设备,此标志处于未设置状态。

  • 当更新到 Android 10 时,运行 Android 9 或更低版本的设备上的 OTA 客户端无法正确检查 OTA 软件包中的内核要求。需要进行这些更改才能从生成的 OTA 软件包中删除内核要求。
  • 当更新到 Android 11 时,可以选择设置 PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS build 标志,以便在生成更新软件包时检查 VINTF 兼容性。

如需详细了解此 build 标志,请参阅从 Android 10 更新设备

从 Android 10 更新设备

Android 10 引入了一个新的 build 标志 PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS。对于搭载 Android 10 发布的设备,此标志会自动设置为 true。当此标志设置为 true 时,脚本会从已安装的内核映像中提取内核版本和内核配置。

  • 当更新到 Android 10 时,OTA 更新软件包包含内核版本和配置。运行 Android 10 的设备上的 OTA 客户端会读取此信息以检查兼容性。
  • 当更新到 Android 11 时,OTA 软件包生成会读取内核版本和配置以检查兼容性。

如果脚本无法为您的内核映像提取此信息,请执行以下操作之一

  • 修改脚本以支持您的内核格式并为 AOSP 做贡献。
  • BOARD_KERNEL_VERSION 设置为内核版本,并将 BOARD_KERNEL_CONFIG_FILE 设置为已构建的内核配置文件 .config 的路径。当内核映像更新时,必须更新这两个变量。
  • 或者,将 PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS 设置为 false 以跳过检查内核要求。不建议这样做,因为任何不兼容性都会被隐藏,并且仅在更新后运行 VTS 测试时才会被发现。

您可以查看内核信息提取脚本的源代码:extract_kernel.py