题引: Android 系统来运行 updater-scripts 的 Edify 语言, 用法及注释.
正文:
大部分的 Edify 命名都是函数,当调用这些函数结束的时候,会返回数据给脚本.当然,你也可以使用这些函数的返 回值来确认成功与否,
例如:
ifelse(mount("yaffs2","MTD","system","/system") =="system", ui_print("Successfully Mounted!"), ui_print("Mount Failed!");
这个命令会尝试去挂载命名为 "system" 的 "MTD" 分区到 "/system".
如果挂载成功,脚本会显示 "Successfully Mounted!",
否则会显示 "Mount Failed!".
下面是用在 Edify 的 Updater-script 中的函数例子:
函数名称: Mount
函数语法: mount(fs_type, partition_type, location, mount_point)
参数详解: fs_type-----------------"yaffs2" 或 "ext4"
partition_type----------"MTD" 或 "EMMC"
location----------------- 分区 (partition) 或 驱动器 (device)
mount_poin------------ 挂载文件系统的目标文件夹 (target folder to mount FS)
作用解释: 挂载一个文件系统到指定的挂载点
返 回 值: 挂载成功则返回挂载点,失败返回 null
函数示例: mount("MTD", "system", "/system"); 挂载 system 分区,设置返回指针 "/system"
mount("vfat", "/dev/block/mmcblk1p2", "/system"); 挂载 / dev/block/mmcblk1p2,返回指针 "/system"
函数名称: is_mounted
函数语法: is_mounted(mount_point)
参数详解: mount_point----------- 字符串,检查是否已经挂载的挂载点
作用解释: 检查文件系统是否挂载
返 回 值: 挂载成功则返回挂载点,失败返回 null
函数示例:
函数名称: unmount
函数语法: unmount(mount_point)
参数详解: mount_point----------- 字符串,要解除挂载的挂载点
作用解释: 解除文件系统挂载
返 回 值: 解除挂载成功则返回挂载点,失败返回 null
函数示例: unmount("/system"); 卸载 / system 分区
函数名称: Format
函数语法: format(fs_type, partition_type, location)
参数详解: fs_type----------------- 字符串,数据为 "yaffs2" 或 "ext4"
partition_type---------- 字符串, "MTD" 或 "EMMC"
location----------------- 字符串, 分区 (partition) 或 驱动器 (device)
作用解释: 格式化为指定的文件系统
函数示例: format("MTD", "system"); 格式化 system 分区
函数名称: Delete
函数语法: delete(file1, file2, ..., fileN)
参数详解: 字符串,要删除的文件
作用解释: 删除一个文件.最少指定一个文件;多个文件可以做为多个参数指定
函数示例: delete("/data/zipalign.log"); 删除文件 / data/zipalign.log
函数名称: Delete_recursive
函数语法: delete_recursive(dir1, dir2,...,dirN)
参数详解: 字符串,要递归删除的目录
作用解释: 删除文件夹及其包含的所有内容.最少指定 1 个目录;多个目录可以做为多个参数指定
函数示例: delete_recursive("/data/dalvik-cache"); 删除文件夹 / data/dalvik-cache
函数名称: Show_progress
函数语法: show_progress(frac, sec)
参数详解: frac---------------------- 进度完成数值
Sec---------------------- 总秒数
作用解释: 显示在 Recovery 系统中进度
函数示例: show_progress(0.1, 10);show_progress 下面的操作可能进行 10s,完成后进度条前进 0.1(也就是 10%)
函数名称: Set_progress
函数语法: set_prograss(frac)
参数详解: frac--------------------- 进度数值
函数示例:
函数名称: Package_extract_dir
函数语法: package_extract_dir(package_path, destination_path)
参数详解: package_path---------- 字符串,升级包内要提取的目录
destination_path-------- 字符串,提取文件的目标目录
作用解释: 提取升级包内目录中的所有文件到指定的目标目录
函数示例: package_extract_dir("system", "/system"); 释放 ROM 包里 system 文件夹下所有文件和子文件夹至 / system
函数名称: Package_extract_file
函数语法: package_extract_file(package_path) 或 package_extract_file(package_path, destination_path)
参数详解: package_path---------- 字符串,升级包内要提取的文件
destination_path------- 字符串,提取文件的目标目录
作用解释: 提取升级包内的单个文件到指定的目标目录
函数示例: package_extract_file("my.zip", "/system"); 解压 ROM 包里的 my.zip 文件至 / system
函数名称: File_getprop
函数语法: file_getprop(file, key)
参数详解: file---------------------- 字符串,要检查的文件名
Key---------------------- 字符串,返回数据中的文件的键名字
作用解释: 在格式 "key"="value" 的文件中取得文件属性值
函数示例:
函数名称: Symlink
函数语法: symlink(target, src1, src2, ..., srcN)
参数详解: target------------------- 字符串,符号链接的目标
srcX --------------------- 字符串,要创建的符号链接的目标点
作用解释: 在创建新的符号链接之前,要断开已经存在的符号链接
函数示例: symlink("toolbox", "/system/bin/ps"); 建立指向 toolbox 的符号链接 / system/bin/ps
函数名称: Set_perm
函数语法: set_perm(uid, gid, mode, file1, file2, ..., fileN)
参数详解: uid---------------------- 用户 ID(user id)
Gid---------------------- 用户组 ID(group id)
Mode-------------------- 权限模式 (permission mode
fileX--------------------- 要设置许可的文件 (file to set permission on)
作用解释: 设置单个文件或一系列文件的权限,最少指定 1 个文件,前 4 个参数是必须的
函数示例: set_perm(0,2000,0550,"system/etc/init.goldfish.sh");设置手机 system 中的 etc/init.goldfish.sh 的用户为 root,用户组为 shell,所有者以及所属用户组成员可以进行读取和执行操作,其他用户无操作权限)
这里 0 代表用户为 root,2000 代表用户组为 shell
我们来说明 0550 这组数据,这组数据的最后三位 550,分别代表 "所有者组用户其他用户" 的权限,也就是我们在 RE 管理中 "用户群组其他" 三行. 我们以 XXX 来表示这三组权限,其中:
×=4 读的权限
×=2 写的权限
×=1 执行的权限
我们必须首先了解用数字表示的属性的含义:0 表示没有权限,1 表示可执行权限,2 表示可写权限,4 表示可读权限,然后将其相加.所以数字属性的格式应为 3 个从 0 到 7 的八进制数.
例如,如果想让某个文件的属主有 "读 / 写" 二种权限,需要把 4(可读)+2(可写)=6(读 / 写).若要 rwx 属性则 4+2+1=7;若要 rw - 属性则 4+2=6;若要 r-x 属性则 4+1=5.
常用修改权限的命令:
Set_perm 0 0 0600 ××× (只有所有者有读和写的权限)
Set_perm 0 0 0644 ××× (所有者有读和写的权限,组用户只有读的权限)
Set_perm 0 0 0700 ××× (只有所有者有读和写以及执行的权限)
Set_perm 0 0 0666 ××× (每个人都有读和写的权限)
Set_perm 0 0 0777 ××× (每个人都有读和写以及执行的权限)
函数名称: Set_perm_recursive
函数语法: set_perm_recursive(uid, gid, dirmode, filemode, dir1, dir2, ...dirN)
参数详解: uid---------------------- 用户 ID(user id)
Gid---------------------- 用户组 ID(group id)
Dirmode---------------- 指定目录内的目录的权限
Filemode--------------- 指定目录内的文件的权限
dirX--------------------- 要设置权限的目标
作用解释: 设置单个目录或一系列目录的里面的所有文件的权限,最少指定 1 个目录,5 个参数都是必须的
函数示例: set_perm_recursive 0 0 0755 0644 SYSTEM:app;设置手机 system/app 文件夹及其中文件的用户为 root,用户组为 root,app 文件夹权限为所有者可以进行读,写,执行操作,其他用户可以进行读取和执行操作,其中的文件的权限为所有者可以进行读写操作,其他用户可以进行读取操作
函数名称: Getprop
函数语法: getprop(key)
参数详解: key--------------------- 字符串,想要系统返回的属性
作用解释: 这个函数是用来返指定的属性的值.它是用来从 build.props 文件中查询手机的信息的.
函数示例:
函数名称: Write_raw_image
函数语法: write_raw_image(file, partition)
参数详解: file---------------------- 字符串,要读取的 Img 源文件
Partition----------------- 字符串,要写入 Img 文件的目标分区
作用解释: 这个函数是用来写 Img 文件到分区
函数示例: write_raw_image("/tmp/boot.img", "boot") 将 yaffs2 格式的 boot 包直接写入 boot 分区
函数名称: Apply_patch
函数语法: apply_patch(srcfile, tgtfile, tgtsha1, tgtsize, sha1_1, patch_1, ..., sha1_x, patch1_x)
参数详解: srcfile------------------- 字符串,要打补丁的源文件 (要读入的文件)
Tgtfile------------------- 字符串,补丁文件要写入的目标文件
tgtsha1----------------- 字符串,写入补丁文件的目标文件的 sha1 哈希值
sha1_x------------------ 字符串,要写入目标文件的补丁数据的 sha1 哈希值 patch1_x---------------- 字符串,实上应用到目标文件的补丁
作用解释: 这个函数是用来打补丁到文件.
函数示例:
函数名称: Apply_patch_check
函数语法: apply_patch_check(file, sha1_1, ..., sha1_x)
参数详解: file---------------------- 字符串,要检查的文件
sha1_x------------------ 要检查的哈希值
作用解释: 检查文件是否已经被打补丁,或者能不能被打补丁.需要检查 "applypatch_check" 函数调用的源代码.
函数示例:
函数名称: Apply_patch_space
函数语法: apply_patch_space(bytes)
参数详解: bytes------------------- 检查的字节的数字
作用解释: 检查缓存来确定是否有足够的空间来写入补丁文件并返回一些数据.
函数示例:
函数名称: Read_file
函数语法: read_file(filename)
参数详解: filename---------------- 字符串,要读取内容的文件名
作用解释: 这个函数返回文件的内容
函数示例:
函数名称: Sha1_check
函数语法: sha1_check(data) 或 sha1_check(data, sha1_hex, ..., sha1_hexN)
参数详解: data--------------------- 要计算 sha1 哈希值的文件的内容 - 必须是只读文件格式
sha1_hexN-------------- 文件数据要匹配的特定的十六进制 sha1_hex 哈希值字符串
作用解释: 如果只指定 data 参数,这个函数返回 data 参数的十六进制 sha1_hex 哈希值字符串.其他参数用来确认你检查的文件是不是列表中的哈希值的一个. 它返回匹配的哈希值,或者在没有匹配任何哈希值时返回空.
函数示例:
函数名称: Ui_print
函数语法: ui_print(msg1, ..., msgN)
参数详解: msg---------------------- 字符串,要处理过程中输出给用户的信息
作用解释: 在脚本运行的时候,在控制台显示的信息.最少要指定 1 个参数,你可以指定额外的 msg 参数,并且它们会连接起来输了
函数示例: ui_print("It's ready!"); 屏幕打印 It's ready!
函数名称: Run_program
函数语法: run_program(prog, arg1, .., argN)
参数详解: prog-------------------- 字符串,要执行的程序
argN-------------------- 字符串,要执行的程序的运行参数
作用解释: 以指定的参执行程序
函数示例: run_program("/system/xbin/installbusybox.sh"); 运行 installbusybox.sh 脚本文件
函数名称: Ifelse
函数语法: ifelse(condition, truecondition, falsecondition)
参数详解: condition---------------- 要运算的表达式
Truecondition----------- 当值为 True 时执行的 Edify 脚本块
Falsecodnition----------- 当值为 False 时执行的 Edify 脚本块
作用解释: 这是 If-then 结构的 Edify 脚本语言.在真条件或非条件下语句可以是单条 Edify 命令或者脚本块.脚本块可以用圆括号来界定,用分号来隔开.
函数示例:
函数名称: Abort
函数语法: abort()
参数详解: 没有参数
作用解释: 中止脚本执行
函数示例:
函数名称: Assert
函数语法: assert(condition)
参数详解: condition---------------boolean
作用解释: 如果 condition 参数的计算结果为 False,则停止脚本执行,否则继续执行脚本
函数示例:
执行 package_extract_file,
assert(package_extract_file("boot.img",
"/tmp/boot.img"),
write_raw_image("/tmp/boot.img","boot"),
delete("/tmp/boot.img"))
如果不返回错误则执行 write_raw_image,
如果 write_raw_image 不出错则执行 delete
PS: 部分记录整理, 及测试刷机后得知的效果.
来源: http://www.jianshu.com/p/e3f0773b6436