通用系统映像

通用系统映像 (GSI) 是系统映像,其中配置针对 Android 设备进行了调整。它被视为纯 Android 实现,其中包含未修改的 Android 开源项目 (AOSP) 代码,任何运行 Android 9 或更高版本的 Android 设备均可成功运行。

GSI 用于运行 VTS 和 CTS-on-GSI 测试。Android 设备的系统映像会被替换为 GSI,然后使用 供应商测试套件 (VTS)兼容性测试套件 (CTS) 进行测试,以确保设备使用最新版本的 Android 正确实现供应商接口。

要开始使用 GSI,请查看以下部分,详细了解 GSI 配置(以及允许的差异)和类型。当您准备好使用 GSI 时,请下载并构建 GSI 以用于您的设备目标,然后刷写 GSI 到 Android 设备。

GSI 配置和差异

当前的 Android GSI 具有以下配置

当前的 Android GSI 包括以下主要差异

  • CPU 架构。支持不同的 CPU 指令(ARM、x86 等)和 CPU 位数(32 位或 64 位)。

用于 Treble 兼容性测试的 GSI 目标

用于兼容性测试的 GSI 由设备启动时所用的 Android 版本决定。

设备类型 构建目标
搭载 Android 15 的设备 gsi_$arch-user(已签名)
搭载 Android 14 的设备 gsi_$arch-user(已签名)
搭载 Android 13 的设备 gsi_$arch-user(已签名)
搭载 Android 12L 的设备 gsi_$arch-user(已签名)
搭载 Android 12 的设备 gsi_$arch-user(已签名)
搭载 Android 11 的设备 gsi_$arch-user(已签名)

所有 GSI 均基于 Android 12 代码库构建,并且每个 CPU 架构都有一个对应的 GSI 二进制文件(请参阅构建 GSI 中的构建目标列表)。

Android 12 GSI 变更

搭载或更新到 Android 12 的设备必须使用 Android 12 GSI 进行兼容性测试。这包括与早期 GSI 相比的以下主要变更

  • 目标名称。用于兼容性测试的 GSI 目标名称已更改为 gsi_$arch。目标名称为 aosp_$arch 的 GSI 保留供 Android 应用开发者使用。CTS-on-GSI 测试计划也已缩减,用于测试供应商接口。
  • 旧版 GSI 已逐步淘汰。GSI 12 移除了为不完全支持 Treble 的 Android 8.0 或 8.1 设备提供的解决方法。
  • Userdebug SEPolicy。GSI gsi_$arch 包含 userdebug_plat_sepolicy.cil。刷写 OEM 特定的 vendor_boot-debug.imgboot-debug.img 时,/system/bin/init 将从 GSI system.img 加载 userdebug_plat_sepolicy.cil。有关详情,请参阅 使用调试 Ramdisk 进行 VTS 测试

Android 11 GSI 变更

搭载或更新到 Android 11 的设备必须使用 Android 11 GSI 进行兼容性测试。这包括与早期 GSI 相比的以下主要变更

  • system_ext 内容。Android 11 定义了一个新的分区 system_ext。GSI 将系统扩展程序内容放在文件夹 system/system_ext 下。
  • APEX。GSI 同时包含展平的和压缩的 APEX。要使用哪种 APEX 由运行时供应商分区中的系统属性 ro.apex.updatable 决定。有关详情,请参阅 配置系统以支持 APEX 更新

Android 10 GSI 变更

搭载或更新到 Android 10 的设备必须使用 Android 10 GSI 进行兼容性测试。这包括与早期 GSI 相比的以下主要变更

  • 用户版本。GSI 具有 Android 10 的用户版本。在 Android 10 中,用户版本 GSI 可用于 CTS-on-GSI/VTS 兼容性测试。有关详情,请参阅 使用调试 Ramdisk 进行 VTS 测试
  • 未稀疏格式。目标为 aosp_$arch 的 GSI 采用未稀疏格式构建。如有必要,您可以使用 img2simg 将未稀疏 GSI 转换为稀疏格式。
  • System-as-root。名为 aosp_$arch_a 的旧版 GSI 构建目标已逐步淘汰。对于从 Android 8 或 8.1 升级到 Android 10 且具有 ramdisk 和非 system-as-root 的设备,请使用旧版 GSI aosp_$arch_ab。ramdisk 中升级后的 init 支持具有 system-as-root 布局的 OEM system.img。
  • 验证启动。使用 GSI 时,您只需解锁设备。无需停用验证启动。

Android 9 GSI 变更

搭载或更新到 Android 9 的设备必须使用 Android 9 GSI 进行兼容性测试。这包括与早期 GSI 相比的以下主要变更

  • 合并 GSI 和模拟器。GSI 基于模拟器产品的系统映像构建,例如 aosp_arm64aosp_x86
  • System-as-root。在以前版本的 Android 中,不支持 A/B 更新的设备可以将系统映像挂载在 /system 目录下。在 Android 9 中,系统映像的根目录将作为设备的根目录进行挂载。
  • 64 位 Binder 接口。在 Android 8.x 中,32 位 GSI 使用 32 位 Binder 接口。Android 9 不支持 32 位 Binder 接口,因此 32 位 GSI 和 64 位 GSI 都使用 64 位 Binder 接口。
  • VNDK 强制执行。在 Android 8.1 中,VNDK 是可选的。从 Android 9 开始,VNDK 是强制性的,因此必须设置 BOARD_VNDK_VERSION
  • 兼容的系统属性。Android 9 启用了对兼容的系统属性的访问权限检查 (PRODUCT_COMPATIBLE_PROPERTY_OVERRIDE := true)。

