前言
本篇文章是在老文章 玩机常识:SPD Dump的基础使用教程 的基础上修订的。由于上一篇文章分类较为模糊,且比较基础,还因为一些某某某的原因,导致幸存的文章就这一篇了,故在此修订此文章。此次修订增加了大量专业命令,部分有更简单的替代方案,如果不是必须需要,建议使用其替代方案。
- 包含【危险命令】标签的命令请一定要在确认过后运行。这些命令如果操作不当,会完全损坏设备,brom的权限很大,危险也很大!
- 包含【进阶命令】标签的命令虽然不会完全损坏设备,但是也请在确认并做好备份的情况下运行。如果操作不当,有概率导致会话卡死,需要重启或扣电池!
- 包含【基础命令】标签的命令是一些基础的命令,它们会在执行其它命令时自动被调用,其功能较为单一,建议使用替代方案。
- 无标签的命令是常用命令,建议完全掌握。
说在前面
本教程不提供以下资源下载,请自行寻找:
- 串口驱动及 libusb 驱动
- spd_dump 本体
- fdl 文件
重要提示:不同设备使用的 fdl 不同,切勿混用!刷错 fdl 虽大概率不会变砖(重启重新进入 u2s 即可),但存在极小概率导致芯片死在深刷模式,需拔电池!这是一个玄学问题,务必谨慎验证后再刷入!
什么是u2s端口
SpreadTrum u2s diag,是一个类似于 MTK 的深度刷机端口,高通的 9008 端口,麒麟的 COM1.0 端口的深度刷机端口。u2s 端口一般可以干这些事情:
- 救砖
- 刷系统
- 重新分区
- 备份系统
如何进入u2s端口
通用进入方法
- 关闭紫光设备
- 长按音量下键
- 3秒后插入电脑
- 若驱动安装正确且已打开 Spd Dump,屏幕将显示设备进入 BootROM

成功进入 BootROM 后,你将获得最高权限,可操作任何分区。
推送FDL
BootROM 本身不具备读写功能,需推送两个 FDL 文件:
1. 推送 FDL1(初始化内存空间)
fdl [你的fdl1.bin路径] 0x5500
推送后自动进入 FDL1 模式。
2. 推送 FDL2(初始化分区系统)
fdl [你的fdl2.bin路径] 0x9efffe00
注意:此时不会自动进入 FDL2,仅提示推送成功。
3. 切换到 FDL2 模式
exec
执行后将打印设备分区列表,就像这样:

