通用系统映像

通用系统映像 (GSI) 是针对 Android 设备调整配置的系统映像。它被认为是具有未经修改的 Android 开源项目 (AOSP) 代码的纯 Android实现,任何运行 Android 9 或更高版本的 Android 设备都可以成功运行。

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

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

GSI 配置和差异

当前的 Android GSI 有以下配置:

  • 高音。 GSI 包括对基于 AIDL/HIDL 的架构更改(也称为Treble )的完全支持,包括对AIDL 接口HIDL 接口的支持。您可以在任何使用 AIDL/HIDL 供应商接口的 Android 设备上使用 GSI。 (有关更多详细信息,请参阅架构资源。)
  • 文件系统。 GSI 使用 ext4 文件系统。

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

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

高音一致性测试的 GSI 目标

用于合规性测试的 GSI 由设备启动时使用的 Android 版本决定。

设备类型构建目标
搭载 Android 12 的设备gsi_$arch-user (签名)
搭载 Android 11 的设备gsi_$arch-user (签名)
搭载 Android 10 的设备gsi_$arch-user (签名)
搭载 Android 9 的设备gsi_$arch-userdebug

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

Android 12 GSI 更改

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

  • 目标名称。合规性测试的 GSI 目标名称更改为gsi_$arch 。目标名称为aosp_$arch的 GSI 保留给 Android 应用程序开发人员。测试计划CTS-on-GSI也减少了用于测试供应商接口。
  • 旧版 GSI 已逐步淘汰。 GSI 12 删除了适用于未完全 Treblized 的 Android 8.0 或 8.1 设备的解决方法。
  • 用户调试 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 。有关详细信息,请参阅使用 Debug Ramdisk 进行 VTS 测试

Android 11 GSI 更改

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

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

Android 10 GSI 更改

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

  • 用户构建。 GSI 具有来自 Android 10 的用户构建。在 Android 10 中,用户构建 GSI 可用于 CTS-on-GSI/VTS 合规性测试。有关详细信息,请参阅使用 Debug Ramdisk 进行 VTS 测试
  • 非稀疏格式。aosp_$arch为目标的 GSI 使用非稀疏格式构建。如有必要,您可以使用img2simg将未稀疏的 GSI 转换为稀疏格式。
  • 系统作为根。名为aosp_$arch_a的旧版 GSI 构建目标已被淘汰。对于从 Android 8 或 8.1 升级到具有 ramdisk 和非系统作为 root 的 Android 10 的设备,请使用旧版 GSI aosp_$arch_ab 。 ramdisk 中升级的init支持具有 system-as-root 布局的 OEM system.img。
  • 验证启动。使用 GSI,您只需解锁设备。没有必要禁用验证启动。

Android 9 GSI 更改

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

  • 合并 GSI 和模拟器。 GSI 是根据模拟器产品的系统映像构建的,例如aosp_arm64aosp_x86
  • 系统作为根。在之前的 Android 版本中,不支持 A/B 更新的设备可以将系统映像挂载到/system目录下。在 Android 9 中,系统映像的根目录作为设备的根目录挂载。
  • 64 位活页夹接口。在 Android 8.x 中,32 位 GSI 使用 32 位绑定器接口。 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) 网站ci.android.com下载预构建的 GSI。如果您的硬件平台的 GSI 类型无法下载,请参阅以下部分以了解有关为特定目标构建 GSI 的详细信息。

构建 GSI

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

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

例如,要在 GSI 分支android12-gsi gsi 上构建 GSI 构建目标gsi_arm64-userdebug 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 接口位数系统为根构建目标
gsi_arm手臂64gsi_arm-user
gsi_arm-userdebug
gsi_arm64 ARM64 64gsi_arm64-user
gsi_arm64-userdebug
gsi_x86 x86 64gsi_x86-user
gsi_x86-userdebug
gsi_x86_64 x86-64 64gsi_x86_64-user
gsi_x86_64-userdebug

刷写 GSI 的要求

Android 设备可以有不同的设计,因此没有通用的命令或指令集用于刷新 GSI 以应用于所有设备。请与 Android 设备的制造商联系以获取明确的闪烁说明。使用以下步骤作为一般准则:

  1. 确保设备具有以下内容:
    • 高音
    • 一种解锁设备的方法(因此可以使用fastboot它们)
    • 解锁状态,使其可通过fastboot (为确保您拥有最新版本的fastboot ,请从 Android 源代码树构建它。)
  2. 擦除当前系统分区,然后将 GSI 刷入系统分区。
  3. 擦除用户数据并清除其他必要分区中的数据(例如,用户数据和系统分区)。
  4. 重新启动设备。

例如,要将 GSI 闪存到任何 Pixel 设备:

  1. 引导至快速fastboot模式解锁引导加载程序
  2. 支持fastbootd的设备也需要通过
    $ fastboot reboot fastboot
    启动到fastbootd
  3. 擦除 GSI 并将其刷入系统分区:
    $ fastboot erase system
    $ fastboot flash system system.img
    
  4. 擦除用户数据并清除其他必要分区中的数据(例如,用户数据和系统分区):
    $ fastboot -w
  5. 重启:
    $ 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 主分支的樱桃选择,因此要提交 GSI 补丁,您必须:
    1. 将补丁提交到AOSP master分支。
    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等。