设备需在同一局域网内,已开启 ADB 并具备 root 权限,可正常执行 adb 操作。
确认设备 DTB 标识
先通过设备节点查看 DTB 标识:
cat /proc/device-tree/amlogic-dt-id

该命令可看到 dtb 的文件名,我的设备是 gxlx_p261_1g。不过,通过该命令获取的文件名有时可能并不完全准确,最好结合设备的具体型号和固件版本查找相关资料,确认 DTB 文件的真实名称。
提取 reserved 分区
在使用 dd 命令提取 /dev/block/reserved 分区之前,最好先备份整个分区,以便提取过程中出现问题时恢复原始状态:
dd if=/dev/block/reserved of=/mnt/sdcard/reserved.img随后把 /dev/block/reserved 分区打包到安卓的 sdcard 目录:
dd if=/dev/block/reserved | gzip > /mnt/sdcard/reserved
该命令把 /dev/block/reserved 分区打包到安卓的 sdcard 目录,然后复制到电脑 C 盘根目录:
adb pull /mnt/sdcard/reserved.gz C:\\从 dt.img 中定位 DTB
用 7z 打开 reserved.gz 文件,然后再打开其中的 reserved,可以看到 dt.img。

解压出最终的 dt.img 文件,然后用 WinHex 打开。原文附有 WinHex 安装包:📦 winhex-214-sr0-single.zip (3MB)。
在 WinHex 中搜索与选择数据块
在 WinHex 中搜索 gxlx_p261_1g。


搜索结果如下:

这部分有数据的内容就是安卓设备的 dtb 文件。向上找到第一个有效数据的块:

右键选择起始位置:

然后滑块向下拉,连续数据没有了,选择尾块:

最终效果是被选块高亮:

在被选的块上,依次右键、编辑、复制所选块、至新文件,然后命名为 mydtb.dtb,即可获得 dtb 文件。
在 WinHex 中选择数据块时,需要确保起始位置和结束位置正确。可以观察数据块的特征,例如是否有特定的头信息或尾信息,来判断选择是否正确。另外,WinHex 软件版本可能会影响操作界面和功能,应确保所用版本与教程一致。
反编译 dtb 文件
sudo apt-get update
sudo apt-get install -y device-tree-compiler
# 1. 反编译命令(使用 dtb 文件生成 dts 源码)
dtc -I dtb -O dts -o xxx.dts xxx.dtb
# 2. 编译命令(使用 dts 编译生成 dtb 文件)
dtc -I dts -O dtb -o xxx.dtb xxx.dts提取出 mydtb.dtb 后,可以校验其完整性。一个简单的方法是检查文件大小是否合理,或者使用下面的命令尝试反编译;如果反编译过程中没有报错,说明文件基本完整:
dtc -I dtb -O dts -o /dev/null mydtb.dtb反编译和编译 DTB 文件时,需要确保安装了正确版本的 device-tree-compiler。不同版本的编译器可能会导致编译结果不一致。修改 DTS 源码后,再编译成 DTB 文件时,需要仔细检查编译过程中是否有错误或警告信息。
补充注意事项
分区差异:不同设备的
reserved分区可能存储不同内容。有些设备可能将 DTB 文件直接存储在单独的分区中,例如dtb分区。因此,提取 DTB 文件时需要根据设备的实际情况判断。备份与恢复:提取
/dev/block/reserved前先备份整个分区,可避免提取过程出现问题时无法恢复原始状态。校验文件:提取出
mydtb.dtb后,可通过文件大小和dtc反编译结果判断文件是否基本完整。
小结
提取安卓 DTB 文件的大致流程是:先确认设备 DTB 标识,备份并打包 reserved 分区,再将文件拉取到电脑,用 7z 解出 dt.img,在 WinHex 中搜索设备标识并截取有效数据块,最后保存为 mydtb.dtb 并用 dtc 校验或反编译。操作前应备份原始分区,选择数据块时确认起止位置,并根据设备实际情况判断 DTB 所在分区。
一起交流
分享你的思考,让讨论更进一步。