若使用动态分区安卓系统,system、vendor 等分区不会出现在列表中(它们被打包在 super 分区内)。
此时,我们就进入了FDL2模式。这个步骤在每次重新进入u2s后都需要重新进行,如果不想每次都这么麻烦,你可以创建一个bat批处理文件,然后在复制以下命令:
spd_dump --wait 300 fdl [替换为fdl1.bin的路径] fdl1_addr fdl [替换为fdl2.bin的路径] fdl2_addr exec
然后每次需要刷机时打开这个批处理文件,即可自动推送两个FDL!
读取信息类命令
print命令
print命令,简写为p命令,可以重新读取分区表和设备信息并输出。输出的格式与刚进入FDL2时相同,如果忘记了分区表或者单纯懒得翻可以使用。
【基础命令】partition_list命令
partition_list命令是print命令的一部分。执行此命令后只会输出分区表。建议使用print命令作为代替
【基础命令】size_part命令
size_part命令,亦可写作part_size命令,使用size_part [分区名]可以直接获取单个分区的分区大小。当然了,print或partition_list也会输出分区大小。如果要针对性的获取单一分区大小可以使用此命令。
【进阶命令】chip_uid命令
chip_uid命令可以直接读取芯片唯一标识。chip_uid与设备序列号不同,无论如何刷机都无法修改此标识。可以用来鉴别不同设备,但一般不会这么做,序列号已经够用了。
读分区类命令
Read_part命令
read_part命令,可以简写为r命令,使用read_part/r [分区名称],可以实现对指定分区的提取操作。比如说,如果要提取boot分区,我们可以使用r boot。输入这条命令后,spd dump会自动提取镜像,等待进度条跑满后,你就可以在与spd dump同级的目录下找到刚刚提取的boot.bin。如果要备份全部分区,可以使用下方所述的特殊参数命令。
与MTK刷机工具差不多,SPD Dump提取的.bin文件其实就是安卓raw镜像,直接将后缀改为.img即可正常导入各大软件。注意这个.bin并不是payload.bin!不要尝试使用payload.bin解包工具,除非…你想看到满屏红字和错误消息。
以下为一个示例:
FDL2> r boot
[ ]0.0%
[= ]2.5%
[== ]5.0%
[=== ]7.5%
[==== ]10.0%
[===== ]12.5%
[====== ]15.0%
[======= ]17.5%
[======== ]20.0%
[========= ]22.5%
[========== ]25.0%
[=========== ]27.5%
[============ ]30.0%
[============= ]32.5%
[============== ]35.0%
[=============== ]37.5%
[================ ]40.0%
[================= ]42.5%
[================== ]45.0%
[=================== ]47.5%
[==================== ]50.0%
[===================== ]52.5%
[====================== ]55.0%
[======================= ]57.5%
[======================== ]60.0%
[========================= ]62.5%
[========================== ]65.0%
[=========================== ]67.5%
[============================ ]70.0%
[============================= ]72.5%
[============================== ]75.0%
[=============================== ]77.5%
[================================ ]80.0%
[================================= ]82.5%
[================================== ]85.0%
[=================================== ]87.5%
[==================================== ]90.0%
[===================================== ]92.5%
[====================================== ]95.0%
[======================================= ]97.5%
[========================================]100.0%
Write Part Done: system+0x0 , target: 0x114514, read: 0x114514
与write_part不同的是,如果设备在读取过程中断开,提取到一半的镜像会直接损坏。切记不要直接使用,会导致刷入后设备变砖(这是常识吧)!再重新运行一遍提取分区命令,spd dump会自动覆盖它。
此外,在执行此命令时,可以不指定分区,使用一些特殊的参数,工具会自动按照预定义的分区集提取对应分区。
特殊参数:all参数
传入all参数时,Spd Dump会自动备份除userdata以外的所有分区,并全部保存到当前目录下。除了提取分区,Spd Dump还会自动提取分区表XML文件并保存到当前目录下。XML文件将以partition_[时间戳].xml的形式存在,下文所有提及的[分区表XML]均指该文件。如果你还把分区表搞没了,可以结合repartition命令还原分区表。
点击展示分区表XML的示例
<Partitions>
<Partition id="prodnv" size="10"/>
<Partition id="miscdata" size="1"/>
<Partition id="misc" size="1"/>
<Partition id="trustos_a" size="6"/>
<Partition id="trustos_b" size="6"/>
<Partition id="sml_a" size="1"/>
<Partition id="sml_b" size="1"/>
<Partition id="uboot_a" size="1"/>
<Partition id="uboot_b" size="1"/>
<Partition id="uboot_log" size="4"/>
<Partition id="logo" size="8"/>
<Partition id="fbootlogo" size="8"/>
<Partition id="l_fixnv1_a" size="2"/>
<Partition id="l_fixnv2_a" size="2"/>
<Partition id="l_fixnv1_b" size="2"/>
<Partition id="l_fixnv2_b" size="2"/>
<Partition id="l_runtimenv1" size="2"/>
<Partition id="l_runtimenv2" size="2"/>
<Partition id="gnssmodem_a" size="1"/>
<Partition id="gnssmodem_b" size="1"/>
<Partition id="wcnmodem_a" size="10"/>
<Partition id="wcnmodem_b" size="10"/>
<Partition id="persist" size="2"/>
<Partition id="l_modem_a" size="25"/>
<Partition id="l_modem_b" size="25"/>
<Partition id="l_deltanv_a" size="1"/>
<Partition id="l_deltanv_b" size="1"/>
<Partition id="l_gdsp_a" size="10"/>
<Partition id="l_gdsp_b" size="10"/>
<Partition id="l_ldsp_a" size="20"/>
<Partition id="l_ldsp_b" size="20"/>
<Partition id="l_agdsp_a" size="6"/>
<Partition id="l_agdsp_b" size="6"/>
<Partition id="l_cdsp_a" size="1"/>
<Partition id="l_cdsp_b" size="1"/>
<Partition id="pm_sys_a" size="1"/>
<Partition id="pm_sys_b" size="1"/>
<Partition id="teecfg_a" size="1"/>
<Partition id="teecfg_b" size="1"/>
<Partition id="hypervsior_a" size="10"/>
<Partition id="hypervsior_b" size="10"/>
<Partition id="boot_a" size="64"/>
<Partition id="boot_b" size="64"/>
<Partition id="vendor_boot_a" size="100"/>
<Partition id="vendor_boot_b" size="100"/>
<Partition id="dtb_a" size="8"/>
<Partition id="dtb_b" size="8"/>
<Partition id="dtbo_a" size="8"/>
<Partition id="dtbo_b" size="8"/>
<Partition id="super" size="5500"/>
<Partition id="cache" size="100"/>
<Partition id="socko_a" size="75"/>
<Partition id="socko_b" size="75"/>
<Partition id="odmko_a" size="25"/>
<Partition id="odmko_b" size="25"/>
<Partition id="vbmeta_a" size="1"/>
<Partition id="vbmeta_b" size="1"/>
<Partition id="metadata" size="16"/>
<Partition id="sysdumpdb" size="10"/>
<Partition id="vbmeta_system_a" size="1"/>
<Partition id="vbmeta_system_b" size="1"/>
<Partition id="vbmeta_vendor_a" size="1"/>
<Partition id="vbmeta_vendor_b" size="1"/>
<Partition id="vbmeta_system_ext_a" size="1"/>
<Partition id="vbmeta_system_ext_b" size="1"/>
<Partition id="vbmeta_product_a" size="1"/>
<Partition id="vbmeta_product_b" size="1"/>
<Partition id="vbmeta_odm_a" size="1"/>
<Partition id="vbmeta_odm_b" size="1"/>
<Partition id="avbmeta_rs_a" size="1"/>
<Partition id="avbmeta_rs_b" size="1"/>
<Partition id="common_rs1_a" size="8"/>
<Partition id="common_rs1_b" size="8"/>
<Partition id="common_rs2_a" size="16"/>
<Partition id="common_rs2_b" size="16"/>
<Partition id="userdata" size="0xffffffff"/>
</Partitions>
特殊参数:all_lite参数
传入all_lite参数时,Spd Dump会在all的基础上筛选掉非活动分区,blackbox分区,cache分区和userdata分区。与all同样,这条命令保存分区时也会保存分区表,命名格式和位置同上。
特殊参数:preset_modem参数
此参数专门用来备份基带相关分区。每个设备的基带都是唯一的,它存储着你的设备的各种唯一ID。若此类分区丢失,电话,移动数据,Wifi,蓝牙等功能均会受到影响。所以,这一般是那些傻逼格机脚本的主要目标,一旦被破坏就无法恢复。
特殊参数:preset_resign参数
此参数专门提取需要额外签名的分区。即在“解BL”后仍然会被avb验证的分区,这些分区一般包含:
- boot
- recovery
- uboot
- splloader
- sml
- trustos
- teecfg
【进阶命令】一个小拓展:使用read_part时,不仅可以只指定分区名,还可以以read_part [分区名] [偏移量] [大小]的方式读取分区的一部分。不过这个功能一般也不会用到,毕竟除了底层分区这类很小的分区,你也猜不到你读取的这部分数据里有什么。
【进阶命令】Read_parts命令
注意!这部分讲述的是 read_parts 命令,而不是 read_part 命令。如果你正在找提取单个分区的命令,请前往上方查看。
在read_parts命令后需要跟上一个分区表XML,即read_parts [分区表XML],工具会按照传入的分区表读取指定的所有分区。除此之外,还会根据其中分区的大小读取对应大小的分区数据。
写分区类命令
Write_part命令
write_part命令,可以简写为w命令,使用write_part [分区名称] [镜像路径],可以实现对指定分区的刷写操作。比如说,如果要刷入system.img到system分区,我们可以使用w system system.img。输入这条命令后,spd dump会自动发送镜像到对应分区,等待进度条跑满后即为成功刷入。以下为一个示例:
FDL2> w system system.img
[ ]0.0%
[= ]2.5%
[== ]5.0%
[=== ]7.5%
[==== ]10.0%
[===== ]12.5%
[====== ]15.0%
[======= ]17.5%
[======== ]20.0%
[========= ]22.5%
[========== ]25.0%
[=========== ]27.5%
[============ ]30.0%
[============= ]32.5%
[============== ]35.0%
[=============== ]37.5%
[================ ]40.0%
[================= ]42.5%
[================== ]45.0%
[=================== ]47.5%
[==================== ]50.0%
[===================== ]52.5%
[====================== ]55.0%
[======================= ]57.5%
[======================== ]60.0%
[========================= ]62.5%
[========================== ]65.0%
[=========================== ]67.5%
[============================ ]70.0%
[============================= ]72.5%
[============================== ]75.0%
[=============================== ]77.5%
[================================ ]80.0%
[================================= ]82.5%
[================================== ]85.0%
[=================================== ]87.5%
[==================================== ]90.0%
[===================================== ]92.5%
[====================================== ]95.0%
[======================================= ]97.5%
[========================================]100.0%
Write Part Done: system+0x0 , target: 0x114514, write: 0x114514.
当然了,如果你在刷入系统的时候不小心拔掉了数据线,或者电脑抽风断开连接了,也不用担心,未完成写入的分区更改不会被应用,你的分区还是原来的分区,此时只需要开机,关机,重新进入u2s刷写即可。当然,我不建议这么放松,万一砖了呢?对吧
【进阶命令】Write_parts命令
注意!这部分写的是 write_parts 命令,而不是 write_part 命令。如果你要查找的是写入单个分区的命令,请阅读上方内容。
此命令可以通过 write_parts [备份目录] 来读取其中的分区表XML并一次性进行全分区还原。所以,可以通过直接修改分区表XML来实现分区大小调整。方法为在”Partition”中,将对应id的分区后的size修改为需要调整的大小,以MB计数。
修改分区大小示例
修改前:<Partition id="system" size="3000"/>
修改后:<Partition id="system" size="5000">
在这个示例中,我们通过修改system的size实现将system扩容到5GB。
除此之外,这个命令在支持A/B分区的设备上有两个变种。它们分别是 write_parts_a 和 write_parts_b 。这两个命令的使用格式和上方的命令完全相同,但是Spd Dump会选择性的刷入对应槽位的备份。使用_a时,所有分区将会被刷入到a槽位,_b同理。如果文件夹下同时包含a b两个槽位的备份,则非指定槽位的备份不会被刷入。且一些不分槽位的底层分区始终会被刷入。
擦除类命令
【危险命令】Erase_part命令
erase_part命令,可以简写为e命令,可以擦除设备分区表中的指定分区。比如,如果我要擦除设备上的system分区(system频频受灾),那么我可以使用e system。
【危险命令】Erase_all命令
注意!接下来的这条命令是一个携带特殊参数的erase命令,会将所有分区全部擦除,包括你的分区表,是比格机脚本还要底层的命令。
请一定要注意,整个设备的最高权限现在掌握在你手中,多一分权力多一分危险!
做这件事之前务必三思,否则你的设备轻则卡开机(这么干了基本不会轻),重则直接不开机!
类似于r all命令,我们也可以直接擦除全部分区。擦除全部分区的指令是erase_all,但是像上面说的那样,除非你想要完全重新烧录,否则万万不要这么干!
注:关于双清(wipe data/factory reset)
老版本的Spd Dump不能使用e userdata来进行低级格式化。如果这么做,会导致你的设备卡开机第二屏。请使用w misc misc_wipe.bin,misc_wipe.bin位于你下载的Spd Dump文件夹下,在重启或退出深刷的第一次启动时recovery会自动进行双清。
在新版本Spd Dump中,使用e userdata时程序会自动执行w misc misc_wipe.bin代替传统erase命令,所以不会有问题。
A/B分区特殊命令
Slot命令
slot命令是A/B分区的设备独有的命令,执行后会输出当前使用的槽位。
Set_active命令
set_active命令可以设置当前使用的槽位,使用方法为set_active [a|b]。设置槽位后,所有未指定槽位的双槽位分区镜像都会默认写入到对应槽位。
重启类命令
Reset命令
reset 可以直接让设备重启回安卓系统,刷机完成后可以使用这条命令来快速退出u2s端口。
Poweroff命令
poweroff命令可以直接让设备关机,刷机完成但不想要直接重启或设备变砖反复重启时可以进入FDL2输入这条命令强制关机。
reboot-recovery和reboot-fastboot
reboot-recovery命令可以直接重启到recovery手动双清(如果你misc-wipe没了的话);reboot-fastboot命令可以直接重启到fastboot。但注意,对于动态分区的需要使用fastbootd的机型,重启到fastboot并没有什么用。不仅刷不了super分区内的子分区而且还慢,老老实实重启到安卓系统再用ADB命令重启到fastbootd吧。
一些问题的FAQ
目前没有什么问题,如果遇到了奇奇怪怪的问题可以直接发条评论,我会在解答后将解决过程放在这里。