在第一篇文章中我们提到了updater-script,此文件是一个脚本文件,具体描述了更新过程。我们可以根据具体情况编写该脚本来适应我们的具体需求。今天我就来具体分析下这个脚本的脚本语言。
语法:
mount(type, location, mount_point);
说明:
type="MTD" location="
" 挂载yaffs2文件系统分区; type="vfat" location="/dev/block/
" 挂载设备。 例如:
mount("MTD", "system", "/system");
挂载system分区,设置返回指针"/system”
mount("vfat", "/dev/block/mmcblk1p2", "/system");
挂载/dev/block/mmcblk1p2,返回指针"/system”
语法:
unmount(mount_point);
说明:
mount_point是mount所设置产生的指针。其作用与挂载相对应,卸载分区或设备。此函数与mount配套使用。
例如:
unmount("/system");
卸载/system分区
语法:
format(type, location);
说明:
type="MTD" location=partition(分区),格式化location参数所代表的分区。
例如:
format("MTD", "system");
格式化system分区
语法:
delete(
); 说明:
删除文件
例如:
delete("/data/zipalign.log");
删除文件/data/zipalign.log
语法:
delete_recursive(
); 说明:
删除文件夹
例如:
delete_recursive("/data/dalvik-cache");
删除文件夹/data/dalvik-cache
语法:
show_progress(
, ); 说明:
为下面进行的程序操作显示进度条,进度条会根据
进行前进 例如:
show_progress(0.1, 10);
show_progress下面的操作可能进行10s,完成后进度条前进0.1(也就是10%)
语法:
package_extract_dir(package_path, destination_path);
说明:
释放文件夹package_path至destination_path
例如:
package_extract_dir("system", "/system");
释放ROM包里system文件夹下所有文件和子文件夹至/system
语法:
package_extract_file(package_path, destination_path);
说明:
解压package_path文件至destination_path
例如:
package_extract_dir("my.zip", "/system");
解压ROM包里的my.zip文件至/system
语法:
symlink(
, , ,...); 说明:
建立指向target符号链接src1,src2,……
例如:
symlink("toolbox", "/system/bin/ps");
建立指向toolbox的符号链接/system/bin/ps
语法:
set_perm(
, , , ); 说明:
设置
文件的用户为uid,用户组为gid,权限为mode 例如:
set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");
设置文件/system/etc/dbus.conf的所有者为1002,所属用户组为1002,权限为:所有者有读权限,所属用户组有读权限,其他无任何权限。
语法:
set_perm_recursive(
, , , , ); 说明:
设置文件夹和文件夹内文件的权限
例如:
set_perm_recursive(1000, 1000, 0771, 0644, "/data/app");
设置/data/app的所有者和所属用户组为1000,app文件夹的权限是:所有者和所属组拥有全部权限,其他有执行权限;app文件夹下的文件权限是:所有者有读写权限,所属组有读权限,其他有读权限。
语法:
ui_print("str");
说明:
屏幕打印输出"str"
例如:
ui_print("It's ready!");
屏幕打印It’s ready!
语法:
run_program(
); 说明:
运行
脚本 例如:
run_program("/system/xbin/installbusybox.sh");
运行installbusybox.sh脚本文件
语法:
write_raw_image(
, partition); 说明:
写入
至partition分区 例如:
write_raw_image("/tmp/boot.img", "boot")
将yaffs2格式的boot包直接写入boot分区
语法:
assert(
, , ); 说明:
如果执行sub1不返回错误则执行sub2,如果sub2不返回错误则执行sub3一次类推。
例如:
assert(package_extract_file("boot.img", "/tmp/boot.img"),
write_raw_image("/tmp/boot.img", "boot"),
delete("/tmp/boot.img"));执行package_extract_file,如果不返回错误则执行write_raw_image,如果write_raw_image不出错则执行delete
语法:
getprop("key")
说明:
通过指定key的值来获取对应的属性信息。
例如:
getprop(“ro.product.device”)
获取ro.product.device的属性值。
语法:
ifelse(condition, truecondition, falsecondition)
说明:
condition----------------要运算的表达式
Truecondition-----------当值为True时执行的 Edify脚本块
Falsecodnition-----------当值为False时执行的 Edify脚本块
列如:
ifelse(isuserversion(),
ui_print(" ----user version----- "),
ui_print(" --------- ");
set_perm(0, 2000, 04750, "/system/xbin/su");
);根据isuserversion()返回值判断,如果true,打印" ----user version----- ";如果false,打印" --------- ",并获取su权限。
注意:值得注意的是false分支,执行了两个语句,只需通过‘;’来分割开就可以了。
18、其他
向上一个例子中isuserversion()不是常见的函数,这个是什么呢,怎么识别,这就需要特有的update-binary。
update-binary相当于一个脚本解释器,能够识别updater-script中描述的操作。
Android刷机脚本updater-script实例讲解,在这里引用的是c8812的深度os刷机脚本,请移步:
【文件】updater-script实例讲解
以上就是对updater-script脚本语言的分析,希望对大家有所帮助。感兴趣的同学可以关注我们的微信公众号。
上一篇:【android系统】android系统升级流程分析(二)---update包分析
下一篇:【android系统】android系统升级流程分析(四)---升级过程中log调试方法
参考:
https://www.cnblogs.com/DoNetCShap/archive/2011/12/30/2307120.html