准确地说是给ZUK Z2 Pro救砖。
Z2 Pro搭载了高通骁龙820+UFS,所以本文也适用于一些其他的骁龙平台手机。MiFlash里也有一些与MTK平台刷机有关的文件(SP Flash Tool、DA),同时支持fastboot线刷功能,这里没有测试。
Z2 Pro刷入AospExtended 6.7和OpenGApps后,安装Magisk失败,开机卡AEX Logo,且将Magisk创建的boot
分区备份文件刷回手机也无法恢复。在TWRP下清除所有数据(Dalvik Cache、Cache、System、Data、Vendor),重新刷入AospExtended 6.7和OpenGApps正常,但是一旦安装Magisk问题就会重现。
(Z2 Pro没有使用A/B分区,也没有使用System-as-Root,但是AEX 6.x由于是Android 9,因而可能是System-as-Root,刷机之前没有检查)
进9008模式,用QFIL刷ZUI,期望获得一个最原始的环境,从头开始。
结果QFIL死活不认手机,提示
Download Fail:Sahara Fail:QSaharaServer Fail:Process fail
以及
ERROR: function: sahara_rx_data:194 Unable to read packet header. Only read 0 bytes.
多次重启QFIL工具/电脑/手机均未果,adb reboot edl
之后紧接着Start Download
也不行,更换QPST/QFIL版本也无效,同时也排除文件路径及驱动签名(设备管理器中没有感叹号/问号等异常情况)等原因,又不想用QSB卡刷,也不想用LG K20 Plus的工具,于是尝试了网友推荐的MiFlash。
MiFlash刷机的基本流程见:http://www.shuajibang.net/news/detail/23780
MiFlash将Fastboot线刷、高通9008/QPST线刷、MTK SP Flash Tool线刷等功能合并进了一个简单的界面,用户只要选择刷机包,再选择设备,MiFlash就可以自动判断出刷机包类型,然后按照相应的方式刷机。因此,这里只需选择Z2 Pro的QPST线刷包,MiFlash根据一定条件(猜测是包内的XML文件)判断出是9008线刷包,并调用相应工具(QSaharaServer.exe
)进行后续的刷写操作。
另外,MiFlash有自动重试功能,且超时/重试时间都相当短(超时小于1秒,重试间隔3秒左右,远低于QFIL的90秒),因此在Only read 0 bytes.
的情况下MiFlash偶尔还能成功刷机。
然后说一下我踩到的两个坑:
-
provision.xml
。
UFS的Provisioning是在UFS上划分逻辑单元号(LUN)的操作,通常是不可逆的一次性操作(IRRECOVERABLE ONE TIME OPERATION
)。
- 折腾过U盘量产的读者应该知道LUN是介于U盘的主控/闪存芯片和分区之间的概念,一支U盘可以通过量产划分为多个LUN,每个LUN可以表现为USB-ZIP/USB-HDD/USB-CDROM等多种形态,并拥有自己的分区表,以及一个或多个分区。
- 而折腾SCSI存储的读者更容易想到这个解释,以及这两个命令。
Z2 Pro上的LUN与U盘的LUN更相似一些。Z2 Pro出厂时,其LUN 0是/cache
、/data
、/sdcard
等允许用户随时修改的分区,LUN 4包含/system
、recovery
、boot
等相对底层的分区,LUN 1和2是xbl
分区。而剩下的LUN 3和5(包括LUN 4的fsg
和devinfo
等分区) 想必 包含设备的一些基本信息(IMEI、MEID、Wifi/蓝牙的MAC等),QPST线刷时不会刷写这些LUN/分区,而重新Provision会导致这些LUN和分区内的数据丢失,导致我需要从原来的备份里尝试恢复。这里有一个类似的案例,并包含详细的分区名称及作用。
MiFlash读取到provision.xml
文件时,就一定会按文件指示将手机重新Provision,而如果文件格式不标准则会报错,如XML 注释中不能包含“--”,并且“-”不能是最后一个字符。 第 1 行,位置 6。
这时 不建议 尝试按照错误提示去修改XML文件,而更应该尝试把该文件改名或删除,让MiFlash不要自作主张去重新Provision。如果重新Provision了,那么恭喜你,手机不会变砖,但是变成了平板。
-
rawprogram_unsparse[0, 4].xml
。
MiFlash不认这两个文件,只认rawprogram[LUN].xml
和对应的patch[LUN].xml
,导致第一次成功重新Provision以后,系统并没有正确刷入,程序就结束了。
这个问题倒是容易处理,改一下文件名即可。