动态分区刷GSI(通用镜像)的正确姿势
ChaptSand

一、通用镜像(GSI)和动态分区

通用镜像(GSI)

GSI

动态分区

Google在Android10开始引入了动态分区(Dynamic Partitions)
Dynamic Partitions
简单来说,就是把原来的system , vendor , product还有odm分区整合到了一起,构成super分区 ,在刷入设备的时候动态调整system等分区的大小,这个改变给让我们刷机、修改system分区等操作带来了困难,在Twrp里挂载后并不能直接刷入分区镜像

二、动态分区刷GSI的方法

  • 针对以下内容,
    • 解锁Bootloader ,开启ADB调试后食用
    • 适合具备相关刷机、救砖经验者进行尝试
    • 你的设备因此损坏,与我没有关系

方法1.使用动态系统更新(DSU)

Goole介绍:WhatIsDSU

步骤1.启用 DSU 功能标志

安卓10正式版及以上,可以在开发者选项中Feature flags > settings_dynamic_system 中启用该功能。国内系统UI大多隐藏了,可以尝试用下面的adb 命令开启:

1
adb shell setprop persist.sys.fflag.override.settings_dynamic_system true

步骤2.安装前的准备

通过DSU安装的GSI需要是可直接刷写的raw格式镜像,在开始前先检查你的镜像是不是raw格式
linux或者mac系统可以用file system.img命令查看

1
2
$ file system.img
$ system.img: Linux rev 1.0 ext2 filesystem data, UUID=91180515-3f1c-501d-888d-6f81f7ca3301 (extents) (large files) (huge files)

若返回值是这样的就是raw格式
若为稀疏格式(simg),可以使用以下命令把system镜像转为raw格式镜像

1
$ simg2img system.img system_raw.img
  • 一般gsi镜像都是simg格式,先检查转换

步骤3.将镜像打包为gz格式

1
gzip -c system_raw.img > system_raw.gz

*也可以直接用压缩工具压缩为gzip压缩包

步骤4.用adb推到手机内置储存

1
adb push system_raw.gz /storage/emulated/0/Download/

步骤5.安装动态系统更新

  • 下面的命令要全部一起复制执行
1
2
3
4
5
6
adb shell am start-activity \
-n com.android.dynsystem/com.android.dynsystem.VerificationActivity \
-a android.os.image.action.START_INSTALL \
-d file:///storage/emulated/0/Download/system_raw.gz \
--el KEY_SYSTEM_SIZE $(du -b system_raw.img|cut -f1) \
--el KEY_USERDATA_SIZE 8589934592

这里第五行的$(du -b system_raw.img|cut -f1)可直接用 system_raw.img 的大小代替,不然用windows刷会报错
比如我的个system_raw.img的大小为2370265088

systemimage size

命令就改为

1
2
3
4
5
6
adb shell am start-activity \
-n com.android.dynsystem/com.android.dynsystem.VerificationActivity \
-a android.os.image.action.START_INSTALL \
-d file:///storage/emulated/0/Download/system_raw.gz \
--el KEY_SYSTEM_SIZE 2370265088 \
--el KEY_USERDATA_SIZE 2370265088

然后你就会看到状态栏有正在安装的动态更新的提示,安装完重启进入第二个系统

小米10出厂安卓10,必然是支持DSU的

你可以用此方法尝试安装phh的aosp gsi

方法2.通过fastbootd刷入GSI镜像(推荐)

fastbootd——用户空间中的fastboot
注意,fastbootd和fastboot是两个不同的模式
fastbootd

  • 针对以下内容
    • Android 10引入了 启动时验证 (AVB),在刷写 GSI之前,先下载并刷入vbmeta.img以停用 AVB
    • 以下步骤请使用最新版android-platform-tools进行操作
    • 如果不知道说的是什么,建议先百度fastboot刷机

vbmeta.img一般包含会随gsi镜像一起发布

步骤1.重启到fastboot

关机状态同时按电源+音量减 或者开启adb调试后adb reboot bootloader

步骤2.刷入vbmeta.img停用AVB验证

1
fastboot --disable-verification flash vbmeta vbmeta.img

步骤3.还原MIUI官方recovery

目的是可以启动fastbootd
或者使用twrp里的用户空间fastboot也可以,注意如果twrp有这个功能可以不用刷回miui recovery

1
fastboot flash recovery recovery.img

步骤4.在fastboot模式下进入fastbootd模式

1
fastboot reboot fastboot

一定是要通过fastboot命令运行这句,才能启动到fastbootd模式

  • 到这里如果卡在waiting for any devices就是没有安装小米usb驱动,设备管理器会识别你的手机,右键更新驱动程序。
    PS:小米USB驱动

步骤5.刷入system镜像

安装好驱动,进入fastbootd之后,这时候fastboot命令已经可以识别system分区了

1
fastboot flash system system.img

步骤6.清楚数据

*会格式化data,防止加密(注意提前备份)

1
fastboot -w

步骤7.重启系统

1
fastboot reboot
  • 本文标题:动态分区刷GSI(通用镜像)的正确姿势
  • 本文作者:ChaptSand
  • 创建时间:2020-06-21 02:27:00
  • 本文链接:https://www.chaptsand.top/posts/da8abb0.html
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论