4. 编写updater-script脚本基础
任务目标
编写一个可被 Recovery 模式执行的 updater-script 脚本,实现以下三个核心操作:
- 挂载
/system分区(可写模式); - 将指定镜像文件写入
/system分区对应位置; - 对写入后的文件设置正确的权限与属主。
前置条件
本案例假设你已具备一个可用的 Recovery 环境(如 TWRP 或 AOSP Recovery),且 OTA 包内已包含待写入的镜像文件(如 system.img 或单个文件 app.apk)。脚本将通过 Recovery 的 edify 引擎解析执行,无需额外依赖。
updater-script 完整代码
# 挂载 /system 分区为可写
mount("ext4", "EMMC", "/dev/block/bootdevice/by-name/system", "/system");
# 将包内 system.img 写入 /system 分区
package_extract_file("system.img", "/system/system.img");
# 设置文件权限:属主 root,属组 root,权限 0644
set_metadata("/system/system.img", "uid", 0, "gid", 0, "mode", 0644);
# 卸载分区(可选,Recovery 结束时会自动处理)
unmount("/system");
脚本说明
- mount:第一个参数为文件系统类型(
ext4),第二个为分区类型(EMMC),第三个为分区节点路径,第四个为挂载点。不同设备的by-name路径可能不同,需按实际设备调整。 - package_extract_file:从 OTA 包中提取
system.img并写入目标路径。若需写入整个分区镜像,目标路径应为分区挂载点下的文件路径,而非块设备节点。 - set_metadata:设置文件的 uid、gid 与 mode。此处以 root:root 和 0644 为例,实际权限需根据文件用途调整。
打包与运行方式
- 将上述内容保存为
updater-script(无扩展名)。 - 将
updater-script与system.img放入同一个目录,目录结构如下:
ota_package/
├── META-INF/com/google/android/
│ ├── updater-script
│ └── update-binary
└── system.img
- 使用
zip命令打包整个目录为ota_update.zip,确保updater-script位于META-INF/com/google/android/路径下。 - 将
ota_update.zip推送到设备(如adb push ota_update.zip /sdcard/),进入 Recovery 模式后选择安装该 ZIP 包。
验证方法与通过条件
- 安装日志:Recovery 刷入过程中,日志应显示
script succeeded,无报错信息。 - 文件检查:刷入完成后,重启进入系统(或挂载 /system),执行以下命令确认结果:
ls -l /system/system.img
预期输出(示例):
-rw-r--r-- 1 root root 1234567 Jan 1 00:00 /system/system.img
其中文件大小应与原始 system.img 一致,属主为 root,权限为 0644。
- 挂载状态:若脚本执行成功,
/system分区在刷入过程中被正确挂载与卸载,无残留挂载点。
常见问题
- mount 失败:确认分区节点路径是否正确,可通过 Recovery 的
ls /dev/block/bootdevice/by-name/查看实际名称。 - 权限设置不生效:确保
set_metadata的参数顺序正确,且目标文件路径与package_extract_file写入路径一致。 - 脚本语法错误:Recovery 日志会提示具体行号,检查是否缺少分号或引号不匹配。