刷机包怎么写,刷机包制作教程具体步骤有哪些
刷机包的本质是一个包含系统镜像、脚本和元数据的压缩包,写刷机包的核心就是按特定目录结构打包并用Edify脚本语言编写刷机指令。 这篇文章写给想自己动手定制卡刷包的朋友,不涉及固件编译,只讲怎么把一套文件打包成手机能识别的刷机包。
刷机包怎么写?先分清你要做哪种包
写刷机包之前,先确认你要做的是卡刷包还是线刷包,两者格式完全不同,线刷包通常用于PC端工具刷机,镜像文件raw格式,结构固定,自己写成本高,绝大多数DIY场景用的是卡刷包——在Recovery模式下通过zip包刷入,下文默认讨论卡刷包。
卡刷包目录结构拆解
一个标准的第三方卡刷包,打开后必须能看到以下几层,缺一不可:
- META-INF/com/google/android/:核心区,里面放刷机脚本
updater-script和二进制执行文件update-binary - system/:系统文件目录,对应手机/system分区,app、framework、lib、media等子目录按原样放置
- boot.img:内核镜像文件,可选,但绝大多数卡刷包都包含
- data/:用户数据预置目录,可选,用于刷机后首次开机预装应用
把你解包得到的文件按这个结构铺好,刷机脚本就能找到对应目标分区,这个结构也是行业内做第三方ROM通用的基线,据XDA社区惯例,任何不遵循此结构的zip包都无法被TWRP识别。
安卓刷机包制作教程:META-INF文件夹的完整搭建流程
这是整个刷机包编写的灵魂部分,也是新手最容易卡住的地方,我们拆开写。
第一步:拿到update-binary和update-script
update-binary是一个可执行文件,负责解析脚本指令并执行,不同Recovery版本对应不同版本的update-binary,不能混用,获取途径是:随便找一个同品牌机型的公开卡刷包,解压后把META-INF/com/google/android/整个目录拷出来备用,如果你想兼容性更好,还可以从LineageOS官方包中提取,这个来源的脚本兼容范围相对更广。
第二步:手写edify脚本
updater-script是纯文本文件,用记事本或VS Code编辑,每一条指令都控制着刷机过程中的一个动作,下面这段是最少必要指令,用于卸载旧系统并写入新数据:
ui_print("开始格式化分区");
format("ext4", "EMMC", "/dev/block/bootdevice/by-name/system", "0", "/system");
mount("ext4", "EMMC", "/dev/block/bootdevice/by-name/system", "/system");
package_extract_dir("system", "/system");
package_extract_file("boot.img", "/dev/block/bootdevice/by-name/boot");
unmount("/system");
ui_print("刷入完成,正在重启");
脚本必须按执行顺序排列:先格式化,再挂载,然后解压文件,最后卸载,顺序乱了轻则刷入失败,重则变砖,分区路径/dev/block/bootdevice/by-name/是当前主流高通平台的命名方式,如果你用的是联发科或老旧机型,路径可能不同,需要从原厂包或已有第三方包中查询确认。
| 脚本指令 | 作用 | 使用频率 |
|---|---|---|
| ui_print | 屏幕输出文字 | 常用 |
| format | 格式化分区 | 刷机前必用 |
| mount | 挂载分区到指定路径 | 必用 |
| package_extract_dir | 将包内目录解压到指定路径 | 必用 |
| package_extract_file | 解压单个文件到指定路径 | 按需 |
| delete_recursive | 递归删除指定路径内容 | 按需 |
| set_metadata | 设置文件权限和SELinux标签 | 常见 |
第三步:打包并签名
文件结构放对、脚本写好后,用压缩工具打包时必须选ZIP格式,压缩级别选“存储”或“仅存储”,不要用RAR,也不要默认压缩比,某些Recovery对硬压缩包会解析异常。
打包完成后,能否被你手机的Recovery识别,取决于签名是否有效,卡刷包签名怎么做?这是大多数人容易忽略的最后一道关。
卡刷包签名怎么做?两条路可选
使用Android开发工具
电脑上配好Android SDK,然后用signapk.jar工具对包做签名,签名命令如下:
java -jar signapk.jar testkey.x509.pem testkey.pk8 你的包.zip 签名后的包.zip
testkey.x509.pem和testkey.pk8是AOSP源码中自带的测试密钥,适合个人使用,用这种签名方式打出来的包,TWRP这类第三方Recovery能无压力识别,如果是给官方Recovery用,那需要对应厂商的私钥,个人无法获取,这也是为什么官方Recovery往往刷不了第三方包的原因。
脚本一键签名
不想装SDK的话,可以下载Zipsigner这类PC端工具,图形界面点选输出路径即可完成,此外也有一些在线签名服务,但刷机包涉及系统级文件,不建议拿去线上签名,风险完全不可控。
签名成功与否的标志是:解压后能看到META-INF/MANIFEST.MF和CERT.SF、CERT.RSA文件,没有这三个文件,包在绝大多数Recovery里会直接报错,提示“签名验证失败”。
手机刷机包怎么用?先测试你的签名包能不能跑
写好的包怎么验证正确性?这是最直接的场景,整个流程可以类比成做一份手抓饼:包里的文件是饼皮和配菜,META-INF就是烹饪流程表,update-binary是厨师手中的锅铲,少一样都烙不熟。
刷机前的检查清单
- 确认Recovery版本不低于包所依赖的版本,TWRP 3.x系列目前覆盖机型最广
- 检查包内路径结构,特别是
updater-script里的分区路径与你机型的分区是否一致 - 确认包内有
boot.img,否则刷完大概率无法开机 - 先做完整备份,Nandroid备份或钛备份均可,防止包有问题时数据全丢
刷入操作路径
- 手机进入Recovery模式(多数机型是关机状态下长按音量上+电源键)
- 依次执行“Wipe”下的“Format Data”和“Advanced Wipe”勾选Dalvik/ART Cache、System、Cache,滑动确认
- 返回到主界面选择“Install”,定位到你的zip包
- 滑动刷入,观察屏幕输出日志,出现“Updater process ended with ERROR: 7”时说明脚本出错
ERROR: 7是最常见的报错,绝大多数情况是由于updater-script开头部分的机型校验语句与你设备型号不符,解决方案是去掉脚本开头那几行assert(getprop("ro.product.device") == "xxx"),或者把你的机型名加进去,如果你在考虑“手机刷机包怎么用更安全”,记住一句行业共识:永远用比你当前系统版本更新的Recovery刷老包,而不是用老Recovery刷新包。
写刷机包常见的坑与排查思路
就算你完全按照上面的步骤走,实际刷机过程中也可能遇到一些问题,几个高频问题先列出来,避坑比什么都管用。
- 刷入报错7:机型断言不通过,按上面说的方法处理
- 刷入报错6:脚本语法有问题,逐行检查
updater-script,特别是标点符号是否半角 - 刷入成功但卡开机动画:多半是system目录权限问题,检查包内文件的SELinux上下文件是否丢失
- 开机后设置向导闪退:通常是你包内system/app下预置的应用版本与系统不兼容,删掉或替换成低版本
确保包内文件的Unix权限正确也是关键,用解包工具打出来的文件如果是在Windows下重新打包,权限信息极容易丢失,这会导致文件在刷入后无法运行,推荐用Linux或macOS环境解包打包,或者使用支持保留权限的打包脚本,例如RomKitchen工具链。
Q&A
刷机包可以删掉系统自带软件吗?
可以,把system/app或system/priv-app下对应的apk文件从你的包中移除,再重新签名即可,但要注意,部分系统应用之间有依赖关系,比如删了某厂商的应用商店可能导致设置里部分菜单项报错,删之前先确认功能依赖,若只想在刷入后临时精简,也可以写一个delete_recursive指令,在刷机脚本中自动删除目标路径的应用目录,这样就不需要解包重打包,操作包容错性更高。
解包刷机包需要什么工具?
电脑端最常用的是Payload Dumper(处理新机型payload格式的固件)和RKDevTool(针对瑞芯微芯片),传统卡刷zip包直接用7-Zip或WinRAR就能解压,如果你在Windows下解包后发现system目录里文件结构错乱,优先换用Linux环境重新解压,Windows的文件系统编码可能导致文件名乱码。
刷机包内的update-binary可以随便替换吗?
不能,update-binary必须与Recovery版本和安卓版本匹配,用Android 9的update-binary去刷Android 11的包,很可能导致脚本执行中途崩溃或无法正确挂载分区,稳妥做法是从同安卓大版本的官方或知名第三方包中提取,不要跨版本混用。

