如何制作一个完整的刷机zip包?,刷机zip包制作完整教程
制作刷机zip包的核心流程就是把固件文件按标准结构打包,写一个updater-script脚本控制刷入动作,最后压缩并签名。这个流程本身不复杂,但细节决定成败,尤其是脚本语法和文件权限,稍有不慎就会导致设备变砖。
制作刷机zip包需要哪些工具?
做刷机包不需要多高端的设备,一台普通电脑加几个免费工具就够了,核心工具链分为四类:文件提取工具、脚本编辑器、压缩打包工具、签名工具,其中压缩工具和编辑器选择很多,但打包方式必须严格遵循Recovery的识别规则。
刷机包制作工具哪个好用?
根据个人使用经验,不同工具在不同环节各有优势:
| 工具类型 | 推荐选择 | 适用场景 | 备注 |
|---|---|---|---|
| 文件提取 | 7-Zip、RAR | 解包官方固件、提取system镜像 | 7-Zip对Linux文件权限保留更好 |
| 脚本编辑 | Notepad++、VS Code | 修改updater-script、update-binary | 务必开启UTF-8无BOM编码 |
| 压缩打包 | 7-Zip自带的命令行 | 最终生成zip包 | 压缩方式选“存储”或“仅存储” |
| 签名工具 | zipsigner、signapk.jar | 给zip包签名 | 不签名在部分Recovery会直接报错 |
7-Zip是打包环节最稳妥的选择,因为它能完整保留文件属性,不会像某些国产压缩软件那样偷偷改写文件时间戳,脚本编辑器方面,VS Code的语法高亮能帮你提前发现漏掉的分号,但电脑配置差的用Notepad++也完全够用。
电脑端环境配置
正式开工前,建议先装好Android SDK Platform Tools,里面包含adb和fastboot命令,下载后把platform-tools目录加入系统环境变量PATH,这样后续解包、推送文件会方便很多,如果是Windows系统,还需要确保关闭文件资源管理器的“隐藏已知文件类型的扩展名”选项,否则你改完脚本文件名可能还是.txt。
自制刷机包教程:从零搭建目录结构
一个标准刷机zip包的内部结构长这样:
刷机包.zip
├── META-INF/
│ └── com/google/android/
│ ├── updater-script # 刷入控制脚本
│ ├── update-binary # 可执行程序(特殊ROM有)
│ └── otacert # 签名证书(部分Recovery需要)
├── system/
│ ├── app/
│ ├── framework/
│ ├── etc/
│ └── build.prop
├── vendor/ # 部分机型有
├── boot.img # 内核镜像
└── radio/ # 基带相关(极少见)
META-INF/com/google/android/updater-script是整个包的灵魂,Recovery启动时会逐行执行这个脚本,从挂载分区、复制文件到设置权限,全靠它来指挥,至于system目录,就是你要刷入的系统文件,通常从官方固件里提取。
提取并整理固件文件
最靠谱的提取方式是直接下载对应机型的官方线刷包或卡刷包,用7-Zip解压后,你会得到一个system.img或payload.bin,其中payload.bin是Android 10之后新设备的常见格式,需要借助payload-dumper工具转换。
具体操作步骤:
- 下载官方固件压缩包,解压找到system.img。
- 用7-Zip打开system.img,直接解压到本地文件夹。
- 解压后检查目录权限,确保bin目录下的文件有可执行权限。
- 如果解压出的文件带有ext4稀疏镜像属性,需要先运行
simg2img system.img system_raw.img转换。
这个环节最容易踩的坑是符号链接丢失,Windows环境下解压Linux文件系统,symlink会变成0字节普通文件,刷进去之后系统会崩溃,解决方法是用WSL或Linux虚拟机来解压,或者在打包时手动补上所有软链接。
编写updater-script脚本
脚本语法是Edify语言,每行以分号结尾,核心命令只有几个,但必须按正确顺序写,一个最简单的完整脚本示例:
ui_print("正在安装系统文件...");
run_program("/sbin/mount", "-o", "rw", "/system");
package_extract_dir("system", "/system");
set_perm_recursive(0, 0, 0755, 0644, "/system");
run_program("/sbin/umount", "/system");
关键命令解析:
ui_print:在Recovery界面显示文本,用来反馈安装进度。package_extract_dir:把zip包内指定目录解压到目标分区。set_perm_recursive:递归设置文件权限,第一个数字是用户ID,第二个是组ID,后两个是目录和文件权限。run_program:执行任意可执行文件,比如挂载或卸载分区。
绝大多数刷入失败都出在权限设置上,如果system/bin下的su文件没有0755权限,Magisk和SuperSU都会失效,建议在脚本里对关键文件单独设置权限,不要只依赖递归设置。
安卓12刷机包制作需要留意的分区变化
Android 12及后续版本引入了动态分区机制,system、vendor、product等分区不再有独立的物理分区,而是合并到super分区,这意味着传统的挂载命令需要调整。
行业共识认为,动态分区设备的刷机脚本应该使用update-binary配合/system/bin/updater来操作分区,而不是直接调用mount,具体表现是:
package_extract_file("system.img", "/tmp/system.img");
run_program("/sbin/mount", "-o", "rw", "/dev/block/by-name/system", "/system");
如果直接在Android 12设备上刷旧版脚本,Recovery会报错“invalid partition name”,A/B分区设备还需要在脚本里处理slot切换,比如调用set_active命令指定启动槽位。
打包与压缩
脚本写完、文件放好之后,进入打包阶段,这一步最容易出错的是目录层级,很多人把文件直接压到zip根目录,导致Recovery找不到META-INF,正确做法是先在本地创建一个文件夹,把META-INF和system目录放进去,然后对这个文件夹内的全部内容进行压缩。
打包命令(Windows下用7-Zip):
7z a -tzip -r update.zip * -mm=Store
这里的-mm=Store表示不压缩,因为系统文件本身已经经过压缩,二次压缩会拖慢解压速度,如果不加这个参数,打包时间会翻倍,刷机时长也会延长不少。
打包完成后,用7-Zip打开zip包,双击进入META-INF/com/google/android/,确认updater-script是普通文件而非乱码链接。这一步能拦截九成以上的打包错误。
刷机包签名与测试:避免变砖的最后一步
签名不是可选项,而是必选项。TWRP和官方Recovery都会校验签名,未签名的zip包会被直接拒绝,即使某些第三方Recovery允许跳过签名检查,刷入后也可能触发dm-verity校验失败,导致开机卡在bootloop。
使用signapk工具签名
签名工具最常见的是Android源码里的signapk.jar,需要Java环境,操作命令:
java -jar signapk.jar platform.x509.pem platform.pk8 update-unsigned.zip update-signed.zip
如果你不想自己生成密钥,可以直接用Magisk的签名模块,或者下载Android官方测试密钥,不过要注意,用公开密钥签名的包,在部分设备上可能无法通过验证,最稳妥的方式是使用AOSP源码中的platform密钥,这是业内最通用的方案。
在TWRP中测试刷机包
刷机包制作完成后,千万别直接刷入日常使用的手机。先找一台备用机或旧设备测试,业内专家指出,多数变砖事故都源于跳过测试环节直接实操。
测试流程:
- 手机关机,音量键加电源键进入Recovery模式。
- 执行双清操作(Wipe Dalvik/ART Cache和Data)。
- 选择Install,找到你的刷机包,滑动确认刷入。
- 观察屏幕日志,注意是否有红色的Error或FAILED提示。
- 刷完重启,耐心等待开机动画,第一次开机可能需要5-10分钟。
如果重启后卡在开机动画,回Recovery重新刷入,并检查logcat输出。日志中avc: denied代表SELinux权限问题,failed to get file多是指定路径不存在。
常见刷入失败原因排查
| 错误提示 | 原因分析 | 解决方案 |
|---|---|---|
Error 7 |
设备型号冲突或脚本语法错误 | 检查getprop断言,确认机型代号 |
Error 6 |
updater-script出现未知命令 | 逐行检查脚本,重点看分号和引号 |
Error 4 |
zip包内文件缺失或路径错误 | 重新解压打包,核对目录结构 |
signature verification failed |
未签名或签名密钥不匹配 | 重新签名,确认使用正确密钥 |
insufficient storage space |
系统分区空间不足 | 精简system文件,或扩大分区 |
关于制作刷机zip包的常见问题
制作刷机包需要root权限吗?
严格来说不需要,你可以在电脑上解压官方固件、修改脚本、打包签名,全程不碰手机,但如果要提取已刷入系统的已修改文件,比如Magisk修复过的boot.img,那确实需要root权限才能读取对应分区。
小米刷机包制作流程和通用流程有区别吗?
小米设备刷机包制作流程和通用方法基本一致,唯一需要留意的是小米设备有独特的防回滚机制,如果刷机包内包含aboot或tz分区镜像,需要确认版本号不低于当前已安装版本,否则fastboot模式下会直接拒绝刷入,小米的dynamic system分区在Android 11之后的机型上刷入时,需要在脚本中额外挂载super分区。
刷机包和卡刷包有什么区别?
两者本质上是同一种东西,卡刷包泛指通过Recovery模式安装的zip格式固件包,而刷机包是更宽泛的称呼,有时也包括线刷包,但从技术实现来看,卡刷包必须包含META-INF/updater-script结构,而线刷包是完整的镜像文件集合,通过fastboot直接烧录到分区。自制zip包时,你做的其实就是卡刷包,只不过社区里习惯统称为刷机包。

