通用系统映像 (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.img
或boot-debug.img
时,/system/bin/init
将从 GSIsystem.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 的设备,请使用旧版 GSIaosp_$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_arm64
和aosp_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.release
和ro.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 | 手臂 | 64 | 是 | gsi_arm-user gsi_arm-userdebug |
gsi_arm64 | ARM64 | 64 | 是 | gsi_arm64-user gsi_arm64-userdebug |
gsi_x86 | x86 | 64 | 是 | gsi_x86-user gsi_x86-userdebug |
gsi_x86_64 | x86-64 | 64 | 是 | gsi_x86_64-user gsi_x86_64-userdebug |
刷写 GSI 的要求
Android 设备可以有不同的设计,因此没有通用的命令或指令集用于刷新 GSI 以应用于所有设备。请与 Android 设备的制造商联系以获取明确的闪烁说明。使用以下步骤作为一般准则:
- 确保设备具有以下内容:
- 高音
- 一种解锁设备的方法(因此可以使用
fastboot
它们) - 解锁状态,使其可通过
fastboot
(为确保您拥有最新版本的fastboot
,请从 Android 源代码树构建它。)
- 擦除当前系统分区,然后将 GSI 刷入系统分区。
- 擦除用户数据并清除其他必要分区中的数据(例如,用户数据和系统分区)。
- 重新启动设备。
例如,要将 GSI 闪存到任何 Pixel 设备:
- 引导至快速
fastboot
模式并解锁引导加载程序。 - 支持
fastbootd
的设备也需要通过$ fastboot reboot fastboot
启动到fastbootd
- 擦除 GSI 并将其刷入系统分区:
$ fastboot erase system $ fastboot flash system system.img
- 擦除用户数据并清除其他必要分区中的数据(例如,用户数据和系统分区):
$ fastboot -w
- 重启:
$ fastboot reboot
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 补丁,您必须:- 将补丁提交到AOSP
master
分支。 - 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
等。