Android ROM 刷机脚本 updater-script详细教程

【内容来自安智骑士】什么是刷机脚本,为什么rom 是一个zip文件,确可以直接刷入? 为什么大家可以轻松做出补丁包,然后也可以刷入?为什么我直接把文件做成一个 zip包,却不行?因为zip包中有刷机脚本,指导着所有文件哪个该往哪儿放,哪个该删除,哪个目录什么权限,都说的明明白白,所以,,

刷机脚本都在哪儿呢? 细心的会发现,每一个软件或者刷机包,或者补丁包,都有一个目录,META-INF,

如果你动一个软件的刷机脚本,就是动了他的签名文件,必须重新签名(签名和给软件一样,简单的很,自己搜下)。 所以,CERT.RSA CERT.SF MANIFEST.MF 就没用了,先删除,签名之后生成新的。
我们要修改的东西主要是com-google-update-script我先贴出一个平时刷gapps补丁包时候用的最多的一个脚本大家看看,

ui_print("only for u8800 2.3");
show_progress(0.2, 0);
mount("ext4", "EMMC", "/dev/block/mmcblk0p12", "/system");
show_progress(0.7, 0);
package_extract_dir("system", "/system");
show_progress(0.1, 0);
unmount("/system");

忘了说一点,修改这个文件用 notepad++ 这个文本软件,不多说,到处是。看上面第一句,ui_print("only for u8800 2.3");作用就是在你recovery刷机的时候显示 only for u8800 2.3引号内的内容可以自己随便修改。比如我自己的包中常用的:
第二句show_progress(0.2, 0);的意思就是 控制刷机时间和进度条,0 是自动,第二个都写0 就是了,前边的0.2是 进度条前进20% 这个无所谓,你都写0.1 也没有问题。甚至不写也行,就是你会看到 刷机的时候 进度条不动,然后嗖的一下 就刷完了。。

第三局:mount("ext4", "EMMC", "/dev/block/mmcblk0p12", "/system"); 意思是挂载system分区,也就是12分区,(13分区是data分区14分区是内置存储卡。)因为要往里面写入东西,当然需要先挂载,才能写入,对应的最后有一句是 卸载system分区unmount("/system"); 这是刷完机之后的。

第四句:真正起作用把文件刷入 系统中的是这句package_extract_dir("system", "/system"); 意思就是 把手机中的system 插到你手机的system中(额,别想歪了)一个完整的system 包含很多个文件夹,如图。

你的目的如果是为了 把程序 增加到system,app中替换 那么只需要有system app 目录就行了,总之,你需要网手机中写入什么,就新建相对应的 文件夹名字,然后里面放入你要放的东西,如果手机中原来自带同名的,那么就覆盖。 当然不同的目录下需要有不同的权限,像是system-app下的程序需要 rw- r -r 就可以了,而有的不是,比如lib下,权限就要更高,就需要响应的脚本增加权限。后面会讲到。我刚开始举例子用的 补丁包是个gapps的补丁包,所有,目录只有system-app 如图。稍等来个完整的给大家看看。
再以dzo4.0为例 弄个完整的给大家看看, 里面所有的汉字都是我的解释。大家做刷机脚本的时候不需要有,我只是为了更好的给大家讲下,然后在后边列出各种命令的用法和格式,当然有些命令这个脚本中没有,比如删除文件等,灵活运用。
assert(getprop("ro.product.device") == "u8800" || getprop("ro.build.product") == "u8800" || getprop("ro.product.board") == "u8800");检查刷机包是不是给u8800用的