Android 9 Keymaster 变更

在以前版本的 Android 中,实现 Keymaster 3 或更低版本的设备需要验证正在运行的系统报告的版本信息(ro.build.version.releasero.build.version.security_patch)是否与引导加载程序报告的版本信息相符。此类信息通常从启动映像标头中获取。

在 Android 9 及更高版本中,此要求已更改,以便供应商能够启动 GSI。具体而言,Keymaster 不应执行验证,因为 GSI 报告的版本信息可能与供应商的引导加载程序报告的版本信息不符。对于实现 Keymaster 3 或更低版本的设备,供应商必须修改 Keymaster 实现以跳过验证(或升级到 Keymaster 4)。有关 Keymaster 的详情,请参阅硬件后盾的密钥库

下载 GSI

您可以从 AOSP 持续集成 (CI) 网站下载预构建的 GSI,网址为 ci.android.com。如果您的硬件平台的 GSI 类型无法下载,请参阅以下部分,详细了解如何为特定目标构建 GSI。

构建 GSI

从 Android 9 开始,每个 Android 版本在 AOSP 上都有一个名为 DESSERT-gsi 的 GSI 分支(例如,android12-gsi 是 Android 12 上的 GSI 分支)。GSI 分支包含 Android 的内容,其中应用了所有安全补丁GSI 补丁

要构建 GSI,请通过从 GSI 分支下载选择 GSI 构建目标来设置 Android 源代码树。使用下方的构建目标表来确定适用于您设备的正确 GSI 版本。构建完成后,GSI 将成为系统映像(即 system.img),并显示在输出文件夹 out/target/product/generic_arm64 中。

例如,要在 GSI 分支 android12-gsi 上构建 GSI 构建目标 gsi_arm64-userdebug,请运行以下命令。

$ repo init -u https://android.googlesource.com/platform/manifest -b android12-gsi
$ repo sync -cq
$ source build/envsetup.sh
$ lunch gsi_arm64-userdebug
$ make -j4

Android GSI 构建目标

以下 GSI 构建目标适用于搭载 Android 9 或更高版本的设备。

GSI 名称 CPU 架构 Binder 接口位数 System-as-root 构建目标
gsi_arm ARM 32 gsi_arm-user
gsi_arm-userdebug
gsi_arm64 ARM64 64 gsi_arm64-user
gsi_arm64-userdebug
gsi_x86 x86 32 gsi_x86-user
gsi_x86-userdebug
gsi_x86_64 x86-64 64 gsi_x86_64-user
gsi_x86_64-userdebug

刷写 GSI 的要求

Android 设备的设计可能有所不同,因此没有通用的命令或一组刷写 GSI 的说明适用于所有设备。请咨询 Android 设备制造商,以获取明确的刷写说明。请使用以下步骤作为一般准则

  1. 确保设备具有以下条件
    • Treblized
    • 解锁设备的方法(以便可以使用 fastboot 进行刷写)
    • 解锁状态,以便可以通过 fastboot 进行刷写(为确保您拥有最新版本的 fastboot,请从 Android 源代码树构建。)
  2. 擦除当前的系统分区,然后将 GSI 刷写到系统分区。
  3. 清除用户数据并清除其他必要分区中的数据(例如,用户数据和系统分区)。
  4. 重启设备。

例如,要将 GSI 刷写到任何 Pixel 设备

  1. 启动进入 fastboot 模式解锁引导加载程序
  2. 支持 fastbootd 的设备还需要启动进入 fastbootd,方法是
    $ fastboot reboot fastboot
  3. 擦除 GSI 并将其刷写到系统分区
    $ fastboot erase system
    $ fastboot flash system system.img
  4. 清除用户数据并清除其他必要分区中的数据(例如,用户数据和系统分区)
    $ fastboot -w
  5. 重启回到引导加载程序
    $ fastboot reboot-bootloader
  6. 在刷写提供的 vbmeta 时停用验证启动验证
    $ fastboot --disable-verification flash vbmeta vbmeta.img
  7. 重启
    $ fastboot reboot
在系统分区较小的 Android 10 或更高版本设备上,刷写 GSI 时可能会出现以下错误消息
    Resizing 'system_a'    FAILED (remote: 'Not enough space to resize partition')
    fastboot: error: Command failed
使用以下命令删除产品分区,并为系统分区释放空间。这会提供额外的空间来刷写 GSI
$ fastboot delete-logical-partition product_a
后缀 _a 应与系统分区的槽位 ID 匹配,例如本示例中的 system_a

为 GSI 做贡献

Android 欢迎您为 GSI 开发做贡献。您可以通过以下方式参与并帮助改进 GSI

  • 创建 GSI 补丁程序。DESSERT-gsi不是开发分支,并且仅接受来自 AOSP 主分支的 cherrypick,因此要提交 GSI 补丁程序,您必须
    1. 将补丁程序提交到 AOSP main 分支。
    2. 将补丁程序 cherrypick 到 DESSERT-gsi
    3. 提交错误以获得对 cherrypick 的审核。
  • 报告 GSI 错误或提出其他建议。查看报告错误中的说明,然后浏览或提交 GSI 错误

提示

使用 adb 更改导航栏模式

使用 GSI 启动时,导航栏模式由供应商替换配置。您可以在运行时运行以下 adb 命令来更改导航栏模式。

adb exec-out cmd overlay enable-exclusive com.android.internal.systemui.navbar.mode

其中 mode 可以是 threebuttontwobuttongestural 等。