4. 编写updater-script脚本基础

任务目标

编写一个可被 Recovery 模式执行的 updater-script 脚本,实现以下三个核心操作:

  1. 挂载 /system 分区(可写模式);
  2. 将指定镜像文件写入 /system 分区对应位置;
  3. 对写入后的文件设置正确的权限与属主。

前置条件

本案例假设你已具备一个可用的 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 为例,实际权限需根据文件用途调整。

打包与运行方式

  1. 将上述内容保存为 updater-script(无扩展名)。
  2. 将 updater-script 与 system.img 放入同一个目录,目录结构如下:
ota_package/
├── META-INF/com/google/android/
│   ├── updater-script
│   └── update-binary
└── system.img
  1. 使用 zip 命令打包整个目录为 ota_update.zip,确保 updater-script 位于 META-INF/com/google/android/ 路径下。
  2. 将 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 日志会提示具体行号,检查是否缺少分号或引号不匹配。