show_progress(0.400000, 0);进度条前进百分之四十
format("ext4", "EMMC", "/dev/block/mmcblk0p12", "0");格式化system分区
mount("ext4", "EMMC", "/dev/block/mmcblk0p12", "/system");挂载system分区
mount("vfat", "EMMC", "/dev/block/mmcblk0p1", "/cust");挂载cust(是为了最后写入boot.img的,因为boot单独在外边,不在system中而且也不是写入12分区的,写入boot.img的语句在倒数第五行)ui_print("Updating SYSTEM...");
show_progress(0.5, 20);
package_extract_dir("system", "/system");把刷机包中所有system下的目录和文件写入到12分区一下symlink的可以理解为创建快捷方式。
symlink("/factory/hdcp.keys", "/system/vendor/firmware/hdcp.keys");
symlink("/persist/msm7630_qcom_wlan_nv.bin", "/system/etc/firmware/wlan/volans/WCN1314_qcom_wlan_nv.bin");
symlink("Roboto-Bold.ttf", "/system/fonts/DroidSans-Bold.ttf");
symlink("Roboto-Regular.ttf", "/system/fonts/DroidSans.ttf");
symlink("libwiperjni_v01.so", "/system/lib/libwiperjni.so");
symlink("mksh", "/system/bin/sh");
symlink("busybox", "/system/xbin/[", "/system/xbin/[[",
"/system/xbin/arp", "/system/xbin/ash", "/system/xbin/awk",
"/system/xbin/basename", "/system/xbin/bbconfig", "/system/xbin/brctl",
"/system/xbin/bunzip2", "/system/xbin/bzcat", "/system/xbin/bzip2",
"/system/xbin/cal", "/system/xbin/cat", "/system/xbin/catv",
"/system/xbin/chgrp", "/system/xbin/chmod", "/system/xbin/chown",
"/system/xbin/chroot", "/system/xbin/cksum", "/system/xbin/clear",
"/system/xbin/cmp", "/system/xbin/cp", "/system/xbin/cpio",
"/system/xbin/cut", "/system/xbin/date", "/system/xbin/dc",
"/system/xbin/dd", "/system/xbin/depmod", "/system/xbin/devmem",
"/system/xbin/df", "/system/xbin/diff", "/system/xbin/dirname",
"/system/xbin/dmesg", "/system/xbin/dnsd", "/system/xbin/dos2unix",
"/system/xbin/du", "/system/xbin/echo", "/system/xbin/ed",
"/system/xbin/egrep", "/system/xbin/env", "/system/xbin/expr",
"/system/xbin/false", "/system/xbin/fdisk", "/system/xbin/fgrep",
"/system/xbin/find", "/system/xbin/fold", "/system/xbin/free",
"/system/xbin/freeramdisk", "/system/xbin/fuser", "/system/xbin/getopt",
"/system/xbin/grep", "/system/xbin/gunzip", "/system/xbin/gzip",
"/system/xbin/head", "/system/xbin/hexdump", "/system/xbin/id",
"/system/xbin/ifconfig", "/system/xbin/insmod", "/system/xbin/install",
"/system/xbin/ip", "/system/xbin/kill", "/system/xbin/killall",
"/system/xbin/killall5", "/system/xbin/length", "/system/xbin/less",
"/system/xbin/ln", "/system/xbin/losetup", "/system/xbin/ls",
"/system/xbin/lsmod", "/system/xbin/lspci", "/system/xbin/lsusb",
"/system/xbin/lzop", "/system/xbin/lzopcat", "/system/xbin/md5sum",
"/system/xbin/mkdir", "/system/xbin/mke2fs", "/system/xbin/mkfifo",
"/system/xbin/mkfs.ext2", "/system/xbin/mknod", "/system/xbin/mkswap",
"/system/xbin/mktemp", "/system/xbin/modprobe", "/system/xbin/more",
"/system/xbin/mount", "/system/xbin/mountpoint", "/system/xbin/mv",
"/system/xbin/netstat", "/system/xbin/nice", "/system/xbin/nohup",
"/system/xbin/nslookup", "/system/xbin/ntpd", "/system/xbin/od",
"/system/xbin/patch", "/system/xbin/pgrep", "/system/xbin/pidof",
"/system/xbin/ping", "/system/xbin/pkill", "/system/xbin/printenv",
"/system/xbin/printf", "/system/xbin/ps", "/system/xbin/pwd",
"/system/xbin/rdev", "/system/xbin/readlink", "/system/xbin/realpath",
"/system/xbin/renice", "/system/xbin/reset", "/system/xbin/rm",
"/system/xbin/rmdir", "/system/xbin/rmmod", "/system/xbin/route",
"/system/xbin/run-parts", "/system/xbin/sed", "/system/xbin/seq",
"/system/xbin/setsid", "/system/xbin/sh", "/system/xbin/sha1sum",
"/system/xbin/sha256sum", "/system/xbin/sha512sum",
"/system/xbin/sleep", "/system/xbin/sort", "/system/xbin/split",
"/system/xbin/stat", "/system/xbin/strings", "/system/xbin/stty",
"/system/xbin/swapoff", "/system/xbin/swapon", "/system/xbin/sync",
"/system/xbin/sysctl", "/system/xbin/tac", "/system/xbin/tail",
"/system/xbin/tar", "/system/xbin/tee", "/system/xbin/telnet",
"/system/xbin/test", "/system/xbin/tftp", "/system/xbin/time",
"/system/xbin/top", "/system/xbin/touch", "/system/xbin/tr",
"/system/xbin/traceroute", "/system/xbin/true", "/system/xbin/tty",
"/system/xbin/tune2fs", "/system/xbin/umount", "/system/xbin/uname",
"/system/xbin/uniq", "/system/xbin/unix2dos", "/system/xbin/unlzop",
"/system/xbin/unzip", "/system/xbin/uptime", "/system/xbin/usleep",
"/system/xbin/uudecode", "/system/xbin/uuencode", "/system/xbin/vi",
"/system/xbin/watch", "/system/xbin/wc", "/system/xbin/wget",
"/system/xbin/which", "/system/xbin/whoami", "/system/xbin/xargs",
"/system/xbin/yes",
"/system/xbin/zcat");
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/r", "/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/touch", "/system/bin/umount",
"/system/bin/uptime", "/system/bin/vmstat", "/system/bin/watchprops",
"/system/bin/wipe");
symlink("wiperiface_v01.so", "/system/bin/wiperiface");下面的set_perm_recursive 是给文件夹赋予相应的权限。set_perm 是给文件赋予权限。大家自几看下不同文件夹和文件需要的权限,看到下面的数字是不是不懂什么意思?读r=4写w=2执行x=1对应的数相加 就是相应的权限。
【来自安卓阿木】注释:set_perm
【语法】set_perm(, , , "");
表示用户名称,表示用户组名称,,表示权限模式, [... ]表示文件路径,可以使多个,用空格隔开
【作用】设置单个文件或目录的所有者和权限,像linux中的chmod、chown或chgrp命令一样,只是集中在了一个命令当中
【举例】set_perm(0,2000,0550, "system/etc/init.goldfish.sh")(设置手机system中的etc/init.goldfish.sh的用户为root,用户组为shell,所有者以及所属用户组成员可以进行读取和执行操作,其他用户无操作权限)
【说明】在此命令中最难明白的是0 2000 0550这几组参数所代表的意思,我查了Linux相关的参数,具体如下:
这里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 ××× (每个人都有读和写以及执行的权限)
范例 :
-rw------- (600) -- 只有用户有读写权限。
-rw-r--r-- (644) -- 只有用户有读写权限;而组用户和其他用户只有读权限。
-rwx------ (700) -- 只有用户有读、写、执行权限。
-rwxr-xr-x (755) -- 用户有读、写、执行权限;而组用户和其他用户只有读、执行权限。
-rwx--x--x (711) -- 用户有读、写、执行权限;而组用户和其他用户只有执行权限。
-rw-rw-rw- (666) -- 所有用户都有文件读、写权限。这种做法不可取。
-rwxrwxrwx (777) -- 所有用户都有读、写、执行权限。更不可取的做法。

