Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465603
Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程
目前update-script脚本格式是edify,其与amend有何区别,暂不讨论,我们只分析其中主要的语法,以及脚本的流程控制。
一、update-script脚本语法简介:
我们顺着所生成的脚本来看其中主要涉及的语法。
1.assert(condition):如果condition参数的计算结果为False,则停止脚本执行,否则继续执行脚本。
2.show_progress(frac,sec):frac表示进度完成的数值,sec表示整个过程的总秒数。主要用与显示UI上的进度条。
3.format(fs_type,partition_type,location):fs_type,文件系统类型,取值一般为“yaffs2”或“ext4”。Partition_type,分区类型,一般取值为“MTD”或则“EMMC”。主要用于格式化为指定的文件系统。事例如下:format(”yaffs2”,”MTD”,”system”)。
4.mount(fs_type,partition_type,location,mount_point):前两个参数同上,location要挂载的设备,mount_point挂载点。作用:挂载一个文件系统到指定的挂载点。
5.package_extract_dir(src_path,destination_path):src_path,要提取的目录,destination_path目标目录。作用:从升级包内,提取目录到指定的位置。示例:package_extract_dir(“system”,”/system”)。
6.symlink(target,src1,src2,……,srcN):target,字符串类型,是符号连接的目标。SrcX代表要创建的符号连接的目标点。示例:symlink(“toolbox”,”/system/bin/ps”),建立指向toolbox符号连接/system/bin/ps,值得注意的是,在建立新的符号连接之前,要断开已经存在的符号连接。
7.set_perm(uid,gid,mode,file1,file2,……,fileN):作用是设置单个文件或则一系列文件的权限,最少要指定一个文件。
8.set_perm_recursive(uid,gid,mode,dir1,dir2,……,dirN):作用同上,但是这里同时改变的是一个或多个目录及其文件的权限。
9.package_extract_file(srcfile_path,desfile_paht):srcfile_path,要提取的文件,desfile_path,提取文件的目标位置。示例:package_extract_file(“boot.img”,”/tmp/boot.img”)将升级包中的boot.img文件拷贝到内存文件系统的/tmp下。
10.write_raw_image(src-image,partition):src-image源镜像文件,partition,目标分区。作用:将镜像写入目标分区。示例:write_raw_image(“/tmp/boot.img”,”boot”)将boot.img镜像写入到系统的boot分区。
11.getprop(key):通过指定key的值来获取对应的属性信息。示例:getprop(“ro.product.device”)获取ro.product.device的属性值。
二、updater-script脚本执行流程分析:
先看一下在测试过程中用命令make otapackage生成的升级脚本如下:
- assert(!less_than_int(1331176658, getprop("ro.build.date.utc")));
- assert(getprop("ro.product.device") == "tcc8800" ||
- getprop("ro.build.product") == "tcc8800");
- show_progress(0.500000, 0);
- format("yaffs2", "MTD", "system");
- mount("yaffs2", "MTD", "system", "/system");
- package_extract_dir("recovery", "/system");
- package_extract_dir("system", "/system");
- symlink("busybox", "/system/bin/cp", "/system/bin/grep",
- "/system/bin/tar", "/system/bin/unzip",
- "/system/bin/vi");
- symlink("toolbox", "/system/bin/cat", "/system/bin/chmod",
- "/system/bin/chown", "/system/bin/cmp", "/system/bin/date",
- "/system/bin/dd", "/system/bin/df", "/system/bin/dmesg",
- "/system/bin/getevent", "/system/bin/getprop", "/system/bin/hd",
- "/system/bin/id", "/system/bin/ifconfig", "/system/bin/iftop",
- "/system/bin/insmod", "/system/bin/ioctl", "/system/bin/ionice",
- "/system/bin/kill", "/system/bin/ln", "/system/bin/log",
- "/system/bin/ls", "/system/bin/lsmod", "/system/bin/lsof",
- "/system/bin/mkdir", "/system/bin/mount", "/system/bin/mv",
- "/system/bin/nandread", "/system/bin/netstat",
- "/system/bin/newfs_msdos", "/system/bin/notify", "/system/bin/printenv",
- "/system/bin/ps", "/system/bin/reboot", "/system/bin/renice",
- "/system/bin/rm", "/system/bin/rmdir", "/system/bin/rmmod",
- "/system/bin/route", "/system/bin/schedtop", "/system/bin/sendevent",
- "/system/bin/setconsole", "/system/bin/setprop", "/system/bin/sleep",
- "/system/bin/smd", "/system/bin/start", "/system/bin/stop",
- "/system/bin/sync", "/system/bin/top", "/system/bin/umount",
- "/system/bin/uptime", "/system/bin/vmstat", "/system/bin/watchprops",
- "/system/bin/wipe");
- set_perm_recursive(0, 0, 0755, 0644, "/system");
- set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
- set_perm(0, 3003, 02750, "/system/bin/netcfg");
- set_perm(0, 3004, 02755, "/system/bin/ping");
- set_perm(0, 2000, 06750, "/system/bin/run-as");
- set_perm_recursive(1002, 1002, 0755, 0440, "/system/etc/bluetooth");
- set_perm(0, 0, 0755, "/system/etc/bluetooth");
- set_perm(1000, 1000, 0640, "/system/etc/bluetooth/auto_pairing.conf");
- set_perm(3002, 3002, 0444, "/system/etc/bluetooth/blacklist.conf");
- set_perm(1002, 1002, 0440, "/system/etc/dbus.conf");
- set_perm(1014, 2000, 0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");
- set_perm(0, 2000, 0550, "/system/etc/init.goldfish.sh");
- set_perm(0, 0, 0544, "/system/etc/install-recovery.sh");
- set_perm_recursive(0, 0, 0755, 0555, "/system/etc/ppp");
- set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
- set_perm(0, 0, 06755, "/system/xbin/librank");
- set_perm(0, 0, 06755, "/system/xbin/procmem");
- set_perm(0, 0, 06755, "/system/xbin/procrank");
- set_perm(0, 0, 06755, "/system/xbin/su");
- set_perm(0, 0, 06755, "/system/xbin/tcpdump");
- show_progress(0.200000, 0);
- show_progress(0.200000, 10);
- assert(package_extract_file("boot.img", "/tmp/boot.img"),
- write_raw_image("/tmp/boot.img", "boot"),
- delete("/tmp/boot.img"));
- show_progress(0.100000, 0);
- unmount("/system");
下面分析下这个脚本的执行过程:
①比较时间戳:如果升级包较旧则终止脚本的执行。
②匹配设备信息:如果和当前的设备信息不一致,则停止脚本的执行。
③显示进度条:如果以上两步匹配则开始显示升级进度条。
④格式化system分区并挂载。
⑤提取包中的recovery以及system目录下的内容到系统的/system下。
⑥为/system/bin/下的命令文件建立符号连接。
⑦设置/system/下目录以及文件的属性。
⑧将包中的boot.img提取到/tmp/boot.img。
⑨将/tmp/boot.img镜像文件写入到boot分区。
⑩完成后卸载/system。
以上就是updater-script脚本中的语法,及其执行的具体过程。通过分析其执行流程,我们可以发现在执行过程中,并未将升级包另外解压到一个地方,而是需要什么提取什么。值得主要的是在提取recovery和system目录中的内容时,一并放在了/system/下。在操作的过程中,并未删除或改变update.zip包中的任何内容。在实际的更新完成后,我们的update.zip包确实还存在于原来的位置。
三、总结
以上的九篇着重分析了android系统中Recovery模式中的一种,即我们做好的update.zip包在系统更新时所走过的流程。其核心部分就是Recovery服务的工作原理。其他两种FACTORY RESET、ENCRYPTED FILE SYSTEM ENABLE/DISABLE与OTA INSTALL是相通的。重点是要理解Recovery服务的工作原理。另外详细分析其升级过程,对于我们在实际升级时,可以根据我们的需要做出相应的修改。
不足之处,请大家不吝指正!
Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程【转】的更多相关文章
- Android系统Recovery工作原理之使用update.zip升级过程分析(八)---解析并执行升级脚本updater-script【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465551 Android系统Recovery工作原理之使用update.zip升级过程分 ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(六)---Recovery服务流程细节【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465439 Android系统Recovery工作原理之使用update.zip升级过程分 ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(一)
通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.我们先从update.zip包的制作开始,然后是Android系统的启动 ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(一)---update.zip包的制作【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7399822 这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过 ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(七)---Recovery服务的核心install_package函数【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7465514 一. Recovery服务的核心install_package(升级 ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(三)【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464699 以下的篇幅开始分析我们在上两个篇幅中生成的update.zip包在具体更新中所经 ...
- Android系统Recovery工作原理之使用update.zip升级过程---updater-script脚本语法简介以及执行流程(转)
目前update-script脚本格式是edify,其与amend有何区别,暂不讨论,我们只分析其中主要的语法,以及脚本的流程控制. 一.update-script脚本语法简介: 我们顺着所生成的脚本 ...
- Android系统Recovery工作原理
Android系统Recovery工作原理之使用update.zip升级过程分析(一)---update.zip包的制作 http://blog.csdn.net/mu0206mu/article/d ...
- (转)Android 系统 root 破解原理分析
现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...
随机推荐
- jQuery——jQuery选择器
基本选择器 # Id选择器 $(“#btnShow”)选择id为btnShow的一个元素 . 类选择器 $(“.liItem”)选择含有类liItem的所有元素 ele 标签选择器 $(“li”)选择 ...
- CSS——盒子
CSS中的盒子具有以下几个种重要的属性: 1.border(边框) :盒子的厚度 2.padding(内边距):盒子内容距离盒子边框的距离 3.margin(外边距):盒子边框与其他的盒子的距离
- SQL基本操作——DROP撤销索引、表以及数据库
DROP撤销索引.表以及数据库 --DROP INDEX 命令删除表格中的索引 DROP INDEX table_name.index_name --DROP TABLE 语句删除表(表的结构.属性以 ...
- H5及微信中唤起app的解决方案
今天我们就来说说这个callapp-lib 我的接到的需求大概是这样的 如果检测到不是在app里面用webview打开的页面就会显示上面的立即打开按钮, 点击的话会判断是否在微信中, 如果在微信中打开 ...
- 15.6.2【Task使用】 组合异步操作
对于C# 5异步特性,我最喜欢的一点是它可以自然而然地组合在一起.这表现为两种不同的 方式.最明显的是,异步方法返回任务,并通常会调用其他返回任务的方法.这些方法可以是直 接的异步操作(如链的最底部) ...
- 小程序map地图多点定位
最近需求有一个类似共享单车查看附近单车的功能,看了看小程序map api对多点定位显示描述的不怎么清晰.显示定位数组添加多个时就不显示了.踩了几个坑写了几个方法.最终弄出来了.有问题建议欢迎留言. h ...
- Python 元组和列表
Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 ...
- 使用androidstudio 分析内存泄漏
分析内存泄漏 http://www.jianshu.com/p/c49f778e7acf
- 【Codeforces 1B】Spreadsheets
[链接] 我是链接,点我呀:) [题意] A~Z分别对应了1~26 AA是27依次类推 让你完成双向的转换 [题解] 转换方法说实话特别恶心>_< int转string 得像数位DP一样一 ...
- 【郑轻邀请赛 B】base64解密
[题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2128 [题意] [题解] 把密文; 在表中找到每个字符对应的数字; 然后转换成相应的 ...