前言
本篇文章是在老文章 玩机常识:SPD Dump的基础使用教程 的基础上修订的。由于上一篇文章分类较为模糊,且比较基础,还因为一些某某某的原因,导致幸存的文章就这一篇了,故在此修订此文章。此次修订增加了大量专业命令,部分有更简单的替代方案,如果不是必须需要,建议使用其替代方案。
| 命令标签 | 危险程度 |
|---|---|
| 【危险命令】 | 请一定要在确认过后运行。这些命令如果操作不当,会完全损坏设备,brom的权限很大,危险也很大! |
| 【进阶命令】 | 虽然不会完全损坏设备,但如果操作不当,可能会导致会话卡死,需要重启或扣电池! |
| 【基础命令】 | 一些基础的命令,它们会在执行其它命令时自动被调用,其功能较为单一。除非需要针对性的获取,否则建议使用替代方案。 |
| 无标签 | 无标签的命令是常用命令,建议完全掌握。 |
本教程不提供以下资源下载,请自行寻找:
- 串口驱动及 libusb 驱动
- spd_dump 本体
- fdl 文件
重要提示:不同设备使用的 fdl 不同,切勿混用!并且不同SOC的fdl地址可能是不一样的(这篇文章是UD710的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
执行后将打印设备分区列表并输出到本地分区表XML文件,就像这样:

若使用动态分区安卓系统,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也会输出分区大小。如果要针对性的获取单一分区大小可以使用此命令。
【基础命令】Check_part命令
check_part命令可以检测指定分区是否存在,使用check_part [分区名]即可获取检测结果。
【进阶命令】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]均指该文件。
点击展示分区表XML的示例
<Partitions>
<Partition id="miscdata" size="5"/>
<Partition id="misc" size="1"/>
<Partition id="nr_fixnv1" size="8"/>
<Partition id="nr_fixnv2" size="8"/>
<Partition id="prodnv" size="10"/>
<Partition id="nr_runtimenv1" size="10"/>
<Partition id="nr_runtimenv2" size="10"/>
<Partition id="recovery" size="40"/>
<Partition id="trustos" size="6"/>
<Partition id="trustos_bak" size="6"/>
<Partition id="sml" size="1"/>
<Partition id="sml_bak" size="1"/>
<Partition id="uboot" size="1"/>
<Partition id="uboot_bak" size="1"/>
<Partition id="uboot_log" size="4"/>
<Partition id="logo" size="7"/>
<Partition id="fbootlogo" size="7"/>
<Partition id="lowbatterylogo" size="7"/>
<Partition id="l_pmsys" size="1"/>
<Partition id="l_agdsp" size="6"/>
<Partition id="gnssmodem" size="1"/>
<Partition id="wcnmodem" size="10"/>
<Partition id="persist" size="2"/>
<Partition id="nr_spl" size="1"/>
<Partition id="nr_sml" size="1"/>
<Partition id="nr_uboot" size="1"/>
<Partition id="nr_boot" size="35"/>
<Partition id="nr_pmsys" size="1"/>
<Partition id="nr_agdsp" size="6"/>
<Partition id="nr_modem" size="40"/>
<Partition id="nr_v3phy" size="8"/>
<Partition id="nr_nrphy" size="8"/>
<Partition id="nr_nrdsp1" size="5"/>
<Partition id="nr_nrdsp2" size="5"/>
<Partition id="nr_deltanv" size="2"/>
<Partition id="boot" size="35"/>
<Partition id="dtb" size="8"/>
<Partition id="dtbo" size="8"/>
<Partition id="system" size="3072"/>
<Partition id="cache" size="3072"/>
<Partition id="vendor" size="550"/>
<Partition id="product" size="100"/>
<Partition id="vbmeta" size="1"/>
<Partition id="vbmeta_bak" size="1"/>
<Partition id="sysdumpdb" size="10"/>
<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并一次性进行全分区还原。
除此之外,这个命令在支持A/B分区的设备上有两个变种。它们分别是 write_parts_a 和 write_parts_b 。这两个命令的使用格式和上方的命令完全相同,但是spd dump会选择性的刷入对应槽位的备份。使用_a时,所有分区将会被刷入到a槽位,_b同理。如果文件夹下同时包含a b两个槽位的备份,则非指定槽位的备份不会被刷入。且一些不分槽位的底层分区始终会被刷入。
【危险命令】Repartition命令
repartition命令可以根据你提供的[分区表XML]重新分区,通常用于我们手动调整分区大小,也可以在特殊情况下还原你的分区表,使用方法为repartition [分区表XML],这里我们就讲一下如何调整system分区的大小
首先更改 <Partition id=”system” size=”3072″/> 这里的size数值为我们想要的,注意,这个size是以MB为单位来的,要注意换算哦!保存后在spd dump输入repartition [分区表XML],重要的来了,如果[分区表XML]中你调整大小的分区后面还有其他分区,那么后面的分区你需要全部重新刷一遍(userdata这样的不用),也就是说你要注意你调整大小的分区后面有没有偏底层的分区!小心不要玩脱了呦~
擦除类命令
【危险命令】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吧。
其它命令
Path命令
path命令,通过使用path [路径]的方式设置保存文件路径。提取的分区、分区表和内存的dump都会保存到设定的路径,在批量备份时十分有用。
Verity命令
在Android10-,该命令不可用。无论是否解锁BL,设备AVB仍然会校验boot, uboot, trustos等分区,若要刷入必须使用紫光公钥签名。但在Android10+,在解锁BL的情况下,可以在深刷模式下使用verity [1|0]设置启用/关闭对这些分区的校验。设置为1则开启,设置为2则关闭。
一些问题的FAQ
目前没有什么问题,如果遇到了奇奇怪怪的问题可以直接发条评论,我会在解答后将解决过程放在这里。
发表回复