set_perm_recursive
【语法】set_perm_recursive [... ]
表示用户,表示用户组,表示文件夹的权限,表示文件的权限, [... ]表示文件夹的路径,可以多个,用空格分开
【作用】设置文件夹及文件夹中的文件的所有者和用户组
【说明】其中 分别代表目录和file的权限,具体参数如上述
【举例】set_perm_recursive 0 0 0755 0644 SYSTEM:app(设置手机system/app文件夹及其中文件的用户为root,用户组为root,app文件夹权限为所有者可以进行读、写、执行操作,其他用户可以进行读取和执行操作,其中的文件的权限为所有者可以进行读写操作,其他用户可以进行读取操作)
下面是我们常用的两组修改权限的命令和截图:
一组是常规程序用RE管理器拷贝到system/app后修改的权限【ROM修改教程】Android <wbr>ROM <wbr>刷机脚本 <wbr>updater-script详细教程【收藏】


命令如下:
set_perm(0,0,0644,"/system/app/Calendar.apk");
一组是我们要移动dalvik-cache到cache过程中拷贝修改mot_boot_mode.bin【ROM修改教程】Android <wbr>ROM <wbr>刷机脚本 <wbr>updater-script详细教程【收藏】

命令如下:
set_perm(0,0,0755,"/system/bin/mot_boot_mode.bin");
 
