
QFIL全称Qualcomm Flash Image Loader是高通官方推出的固件烧录工具也是我们搞安卓底层、手机维修、嵌入式开发和产线测试的人绕不开的一个名字。很多朋友第一次听说它多半是手机变砖、进不了系统或者需要给一台高通的板子重新做量产烧录而QFIL的底层依赖是高通的EDL紧急下载协议设备在EDL下枚举出来的USB端口状态就是大家常说的9008模式。这篇教程我打算从头讲起把9008模式的进入方式、驱动安装、QFIL连接、Flat Build烧录、分区读写一直到system.xml的配置逻辑全部过一遍尽量让第一次接触的朋友也能照着做成功。我会把重点放在两个容易卡住人的地方一是9008模式下电脑无法识别设备的排查二是分区XML文件到底该怎么看、怎么改。这两个地方搞明白了QFIL基本就算入门了。1. 先搞懂QFIL和9008模式到底是怎么回事1.1 QFIL在高通刷机体系里的位置高通的刷机工具看起来有好几个QPST、QFIL、QPM、Fastboot、heimdall之类的很多人一上来就懵。实际上它们的分工是清楚的QPST是一套工具集合QFIL是其中负责与EDL设备通信并执行烧录动作的核心程序。Fastboot走的是Android系统层协议设备得能进bootloader才行而QFIL走的是芯片BootROM级别的协议不需要系统启动也不需要先进入bootloader这是它最厉害的地方。换句话说你把设备搞到完全没系统、黑屏、甚至连recovery都进不去只要硬件没坏9008模式依然能工作QFIL照样能救回来。这也是为什么维修圈子里管它叫底层刷机或者深度刷机。在产线上高通平台的板子出货前那一遍烧录用的就是这套东西。QFIL实际上由两个底层协议支撑先是Sahara协议负责把firehose programmer这个引导程序从电脑传输到设备内存里设备跑起来之后再切换到Firehose协议电脑端通过XML格式的指令告诉设备你要往哪个分区写什么文件。我们后面要讲的system.xml就属于Firehose流程里的配置文件。1.2 9008模式是什么为什么变砖了还能救9008这个数字指的是设备在EDLEmergency Download紧急下载模式下USB口向电脑枚举出来的设备端口号。你在Windows的设备管理器里看到一个叫Qualcomm HS-USB QDLoader 9008的设备就说明机器已经处在EDL模式了。有时候还会看到9006、900E等编号那些是另外的下载模式或者老平台的状态但最通用、最底层的是9008。关键点在于9008模式的代码运行在芯片内部的BootROM里。BootROM是高通在芯片出厂时固化的一段只读代码它不依赖任何外部存储不依赖eMMC或者UFS也不依赖系统固件。所以哪怕你的用户数据分区全被清了、boot分区写坏了、GPT分区表丢了BootROM依然能启动依然能通过USB跟电脑通信。这就是9008能救砖的根本原因。不过也要说清楚9008模式能干活的前提是USB物理链路正常、电脑驱动正常、刷机包里的firehose programmer跟你的平台匹配。如果这三样有问题设备照样会卡在9008里不动或者报错中断。1.3 什么场景下会用到QFIL从我接触的环境看QFIL的使用场景大致分三类。第一类是维修救砖最常见的场景手机刷机刷坏了、OTA升级失败变砖、删除系统应用导致无限重启都可以进9008重刷。第二类是研发调试比如驱动开发阶段需要在空板上烧录初始固件或者需要把某个分区单独读出来分析QFIL的读分区功能比在系统里dd出来要干净得多。第三类是产线量产用QFIL配合脚本批量烧录效率比Fastboot高很多而且对板子状态的要求低。另外很多人会问MTK平台能不能用QFIL不能。MTK有自己的SP Flash Tool走的是另外一套下载协议。高通和MTK的刷机方案差别很大理解QFIL的时候不要拿SP Flash Tool的习惯去套。2. 实操前的准备工具、驱动、刷机包2.1 需要准备的软硬件清单先列一份完整的准备清单开工前对照检查能省掉一半的折腾时间。一台Windows电脑建议Win10 64位或者Win11。XP和Win7也能跑但驱动签名问题会让成功率明显降低。高通QPST工具包里面包含QFIL。QPST版本建议用2.7.xxx以上的太老的版本对Win10兼容性差。高通USB驱动也就是Qualcomm USB Driver或者整合在QPST安装包里的驱动。有些情况下还需要单独装Qualcomm HS-USB QDLoader 9008驱动。对应设备的刷机包里面至少要有firehose programmer通常是prog_emmc_firehose开头的.elf文件或者prog_ufs_firehose开头的文件和XML配置rawprogram、patch、或者我们要讲的system.xml以及各个分区镜像文件。一根质量好的USB数据线最好是原装线或者支持数据传输的短线。很多9008识别不了的故障根源就是线只能充电不能传数据。必要时准备拆机工具、镊子、短接工具或者测试点的图。为什么需要这些下一节会讲。关于刷机包的来源我的建议是优先用官方渠道发布的原厂固件或者你所在公司/平台提供的、明确标注适用于该硬件版本的包。不要随便下载来路不明的打包文件因为QFIL刷机是全盘写入包不对很容易把设备刷成更彻底的砖。2.2 驱动的安装与签名问题的处理驱动是新手最容易卡住的一步。设备进9008之前电脑上可能已经装了ADB驱动、MTP驱动但这些都是普通Android驱动QFIL不认。QFIL需要的是用Qualcomm QDLoader 9008或者Qualcomm Sahara接口的专用驱动。正确安装流程是这样先把设备正常开机或者随便插拔一下确认电脑能识别普通USB设备然后安装QPST安装过程中会自动装上Qualcomm USB驱动的大部分组件再把设备进到9008模式如果设备管理器里出现黄色感叹号的QUSB_DL或者Qualcomm HS-USB QDLoader 9008就右键手动更新驱动把驱动路径指到QPST安装目录下的Drivers文件夹。Win10/11上最麻烦的是驱动签名。高通官网的老驱动没有微软签名64位系统默认不让你装。处理办法有两个一个是在系统设置里进入高级启动选择禁用驱动程序强制签名后再装驱动装完重启即可另一个是安装较新版本的QPST新版本驱动有签名能直接通过。我个人推荐先用新版本QPST实在不行再走禁用签名的路。这里有个判断技巧设备插上后如果设备管理器里出现的是Qualcomm HS-USB QDLoader 9008说明驱动没问题如果出现的是QUSB_BULK之类的未知设备说明驱动没配对需要手动指定如果什么都没有多半是硬件链路问题不是驱动问题。2.3 刷机包目录结构与文件作用拿到一个高通的刷机包解压之后你会看到一推文件命名各有各的规律但核心文件就那几类。以常见的高通eMMC平台刷机包为例里面通常有prog_emmc_firehose_xx_ddr.elf这就是firehose programmer负责在设备内存里跑起来接收电脑端指令。它是最关键的入口文件QFIL里叫Programmer。rawprogram0.xml主分区表配置描述每个分区的起始扇区、大小、对应镜像文件。rawprogram_unsparse0.xml有的包里叫这个名字作用和rawprogram类似是去sparse化的版本一般优先加载这种。patch0.xml用于写GUID分区表、备份GPT、以及处理部分分区属性的补丁文件。gpt_main0.bin、gpt_backup0.bin主分区表和备份分区表的镜像。boot.img、system.img、vendor.img、userdata.img等各个分区的实际镜像内容。还有一些.bin结尾的底层文件比如sbl1、abl、tz、rpm等都是高通平台启动链路的组成部分刷机时会被写到对应分区。需要特别强调rawprogram和patch这两个文件跟刷机包是配套的不能随便拿别的包的XML来用。因为不同的eMMC容量、不同平台的GPT分区布局完全不一样XML里写的start_sector如果跟设备实际布局对不上轻则刷完不开机重则把分区表写坏。后面讲system.xml的时候我会具体展开这些参数到底怎么影响烧录结果。3. 进入9008模式并让QFIL识别设备3.1 三种常用的进9008方法把设备弄进9008模式实际工作中最常用的有三种办法按操作难度从低到高排。第一种是软件命令法。设备还能正常开机或者能进ADB的情况下执行adb reboot edl大部分高通设备就会直接重启进EDL。如果你的bootloader支持也可以adb reboot bootloader之后再用fastboot oem edl之类的命令但这个命令不是所有机型都有。这个方法最省事前提是系统还能响应ADB。第二种是按键组合法。很多手机在关机状态下按住音量上键有的机型是音量上下或者上电源再插USB线就能进入EDL。不过每家的组合都不一样而且部分机型没有做按键进EDL的功能。这个方法适合系统已经进不去的场景但需要你提前知道目标机型的按键组合。第三种是短接法也是维修佬最常用的一招。对于系统彻底崩溃、按键又进不了EDL的设备需要拆机找到主板上的EDL测试点或者下载模式测试点用镊子把两点短接然后插USB线通电后再松开。这个方法对操作精度要求高短接错了地方可能烧东西建议先在维修图纸或者社区里确认测试点位置再动手。不管用哪种方法成功进入的标志都是设备管理器里出现Qualcomm HS-USB QDLoader 9008的端口。这里注意有的设备会先短暂枚举成别的名字比如QUSB_BULK或者Sahara几秒后才变成9008这属于正常现象别急着拔线。3.2 9008模式电脑无法识别的排查思路9008模式电脑无法识别这个问题大概是整个QFIL流程里被问得最多的。我的排查习惯是按从硬到软的层次来顺序很重要别一上来就重装驱动。第一步排除数据线。只充电不传数据的线太常见了尤其是一些第三方快充线。换一根确定能传文件的短USB线直接插电脑后置USB口不要经过hub。这一步能解决大约三成的问题。第二步观察设备管理器。插上设备后按F5刷新设备管理器看看有没有新设备冒出来。如果出现未知设备或者带感叹号的设备说明物理链路OK问题在驱动。如果什么反应都没有检查一下设备是不是真的进了EDL——用电流表看或者摸一下CPU有没有发热有时候按键没按住、短接没到位设备根本没进EDL。第三步尝试换电脑。有些电脑的USB控制器对9008的枚举兼容性很差尤其是带雷电口的新笔记本。换一台老一点的台式机或者Win10笔记本往往插上就能识别。第四步才轮到驱动重装。把原有的Qualcomm驱动彻底卸载重启再重装新版本QPST驱动或者手动指定驱动路径。还有一个我自己实测过很多次的细节9008模式下设备在设备管理器里显示的端口名可能会在Sahara和QDLoader 9008之间来回变这是正常的状态切换。但如果在QFIL里点了Download之后端口突然消失然后变成900E或者直接没了多半是firehose programmer不匹配或者XML配置有问题不是驱动的事。3.3 QFIL连接设备并选择Flat Build驱动搞定、设备稳定枚举成9008之后就可以打开QFIL了。现在的QFIL界面不算复杂左边有一个设备列表选择Select a port能看到当前连接的9008设备。如果列表是空的点一下Select Port右侧的刷新按钮重新扫描。接下来是关键的构建类型选择。QFIL主界面上方通常有Flat Build和Meta Build两个选项。什么是Flat Build简单理解就是把Programmer、rawprogram、patch这些文件以平铺的方式一个个手动指定再用一次烧录流程把它们全部执行。Meta Build则是针对一些需要分发多个镜像版本的场景用一个配置文件来管理多个loader日常维修和开发基本用不上我们只看Flat Build。在Flat Build模式下你需要指定三样东西Select Programmer选prog_emmc_firehose_xxx.elf或者prog_ufs_firehose_xxx.elf这是设备端执行刷写程序的载体。Load XML加载rawprogram0.xml或者rawprogram_unsparse0.xml和patch0.xml。如果你的刷机包只有一个system.xml那就加载它。确认底部的Firmware目录以及Search按钮能找到所有镜像文件QFIL会按XML里的文件名到同一目录下去找镜像。一切就绪后点击DownloadQFIL会先通过Sahara把programmer传给设备然后设备进入Firehose模式开始逐条执行XML里的烧录指令。整个过程在右下角的Log窗口里能看到进度。烧录成功的标志一般是Download Success或者Download Succeed失败则会有对应的错误码。4. system.xml配置详解4.1 XML的整体结构与根节点很多初学QFIL的人拿到刷机包打开system.xml一看满屏的尖括号直接就懵了。其实这个文件的逻辑非常规矩只要把它拆成根节点、设备信息、烧录条目三层来读很快就能看懂。一个典型的system.xml结构大致是这样的?xml version1.0 encodingUTF-8? flashing general device instance idSOMEDEVICEID/ /device /general program SECTYPEEMC filegpt_main0.bin labelgpt start_sector0 num_partition_sectors34 physical_partition_number0 readbackverifyfalse sparsefalse / program SECTYPEEMC fileboot.img labelboot start_sector32768 num_partition_sectors131072 physical_partition_number0 readbackverifyfalse sparsefalse / program SECTYPEEMC filesystem.img labelsystem start_sector163840 num_partition_sectors524288 physical_partition_number0 readbackverifyfalse sparsefalse / /flashing第一行的?xml version1.0 encodingUTF-8?是XML声明指定版本和编码UTF-8保证中文路径不出乱码保持原样就行。根节点是flashing整个文件只有这一个根节点所有内容都包在里面。如果根节点不闭合或者出现多个根节点QFIL解析会直接报错这个后面会讲。general段里放的是设备级别的信息device节点下通常有一个instance id写的是目标设备的某类标识。有些包的general段里还有osImageTrue/osImage之类的配置。这一段的用途主要是让QFIL确认当前连接的设备是不是这个刷机包的目标机型做一层保护。如果你只是拿别人的包学习研究这段一般不用动。真正干活的是从program开始的一条条烧录指令。每一条program节点都代表要往某个分区的某个扇区范围写入某个文件。我见过的绝大多数system.xml几十个program节点把boot、system、vendor、userdata这些分区从头到尾排一遍就是整个系统的烧录清单。4.2 program节点的核心属性逐个讲program节点上的属性很多不同平台不同工具的XML写出来会有细微差别但以下几个核心属性是通用的搞懂它们就搞懂了system.xml的八成。file属性指定要写入该分区的镜像文件名QFIL会在programmer所在目录或者XML同级目录下按这个名字找文件。文件找不到时QFIL会报image not found之类的错误所以改这个属性的时候一定要确认文件名和实际文件完全一致包括大小写。label属性分区的逻辑名称一般跟镜像文件的名字对应比如boot、system、vendor、userdata。这个属性主要给人看的也用于QFIL界面显示分区名。physical_partition_number属性指定写入的是第几个物理存储设备。在高通平台上0一般代表eMMC或者UFS主存储1可能代表SD卡之类的第二存储。刷系统分区时这个值基本永远是0写错了会导致数据写到奇怪的地方去。start_sector和num_partition_sectors属性这两个是最核心的参数。start_sector表示这个分区在存储介质上的起始扇区号num_partition_sectors表示分区占用的扇区总数。扇区大小在标准eMMC上通常是512字节。比如start_sector32768意味着这个分区从第32768个扇区开始也就是从偏移16384KB的位置开始num_partition_sectors131072意味着这个分区占131072个扇区大小是64MB。分区之间必须连续且不重叠如果一个XML里写的start_sector和上一分区结束位置不衔接QFIL在写的时候并不会自动帮你纠正最后写出来就是一个布局错乱的分区表。SECTYPE属性这个属性表示写入方式或者分区类型常见值是EMC表示普通存储写入。有些包里会出现SECTYPEGPT表示这个program节点负责写GPT分区表内容。sparse属性和readbackverify属性sparse表示镜像是否是sparse格式一种安卓系统常用的稀疏镜像格式里面用头部描述了数据的空洞不会把一整块分区镜像都平铺出来。如果镜像本身就是sparse格式但XML写成sparsefalseQFIL会解析失败反过来也一样。readbackverify是写完后是否回读校验改成true会增加刷机时间但能提高数据写入的可信度。我个人的习惯是量产或者给重要设备刷机时把这个属性打开。这里要插一句非常重要的提醒如果你要手动改system.xml里的分区参数请务必先搞清楚目标设备当前的真实分区表。最稳妥的办法是在设备还能开机的时候用cat /proc/partitions、ls -l /dev/block/by-name或者用高通平台的sgdisk --print把当前分区表导出来。拿着真实分区表去改XML而不是凭感觉填数字。4.3 自定义分区烧录时的xml写法有时候我们不是要整包刷入而只想往某一个分区写一个单独固件比如刷个单独的boot.img去做内核试验。这时候不需要改整个system.xml自己手写一个精简的XML就行。最简单的一个定制XML可以这样写?xml version1.0 encodingUTF-8? flashing general device instance id/ /device /general program SECTYPEEMC fileboot.img labelboot start_sector32768 num_partition_sectors65536 physical_partition_number0 readbackverifytrue sparsefalse / /flashing然后把prog_emmc_firehose开头的programmer文件和这个XML、boot.img放在同一个目录下。QFIL里加载这个XML只写boot分区其他分区一概不动。写单个分区的时候最怕的就是start_sector写错因为你只写了boot这一个分区QFIL不会去校验boot分区跟前后分区的位置关系写偏了就直接覆盖了别的分区。所以在做这种定制烧录前我强烈建议先把目标分区原始的信息读出来用下一章讲的QFIL Read功能先备份一下再动手。4.4 patch0.xml的作用跟system.xml经常一起出现的还有patch0.xml很多新手把它忽略掉结果刷出来的设备不开机。patch0.xml的作用是写GUID分区表GPT。现代高通的设备都是GPT分区结构。GPT分区表由主分区表在磁盘头部和备份分区表在磁盘尾部组成。主分区表包含保护性MBR、GPT头、分区表项备份分区表在磁盘末尾。这些内容无法直接用普通的program节点写因为program节点是按固定扇区写镜像而GPT里的分区表项是根据实际分区布局动态生成的。patch节点就是干这个事的它会根据XML里已知的分区信息在设备端动态生成并写入主GPT和备份GPT。所以你可以这样理解如果想要刷机的设备分区表已经存在并且结构没变只写个别分区可以不带patch0.xml但如果是救砖、整包烧录、或者分区表已经损坏那必须同时刷入patch0.xml否则即使镜像写进去了设备也找不到正确的分区无法启动。patch0.xml的内容通常长这样?xml version1.0 encodingUTF-8? patches patch SECTYPEGPT size_in_KB33 physical_partition_number0 partition_num_sectors... / /patches这里的size_in_KB描述的是GPT头加分区表项占用的空间大小不同版本的补丁文件会有差异。实际用的时候patch0.xml和rawprogram/system.xml必须来自同一个刷机包自己拼凑极易出问题。5. 完整分区读写实操5.1 读分区备份关键分区QFIL不只是能写还能读。在高通的维修工作流里刷机之前先读出来备份是一个非常有价值的习惯尤其是对于那些包含设备唯一信息的NV分区和QCN分区。这些分区里存着射频校准数据、IMEI相关数据、蓝牙WiFi地址等一旦丢失轻则信号异常重则设备无法正常使用而且普通刷机包不会帮你恢复这些内容。QFIL里读分区的入口一般在界面的读/回读相关选项里各版本位置略有不同。操作流程是先把设备进9008模式让QFIL正常识别然后在读操作相关界面里输入要读的分区名比如persist或者modemst1再设置好保存路径和文件名点击执行。QFIL会通过programmer向设备发送读指令把指定分区的原始数据读回来存成一个.img文件。这里有几个容易踩的坑。第一个是分区名要跟firehose programmer认识的分区名一致别把label和实际分区名搞混。第二个是读出来的镜像大小是按扇区算的读完之后最好用ls -l看一眼文件大小是否跟分区大小对得上如果文件大小是0或者明显偏小多半是分区名不对或者设备端没执行成功。第三个是读操作尽量在设备稳定枚举为9008后马上做不要插拔很多次避免连接状态不稳定导致读到一半卡死。我自己遇到过一次很典型的教训帮朋友救一台机器前没有提前备份persist分区刷完系统之后指纹和传感器全部失效。因为persist分区在整包刷机时如果被覆盖成空的后续恢复起来非常麻烦。所以现在但凡手里是一台不熟悉的设备我都先花两分钟把persist、modemst1、modemst2、fsg这几个关键分区读出来存好这个习惯帮我省了太多事。5.2 写分区Flat Build全量烧录写分区的完整流程就是前面已经铺垫过的Flat Build。把设备进9008、打开QFIL、选Flat Build、指定Programmer、加载XML然后点Download。整个过程按下拉菜单里的执行按钮后QFIL的日志窗口会按顺序打印出当前在做什么大致是连接Sahara、发送programmer、设备进入Firehose、逐条写分区、最后显示成功。全量烧录这个动作我建议严格遵循以下顺序检查每一步都确认了再往下走确认刷机包与设备型号匹配尤其是硬件版本。同一个型号不同批次可能用不同的eMMC或UFS方案programmer不匹配会直接导致device crashed。确认分区XML来源于当前这个刷机包不要混搭。确认电池电量充足或者直接插着充电器注意有些设备在9008下不充电全靠电池供电这时候如果电量过低写入中途断电就是真正的灾难。关闭电脑上可能干扰USB的其他软件比如各种手机助手、投屏工具它们会抢占USB设备或者弹窗骚扰。点击Download后不要碰数据线不要动设备不要切窗口去干别的直到日志出现成功字样。整包烧录的时间取决于镜像大小和USB速度正常一个几GB的包用USB 2.0大概10到20分钟。如果设备支持USB 3.0速度会快不少。日志里如果出现长时间的停顿不要第一时间拔线先等一两分钟有时候是大镜像的写入阶段表面看着卡实际还在传输。5.3 刷写过程中的常见报错处理QFIL的日志有固定的输出格式看懂日志里的关键信息是解决报错的第一步。我挑几个高频的报错说一下判断思路。ERROR: function: ... failed with error: ... Sahara protocol error这类报错出现在最开始的Sahara阶段通常是programmer不匹配或者设备已经不在9008状态了。排查方法先看设备管理器确认9008还在不在如果还在尝试换一个版本的programmer或者换一个QPST版本。有时候刷机包里的programmer版本太老而设备BootROM太新也会出现Sahara握手对不上。Firehose: Device crashed这个报错后面往往跟着一堆错误码最常见的诱因是XML里的参数超出了设备支持的范围或者programmer跟存储类型不匹配。比如eMMC的设备加载了UFS的programmer或者start_sector写到了存储容量之外。解决办法就是回到XML检查每个program条目的大小和扇区范围确认跟实际存储容量对得上。00和FF交替刷写失败或者Invalid argument这类问题多半是XML语法问题文件编码不对、多了一个根节点、属性值少写了引号都会让解析失败。遇到这种情况用支持XML语法检查的编辑器打开文件看有没有红色波浪线或者错误提示。Readback verify failed说明写入后回读的数据跟预期不一致。原因可能是存储介质有问题也可能是USB链路不稳定导致传输过程中数据损坏。可以先换根线、换个USB口再试一次如果每次都挂在同一个扇区位置就要高度怀疑eMMC的物理坏块了。还有一个很隐蔽的问题有些刷机包里的XML路径写的是相对路径QFIL允许你把XML放在任意位置但镜像文件必须跟XML处在同一个目录或者QFIL能通过Firmware目录设置正确找到。加载XML之后QFIL界面上一般会有一个列表展示所有即将烧录的分区和文件刷之前扫一眼这个列表确认文件都存在能避免大量刷到一半才发现缺文件的情况。6. 常见问题速查表与避坑心得6.1 一张表搞懂高频故障把前面所有内容里涉及的问题整理成一张速查表方便你实际操作时对着排查。现象可能原因优先排查动作插上设备设备管理器无任何反应数据线只充电不传数据、未真正进入EDL、USB口故障换线、换USB口、重新按键/短接进9008设备管理器出现QUSB_BULK/未知设备驱动不匹配或未安装手动指定驱动到QPST的Drivers目录QFIL端口列表扫描不到设备端口未刷新、驱动异常、QPST版本过旧刷新端口、重装驱动、升级QPST点击Download后Sahara报错programmer与平台不匹配、连接状态不稳换programmer、重新插拔并确认9008报Device crashedprogrammer类型错误、XML分区参数越界核对存储类型检查start_sector和扇区数XML加载失败文件编码错误、语法错误、根节点问题用XML校验工具检查文件刷到一半卡住不动大镜像写入中、USB传输不稳定耐心等待必要时短时间观察日志刷完不开机GPT未写入、XML与包不匹配、漏刷了某个关键分区确认是否加载patch0.xml核对分区表刷完指纹/传感器失效persist等相关分区被覆盖且未备份刷回备份的persist或找对应原厂包这张表不是万能的但它覆盖了90%以上的常见问题。实际刷机时遇到新问题第一反应应该是去看日志窗口里最后几行的具体报错内容然后去搜索这个错误码而不是盲目重试。6.2 独家实操心得与建议最后分享几个我这些年反复验证过的心得不一定写在官方文档里但真的很管用。第一个是备份优先。在给任何一台设备做QFIL全量刷机之前先把persist、modemst1、modemst2、fsg、fsc这些跟射频和传感器相关的分区读出来。这些分区一旦被错误覆盖很多设备只能通过售后或者专用工具恢复代价非常大。我个人已经把先备份关键分区做成了固定流程哪怕时间再紧也要做。第二个是保持环境干净。刷机时关掉杀毒软件、手机助手、投屏工具不要在刷机过程中浏览网页或者下载东西。QFIL走的是底层USB协议任何抢占USB的软件都可能导致传输中断而刷机最怕的就是写到一半断线。第三个是学会看日志。QFIL的Log窗口里每一行都是有意义的不要只盯着最后的结果。成功时日志会一行行列出每个分区的写入情况失败时日志会指出具体失败的命令。养成看日志的习惯之后很多问题你自己就能判断出来不用每次都找别人问。第四个是用虚拟机要谨慎。很多人图方便把QFIL装在虚拟机里这很容易出问题。虚拟机对USB设备的直通支持并不总是稳定尤其是在Sahara切换Firehose的瞬间USB设备重新枚举虚拟机经常跟丢设备。如果一定要在虚拟机里用建议用VMware或者VirtualBox的新版本并且直通整个USB控制器而不是单个设备否则就老老实实用物理机。关于9008模式和QFIL能展开的细节还有很多比如firehose programmer的编译参数、GPT与备份GPT的写入顺序、不同平台XML属性的细微差别等等。但先把这篇文章里这些基础打牢你在实际刷机中遇到的大多数问题都能自己找到答案。毕竟这套工具的核心逻辑并不复杂让芯片BootROM里的代码把内存里的programmer跑起来然后让programmer按XML的指示去读写存储仅此而已。搞懂了这条链路剩下的就只是细心和耐心了。