适用于ab / vab分区机型,a-only机型请勿照抄
模板:查看链接
提取码:Qogk
先来看一下包的基本结构
bin → 卡刷调用的zstd工具
images → 镜像文件
META-INF → 卡刷脚本
MiFlash2018-5-28-0 → MiFlash工具
AdbWinApi.dll AdbWinUsbApi.dll fastboot.exe → 线刷调用的fastboot工具
flash_all.bat flash_all_except_storage.bat flash_all_lock.bat → 线刷脚本
super.img.zst → zstd打包的super.img
zstd.exe → 线刷调用的zstd工具
一、打包super
① super打包raw格式(sparse无法卡刷)
② 把zstd.exe和你的super.img放到同一目录
③ cmd
④ 输入zstd -8 super.img
(-8为压缩级别,范围1~19,默认值为3,请根据需求和硬件水平设置数值)
⑤ 等待压缩完成,把super.img.zst复制到包里
二、准备镜像文件
① 解包你的底包(卡刷包)
② payload解出除了super的逻辑分区之外的所有其他分区
(super的逻辑分区指system,system_ext,product,vendor,odm等分区)
③ 处理好你需要处理的分区的镜像
(比如去除avb校验,boot修补magisk之类的)
④ 把这些镜像(处理完的、不需要处理的)复制到包里的images文件夹里
三、特殊分区镜像
① 部分分区官方卡刷包里没有,但是第三方ROM会进行修改,比如cust和logo
解包官方线刷包,找到对应的镜像文件
② 按照需求修改处理
③ 复制到images文件夹里
四、MiFlash线刷脚本详解
如图,左为我的脚本,右为K40官方脚本
fastboot getvar product
检测设备代号,防止刷错包,后面*"里的alioth、thyme之类的就是机型代号
官方脚本::check anti_version开头的这一段
防回滚滚验证,可直接删除这一段
::
注释
fastboot erase
擦除对应的分区
fastboot flash
刷写对应的分区
fastboot flash crclist
fastboot flash sparsecrclist
分区验证,一般直接删除这两行命令
fastboot flash metadata
fastboot flash userdata
刷写metadata、userdata分区,相当于清除用户数据(如果刷进去的镜像干净的话)
fastboot set_active
设置槽位,一般设置为a槽
fastboot reboot
重启命令,默认重启进系统
|| @echo "XXX" && exit 1
执行||前的命令如果执行失败则报错XXX,并且自动退出(后面的命令不执行)
zstd -k -d %~dp0/super.img.zst -o %~dp0images/super.img
使用zstd把包里的super.img.zst解压到images文件夹,保存名称为super.img,并且保留原文件
cd %~dp0images/
进入包里的images目录
del super.img
删除当前目录下文件名为super.img的文件
五、修改线刷脚本
① flash_all.bat对应MiFlash的全部删除,flash_all_except_storage.bat对应MiFlash的保留用户数据
② 开头加上以下命令(alioth改成你的机型代号)
fastboot getvar product 2>&1 | findstr /r /c:"^product: *alioth" || echo Missmatching image and device
fastboot getvar product 2>&1 | findstr /r /c:"^product: *alioth" || exit /B 1
③ 然后加上以下命令
zstd -k -d %~dp0/super.img.zst -o %~dp0images/super.img
fastboot flash super %~dp0images/super.img || @echo "Flash super error" && exit 1
(这里解释一下为什么super要放在前面刷。如果super放在最后刷的话,刷完之后他有一个bug,就是他没缓过来,如果这个时候执行reboot命令的话并不能正常执行。让他放在前面刷就行了,刷完super继续执行flash命令刷其他分区,他会卡住一小会,等待即可,后面的命令就能正常执行了。此外我调用了新的fastboot工具而不是使用miflash自带的fastboot工具,也是因为miflash自带的这一套可能会触发super秒刷完,实际上没刷进去的bug)
④ 根据需要加上刷写特殊分区(比如cust、logo之类的)的命令
⑤ 根据你机型的分区表,加上刷写各分区ab分区的命令(前面payload提取出来的那些分区)
⑥ 在flash_all.bat里添加以下命令(用于清除数据)
fastboot erase metadata || @echo "Erase metadata error" && exit 1
fastboot flash metadata %~dp0images/metadata.img || @echo "Flash metadata error" && exit 1
fastboot flash userdata %~dp0images/userdata.img || @echo "Flash userdata error" && exit 1
(metadata.img和userdata.img同样可以在官方线刷包里找到,找到之后放到包里的images文件夹里即可)
⑦ 末尾添加以下命令
fastboot set_active a || @echo "Set active a error" && exit 1
fastboot reboot || @echo "Reboot error" && exit 1
cd %~dp0images/
del super.img
⑧ 要是还是没搞懂的话拿我给的模板研究研究,多思考、多对比、多测试
六、你玩不玩原神
① 打开flash_all_lock.bat,对应MiFlash的全部删除并lock,这个选项对于第三方包来说没有任何用处,所以在这里我做了一个嘲讽弹窗
② 根据需求修改模板里的嘲讽内容
七、修改卡刷脚本
① 基于我给的模板,打开包里的META-INF/com/google/android/update-binary
② 根据需求修改作者信息
③ 根据你机型的分区表,修改刷写各分区ab分区的命令(前面payload提取出来的那些分区)
④ 根据需要删改刷写特殊分区(比如cust、logo之类的)的命令(这类分区通常没有ab分区,如果有ab分区的话请放到第③步那里)
最后的最后聊聊我为什么执着于MiFlash:
不同作者做出来的工具各不相同,那这就导致了换一个作者的包就要重新学习一遍,就会有新的注意事项,甚至是有新的操作逻辑
徒增学习成本大可不必,官方给的MiFlash工具也能正常运行大部分命令,不局限于fastboot命令,zstd之类的都能调用
既然如此为何不直接使用MiFlash,用户会刷官方包就会刷第三方包,岂不美哉?同时也确保了用户有基本的救砖能力,能够自行线刷回官方包
卡刷脚本参考查看链接,感谢@Ranshen_Cervine
线刷zstd参考查看链接,感谢@寒风居士
卡刷zstd部分思路来自@名字随便取个就好了
线刷lock脚本嘲讽方案来自@是小菜菜吖
#MIUI官改# #ProjectTreble# #官改#