以后自己做包的时候可以直接参考下面的内容
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm(0, 1000, 04750, "/system/bin/diag_mdlog");
set_perm(0, 1000, 04750, "/system/bin/iptables");
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(0, 1000, 04750, "/system/bin/tc");
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(1000, 1000, 0777, "/system/etc/init.qcom.sdio.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, 0644, "/system/vendor");
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);
ui_print("Updating BOOT Image...");
package_extract_file("boot.img", "/cust/image/boot.img");这一行是写入boot.img
show_progress(0.1, 0);进度条走百分之十
unmount("/system");卸载system分区
unmount("/cust");卸载cust分区
ui_print("Installation complete!");显示安装结束

1、mount unmout 对应上面的就会了,后边无非是跟上地址

2、Format格式化,不解释了,一般只有一句,就是格式化下 system,上面讲了

3、Delete 删除命令,比如我做的本地补丁包,就用到了,这样可以不用格式化system 直接删除system中不用的响应程序比如,
delete("system/app/CMFM.apk");
delete("system/app/GooglePlayStore.apk");
delete("system/app/Email.apk");
delete("system/app/es.apk");
delete("system/app/Exchange.apk");
delete("system/app/GenieWidget.apk");
delete("system/app/Gmail.apk");
delete("system/app/GoogleBackupTransport.apk");
delete("system/app/GoogleCalendarSyncAdapter.apk");
delete("system/app/GoogleFeedback.apk");
delete("system/app/GoogleLoginService.apk");
复制代码

4、delete_recursive删除文件夹的,用法同上例如:删除文件夹/data/dalvik-cache
5、show_progress 前面注释了很多次了

6、package_extract_dir 最常用的,写入东西的命令。前面 写入system就是用的这句,有印象吧,对应上面看看格式。

7、Symlink语法:symlink(, , ,...);说明:建立指向target符号链接src1,src2,……例如:建立指向toolbox的符号链接/system/bin/ps8、set_perm 给文件赋予权限

8、set_perm(, ,, );说明:设置文件的用户为uid,用户组为gid,权限为mode例如:设置文件/system/etc/dbus.conf的所有者为1002,所属用户组为1002,权限为:所有者有读权限,所属用户组有读权限,其他无任何权限。

9、set_perm_recursive给文件夹富裕权限,前面也说了语法:set_perm_recursive(,,,,);说明:设置文件夹和文件夹内文件的权限例如:设置/data/app的所有者和所属用户组为1000,app文件夹的权限是:所有者和所属组拥有全部权限,其他有执行权限;app文件夹下的文件权限是:所有者有读写权限,所属组有读权限,其他有读权限。

10、ui_print 不解释了吧。

11、run_program 这个是运行脚本的,比如我以前给大家增加的 bootloader,破解粉屏 的补丁,就是 执行了个 这个命令,运行脚本,写入文件的。语法:run_program();说明:运行脚本例如:运行installbusybox.sh脚本文件12、如果要让ROM自带的软件安装到DATA区 就必须挂载DATA区所以在刷机脚本里面要有挂载的命令刷机脚本的位置是META-INF\com\google\android下的updater-script这个文件!format("ext3", "EMMC", "/dev/block/mmcblk0p13"); 这一行是格式格式化DATA分区的命令!!加入这行的话就不用机油去WIPE了直接刷就了事!!但是不包括CACHE!事实上无关大碍CACHE区基本没什么用!mount("ext3", "EMMC", "/dev/block/mmcblk0p13", "/data"); 挂载DATA区的命令package_extract_dir("data", "/data"); 将包里面的data 文件夹 覆盖DATA下!set_perm_recursive(1000, 1000, 0771, 0644, "/data/app"); 给/DATA/APP这个文件夹权限 !
本博客所有文章如无特别注明均为原创。作者:封笔尘缘复制或转载请以超链接形式注明转自 封笔尘缘
原文地址《Android ROM 刷机脚本 updater-script详细教程
分享到:更多

相关推荐

网友评论(2)

u8800大神
FROYO 5年前 (2015-01-03) 回复
完全看不懂
迷糊小侠 5年前 (2014-12-31) 回复