SPD Dump使用指南!

前言

本篇文章是在老文章 玩机常识:SPD Dump的基础使用教程 的基础上修订的。由于上一篇文章分类较为模糊,且比较基础,还因为一些某某某的原因,导致幸存的文章就这一篇了,故在此修订此文章。此次修订增加了大量专业命令,部分有更简单的替代方案,如果不是必须需要,建议使用其替代方案。

  • 包含【危险命令】标签的命令请一定要在确认过后运行。这些命令如果操作不当,会完全损坏设备,brom的权限很大,危险也很大!
  • 包含【进阶命令】标签的命令虽然不会完全损坏设备,但是也请在确认并做好备份的情况下运行。如果操作不当,有概率导致会话卡死,需要重启或扣电池!
  • 包含【基础命令】标签的命令是一些基础的命令,它们会在执行其它命令时自动被调用,其功能较为单一,建议使用替代方案。
  • 无标签的命令是常用命令,建议完全掌握。

说在前面

本教程不提供以下资源下载,请自行寻找:

  • 串口驱动及 libusb 驱动
  • spd_dump 本体
  • fdl 文件

重要提示:不同设备使用的 fdl 不同,切勿混用!刷错 fdl 虽大概率不会变砖(重启重新进入 u2s 即可),但存在极小概率导致芯片死在深刷模式,需拔电池!这是一个玄学问题,务必谨慎验证后再刷入!

什么是u2s端口

SpreadTrum u2s diag,是一个类似于 MTK 的深度刷机端口,高通的 9008 端口,麒麟的 COM1.0 端口的深度刷机端口。u2s 端口一般可以干这些事情:

  • 救砖
  • 刷系统
  • 重新分区
  • 备份系统

如何进入u2s端口

通用进入方法

  1. 关闭紫光设备
  2. 长按音量下键
  3. 3秒后插入电脑
  4. 若驱动安装正确且已打开 Spd Dump,屏幕将显示设备进入 BootROM

成功进入 BootROM 后,你将获得最高权限,可操作任何分区。

推送FDL

BootROM 本身不具备读写功能,需推送两个 FDL 文件:

1. 推送 FDL1(初始化内存空间)

fdl [你的fdl1.bin路径] 0x5500

推送后自动进入 FDL1 模式。

2. 推送 FDL2(初始化分区系统)

fdl [你的fdl2.bin路径] 0x9efffe00

注意:此时不会自动进入 FDL2,仅提示推送成功。

3. 切换到 FDL2 模式

exec

执行后将打印设备分区列表,就像这样:

若使用动态分区安卓系统,systemvendor 等分区不会出现在列表中(它们被打包在 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 [分区名]可以直接获取单个分区的分区大小。当然了,printpartition_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_awrite_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

目前没有什么问题,如果遇到了奇奇怪怪的问题可以直接发条评论,我会在解答后将解决过程放在这里。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