翻出抽屉里的旧手机,想 root 后装个模块。boot.img 解包报 magic 不对,换了工具解出来,Magisk 打补丁再刷回去,开机卡在 logo。
boot.img 里装了什么
它是 Android 的启动镜像,包含头部、内核、ramdisk、second stage 和设备树。Android 10 之后头部升级到 v3、v4,支持动态分区;部分机型把 vendor 相关内容拆到 vendor_boot.img。头部里记着页大小、内核偏移、ramdisk 大小,解包工具读错一个字段就会失败。
解包和打包用什么
AOSP 自带 mkbootimg 和 unpack_bootimg,Python 环境也能跑;Magisk 的 magiskboot unpack 更省事,能自动识别版本。老设备页大小 2048,新设备常见 4096,打包时不指定就会刷完不开机。解出来的 ramdisk 多是 gzip 或 lz4 压缩,先看文件头再解。
Magisk 补丁改了哪里
它把 ramdisk 里的 init 替换成 magiskinit,塞进 magisk32 和 magisk64,再改 fstab 去掉 verity 和 forceencrypt。补丁过程会重新算头部校验和,所以不能用普通压缩工具改 ramdisk。打完补丁的文件名通常是 magisk_patched 开头。
刷写和 AVB 校验
fastboot flash boot boot.img,A/B 机型要写 boot_a 或 boot_b,先 fastboot getvar current-slot 确认。改了 boot 就要处理 vbmeta,否则校验不过直接不进系统,通常刷入关闭校验的 vbmeta 并带上 disable-verity 参数。
开不了机怎么救
镜像必须和当前固件同版本,跨版本刷是最常见的原因。提前用 fastboot boot 临时启动测试,别直接 flash。救砖就找原厂固件的 boot.img 和 vbmeta.img 刷回,或者进 recovery 恢复。动手前把原机两个分区都备份出来,存到电脑上,别只放手机里。
root 的难点不在工具,在版本对得上。备份原镜像这一步,能省掉半天折腾。