BLOG

打包 卡刷/MiFlash线刷 一体包 教程 来自 閃電Flashh

适用于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# #官改#