GSI/GKI 与 Android 玩机

Android 新手机解锁 BootLoader 后没有刷机包可玩? 试试 GSI 和 GKI 吧!

知识回顾

Android 分区架构

还记得 Android 7 及以前, Android 系统的分区还很少, 如 system,cache,boot,recovery.
而随着 Android 架构的不断演进, Android 系统的分区不断细分.
system分区,因Treble项目解决Android大版本碎片化问题,拆分出vendor,并为定制化拆分出 product,system_ext等.
boot分区,因GKI项目解决内核碎片化问题,拆分ko等硬件文件到vendor_boot,拆分ramdisk到init_boot.

Android R Partitions

Android 分区
Android boot 分区

GSI

Google 为解决设备厂商 Android 大版本升级慢导致的碎片化等问题, 从 Android 8 开始 启用 Treble 架构, 将 vendor 与 system 解耦, 新增 vendor 分区 存放 HAL 等设备硬件相关文件, system(含 system_ext/product ) 存放Android系统通用的文件.
vendor 只 依赖 system 中对应版本的 vndk 库(Vendor Native Development Kit), 所以system 可实现独立升级.

Android VNDK

GSI(generic system image)通用系统镜像
VNDK
VNDK snapshot
Here comes Treble: A modular base for Android

GKI

类似 GSI, Google 为解决 Android 设备 Linux 内核的碎片化导致安全漏洞得不到及时修复等问题.
从 Android 11 + 5.4 版本 Linux 内核 开始 GKI 1.0, 确立基本架构, 新增 vendor_boot 分区存放 ko 等设备硬件相关文件, boot 分区仅存放通用内核(GKI), GKI 1.0设备只需要通过GKI测试.
从 Android 12 + 5.10 版本Linux 内核 开始 GKI 2.0, 出厂搭载 GKI.
从 Android 13 开始, boot 中的 ramdisk 进一步被拆分, 存放到新增的 init_boot 分区.

GKI

GKI(generic kernel image)通用内核镜像

如何玩 GSI

上面已经介绍过, system 可独立升级. 那我们下载一个可以用的 system.img, 刷进system, 不就…
是的,就是这么简单.当然前提是设备解锁 BootLoader.

DSU(Dynamic System Update)

Android 提供了 DSU(Dynamic System Update)功能,
进入开发者选项,点击DSU Loader,然后点希望使用的版本,系统自动下载,
下载\安装完成之后,下拉通知栏点击重启,即可.

刷机

不过瘾?那就直接刷(刷机注意备份数据不用我多说吧):

  • 下载 system.img
    从地址下载到包(可能需要解压)得到system.img.

  • 重启到刷机模式
    非super分区的设备重启到bootloader模式:
    adb reboot bootloader
    super分区的设备重启的fastbootd模式:
    adb reboot fastboot

  • 开刷:
    fastboot flash system system.img

  • 恢复出厂:
    fastboot -w
    部分设备可能异常,可以尝试进入 recovery 执行恢复出厂设置.

  • 重启, 理论上就能开机咯.
    fastboot reboot

Android 官方GSI

GSI Release

DSU 功能对应的 GSI:
https://dl.google.com/developers/android/gsi/gsi-src.json
Android 11
https://dl.google.com/developers/android/rvc/images/gsi/gsi-dsc.json
Android 12
https://dl.google.com/developers/android/sc/images/gsi/gsi-dsc.json
Android 13
https://dl.google.com/developers/android/tm/images/gsi/gsi-dsc.json

三方 GSI

phh treble:下载 汇总列表
Andy Yan LineageOS GSI: 下载 帖子
Nippon GSI
Treble xda 社区

GSI 移植

Erfan’s GSIs tool

移植注意事项

  • 分区:
    如果把product\system_ext都打包到system.img,则需要新增文件etc/init/config/skip_mount.cfg跳过挂载设备上的product\system_ext分区.
  • apex:
    ro.apex.updatable属性控制挂载apex文件(true)还是直接使用apex解压的目录(false).

GKI

既然 boot 分区可以独立升级,那我们有很多玩法:
比如可以升级 Google 新版 GKI, 修改并编译内核,加入新功能…

查找设备对应的内核版本

  • 查看内核版本
    adb shell cat /proc/version
    在Google官网找到对应的版本,查到版本对应的分支, 刷该分支的新版本内核试试?下载源代码编译试试?

  • 举个例子:
    我手上的某设备的内核版本:
    Linux version 5.10.101-android12-9-00001-gf4c0e37dbcde-ab8596533 (build-user@build-host) (Android (7284624, based on r416183b) clang version 12.0.5 (https://android.googlesource.com/toolchain/llvm-project c935d99d7cf2016289302412d708641d52d2f7ee), LLD 12.0.5 (/buildbot/src/android/llvm-toolchain/out/llvm-project/lld c935d99d7cf2016289302412d708641d52d2f7ee)) #1 SMP PREEMPT Mon May 16 05:21:23 UTC 2022
    是的,看到他的版本号是: 5.10.101-android12-9-00001-gf4c0e37dbcde-ab8596533
    首先看大版本:5.10 + Android 12,进入android12-5.10 Release Builds
    然后我们看到我们的内核版本中间的g开头的字符串:gf4c0e37dbcde,把g(估计Google或者GKI的首字母?)去掉,得到f4c0e37dbcde.
    然后在页面搜索,就能找到源代码和编译好的二进制.
    如果你的内核版本中间的字符串不是g开头?那应该不是 GKI.

刷入方法:

  • 重启到fastboot模式:
    adb reboot bootloader
  • 直接开刷:
    fastboot flash boot boot-xxx.img
  • 重启啦:
    fastboot reboot

GKI 下载地址

Google 官方

GKI release builds

GKI注意事项

注意区分压缩格式,我手上的设备使用的是gz压缩.