Android ROM 刷机脚本 updater-script 的基本流程和初级语句说明

什么是刷机脚本,为什么rom 是一个zip文件,确可以直接刷入? 为什么大家可以轻松做出补丁包,然后也可以刷入?为什么我直接把文件做成一个 zip包,却不行?因为zip包中有刷机脚本,指导着所有文件哪个该往哪儿放,哪个该删除,哪个目录什么权限,都说的明明白白,刷机脚本都在哪儿呢? 细心的会发现,每一个软件或者刷机包,或者补丁包,都有一个目录,META-INF。

位置:META-INF\com\google\android\


dd if=....../efs.img of=/dev/block cblk0p3
hidden.img 0p16
radio.img 0p13



如果你动一个软件的刷机脚本,就是动了他的签名文件,必须重新签名(签名和给软件一样,简单的很,自己搜下)。 所以,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引号内的内容可以自己随便修改。比如我自己的包中常用的:

【骑士原创教程】手把手教你写刷机脚本,小白也能学会做补丁包和rom!]

第二句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 包含很多个文件夹,如图。

【骑士原创教程】手把手教你写刷机脚本,小白也能学会做补丁包和rom!]


你的目的如果是为了 把程序 增加到system,app中替换 那么只需要有system app 目录就行了,总之,你需要网手机中写入什么,就新建相对应的 文件夹名字,然后里面放入你要放的东西,如果手机中原来自带同名的,那么就覆盖。 当然不同的目录下需要有不同的权限,像是system-app下的程序需要 rw- r -r 就可以了,而有的不是,比如lib下,权限就要更高,就需要响应的脚本增加权限。后面会讲到。我刚开始举例子用的 补丁包是个gapps的补丁包,所有,目录只有system-app 如图。稍等来个完整的给大家看看。
【骑士原创教程】手把手教你写刷机脚本,小白也能学会做补丁包和rom!] 
再以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_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中不用的响应程序比如,

  1. delete("system/app/CMFM.apk");
  2. delete("system/app/GooglePlayStore.apk");
  3. delete("system/app/Email.apk");
  4. delete("system/app/es.apk");
  5. delete("system/app/Exchange.apk");
  6. delete("system/app/GenieWidget.apk");
  7. delete("system/app/Gmail.apk");
  8. delete("system/app/GoogleBackupTransport.apk");
  9. delete("system/app/GoogleCalendarSyncAdapter.apk");
  10. delete("system/app/GoogleFeedback.apk");
  11. 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>,...);说明:建立指向target符号链接src1,src2,……例如:建立指向toolbox的符号链接/system/bin/ps8、set_perm 给文件赋予权限


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


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


10、ui_print 不解释了吧。


11、run_program  这个是运行脚本的,比如我以前给大家增加的 bootloader,破解粉屏 的补丁,就是 执行了个 这个命令,运行脚本,写入文件的。语法:run_program(<path>);说明:运行<path>脚本例如:运行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这个文件夹权限 !

好了,打字很累,打了半天,给个回复和评分吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值