通用系统映像

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

通用系统映像 (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 具有以下配置:

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

  • 中央处理器架构。支持不同的 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中的构建目标列表)。

安卓 12 GSI 变化

搭载或更新至 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 测试

安卓 11 GSI 变化

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

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

安卓 10 GSI 变化

搭载或更新至 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 构建目标已被淘汰。对于使用 ramdisk 和非 system-as-root 从 Android 8 或 8.1 升级到 Android 10 的设备,请使用旧版 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
  • 系统根。在之前的Android版本中,不支持A/B更新的设备可以将系统镜像挂载到/system目录下。在Android 9中,系统镜像的根目录被挂载为设备的根目录。
  • 64 位活页夹接口。在 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) 网站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名称中央处理器架构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的设备也需要通过以下方式启动到fastbootd
    $ fastboot reboot fastboot
  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 master 分支的 cherrypicks,因此要提交 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等。