cfig / Android_boot_image_editor

Parsing and re-packing Android boot.img/vbmeta.img/payload.bin, supporting Android 15
Apache License 2.0
1.04k stars 232 forks source link

添加对合并dtb的支持 #134

Closed dsanke closed 8 months ago

dsanke commented 9 months ago

https://source.android.com/docs/core/architecture/dto/multiple?hl=zh-cn 现在很多机器的dtb是多合一的,工具直接用dtc去反编译只是获得了slot 0的dts 例如 红米 k50 ultra 的 dtb 在 vendor_boot 内 前4字节是 D0 0D FE ED,5-8 字节是 00 07 55 C0(这是第一份dtb的长度) 从0x755C0开始又是下一份dtb dtb.zip 可以增加分割dtb并分别反编译为dts的功能

cfig commented 9 months ago

有完整的vendor_boot.img可以上传一份吗?

cfig commented 9 months ago

功能已提交,有问题及时反馈

dsanke commented 9 months ago

vendor_boot.zip 这是完整的vendor_boot.img

~1.unpack以后,不做改动,直接pack,再unpack,然后对比两次生成的build文件夹,每个dts都不一样,但dtb都一样~

1 2 右侧是第一次unpack的,左侧是第二次unpack的 ~又试了下,把dts文件删掉以后再pack,不执行dts编译到dtb的过程,再去unpack,最终得到的dts就会和原来的dts一模一样~ ~commit 4869c9bbc92ff6b4bcb111c5bd16035cf93efdde 后,不修改任何一个dts,就不会触发dts的重编译,就会两次unpack得到相同的内容~ ~修改任意一个dts,就会触发对所有dts的重编译,这次不仅仅是dts不同,每一个dtb也不同~ 这个不一致的部分,应该是上游的dtc导致的,我是在arch linux软件源装的dtc,待我拉源码编译试试。 ~如果存在对应的dtb,不存在dts,个人认为应该视作正常情况,而不是提示找不到dts无法编译的fetal error~ (commit 4869c9bbc92ff6b4bcb111c5bd16035cf93efdde 后已修正) ~2.dtb.dts及dtb.dts.yaml没有必要生成出来,pack回去的时候也不用它~ (commit 4869c9bbc92ff6b4bcb111c5bd16035cf93efdde 后已修正)

3.删掉dtb文件,留下数个dtb.以后,再pack回去就不含dtb了,个人感觉检测dtb.是否存在更合理 (程序是先检测dtb能分割多少份,再把对应的dtb.*合并起来吧,这样处理的话确实需要原来的dtb存在)

4.建议个位数编号前补0,这样更好区分每组文件

~刚看到有commit,我再补测一下~ 测好了,应该没问题

cfig commented 9 months ago

重新提交了,修复了一个小问题,现在应该差不多了。

dsanke commented 9 months ago

我又检查了下,上游的dtc 1.6.1和1.7.0会造成问题,反编译的时候把hex转了字符串,编译的时候没能正确处理 1.6.0版本没有问题,反编译出来就是hex 1 在我的arch linux上,需要执行 pacman -U https://archive.archlinux.org/packages/d/dtc/dtc-1.6.0-3-x86_64.pkg.tar.zst 来降级dtc到1.6.0版本 然后编辑/etc/pacman.conf,添加 IgnorePkg = dtc 来忽略dtc的升级

cfig commented 8 months ago

感谢支持~