通用系统映像 (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 具有以下配置
- Treble。GSI 完全支持基于 AIDL/HIDL 的架构变更(也称为 Treble),包括支持 AIDL 接口和 HIDL 接口。您可以在任何使用 AIDL/HIDL 供应商接口的 Android 设备上使用 GSI。(如需了解详情,请参阅架构资源。)
- 文件系统。GSI 使用 ext4 文件系统。
当前的 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.img
或boot-debug.img
时,/system/bin/init
将从 GSIsystem.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 的设备,请使用旧版 GSIaosp_$arch_ab
。ramdisk 中升级后的init
支持具有 system-as-root 布局的 OEM system.img。 - 验证启动。使用 GSI 时,您只需解锁设备。无需停用验证启动。
Android 9 GSI 变更
搭载或更新到 Android 9 的设备必须使用 Android 9 GSI 进行兼容性测试。这包括与早期 GSI 相比的以下主要变更
- 合并 GSI 和模拟器。GSI 基于模拟器产品的系统映像构建,例如
aosp_arm64
和aosp_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.release
和 ro.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 设备制造商,以获取明确的刷写说明。请使用以下步骤作为一般准则
- 确保设备具有以下条件
- Treblized
- 解锁设备的方法(以便可以使用
fastboot
进行刷写) - 解锁状态,以便可以通过
fastboot
进行刷写(为确保您拥有最新版本的fastboot
,请从 Android 源代码树构建。)
- 擦除当前的系统分区,然后将 GSI 刷写到系统分区。
- 清除用户数据并清除其他必要分区中的数据(例如,用户数据和系统分区)。
- 重启设备。
例如,要将 GSI 刷写到任何 Pixel 设备
- 启动进入
fastboot
模式并解锁引导加载程序。 - 支持
fastbootd
的设备还需要启动进入fastbootd
,方法是$ fastboot reboot fastboot
- 擦除 GSI 并将其刷写到系统分区
$ fastboot erase system $ fastboot flash system system.img
- 清除用户数据并清除其他必要分区中的数据(例如,用户数据和系统分区)
$ fastboot -w
- 重启回到引导加载程序
$ fastboot reboot-bootloader
- 在刷写提供的 vbmeta 时停用验证启动验证
$ fastboot --disable-verification flash vbmeta vbmeta.img
- 重启
$ fastboot reboot
Resizing 'system_a' FAILED (remote: 'Not enough space to resize partition') fastboot: error: Command failed
$ fastboot delete-logical-partition product_a
_a
应与系统分区的槽位 ID 匹配,例如本示例中的 system_a
。为 GSI 做贡献
Android 欢迎您为 GSI 开发做贡献。您可以通过以下方式参与并帮助改进 GSI
- 创建 GSI 补丁程序。
DESSERT-gsi
不是开发分支,并且仅接受来自 AOSP 主分支的 cherrypick,因此要提交 GSI 补丁程序,您必须- 将补丁程序提交到 AOSP
main
分支。 - 将补丁程序 cherrypick 到
DESSERT-gsi
。 - 提交错误以获得对 cherrypick 的审核。
- 将补丁程序提交到 AOSP
- 报告 GSI 错误或提出其他建议。查看报告错误中的说明,然后浏览或提交 GSI 错误。
提示
使用 adb 更改导航栏模式
使用 GSI 启动时,导航栏模式由供应商替换配置。您可以在运行时运行以下 adb 命令来更改导航栏模式。
adb exec-out cmd overlay enable-exclusive com.android.internal.systemui.navbar.mode
其中 mode 可以是 threebutton
、twobutton
、gestural
等。