【JK团队|MIUI移植第七课】制作刷机包

刷机包即是我们通常在recovery模式下安装的zip包,刷机包的原理非常简单易懂。本章就讲述刷机包的原理,掌握了这些之后,制作刷机包就不难了。

1.刷机包结构
以patchrom/i9100/I9100ZCKJ1.zip为例,我们先来看看它的目录结构:
I9100ZCKJ1/
|———–data/
|———–system/
|———–flash_image
|———–modem.bin
|———–zImage
|———–META-INF/
|————–CERT.RSA
|————–CERT.SF
|————–MANIFEST.MF
|————–com/google/android
|—————-update-binary
|—————-updater-script

一个刷机包必不可少的部分就是META-INF目录,其中的CERT.RSA,CERT.SF和MANIFEST.MF这三个文件是与签名相关的。

com/google/android目录下存放了两个文件:update-binary和updater-script。updater-script是一个刷机包的核心,它是一个脚本文件,它由一系列的命令所在组成,每一个命令以分号结束。

update-binary则是一个脚本解释器。大家可以认为updater-srcript就是一个指挥中枢,发布了一系列的命令。update-binary则是一个忠实的执行者,它按顺序的逐个执行指挥中枢发布的命令。

updater-script的所涉及到的命令语法和语义的详细描述请参照。

2.updater-srcript例解
本节以I9100ZCKJ1.zip中完整的updater-script文件为例,辅以注释说明updater-srcript文件的各个命令,使得用户可以快速的掌握刷机包的制作。
ui_print(“”);
ui_print(“=============================”);
ui_print(“系统帝国论坛出品:www.jkmeng.cn”);
ui_print(“=============================”);
ui_print(“开发者:番茄小子:QQ:1580447629”);
ui_print(“”);
ui_print(“系统刷入中。。。”);
连续的打印命令,在屏幕上逐行显示指定的字符串。
show_progress(0.500000,0);
显示当前的安装进度完成了50%的增长。
ui_print(“FormattingPartitions”);
unmount(“/system”);
unmount(“/cache”);
unmount(“/data”);
format(“ext4″,”EMMC”,”/dev/block/mmcblk0p9″);
format(“ext4″,”EMMC”,”/dev/block/mmcblk0p7″);
format(“ext4″,”EMMC”,”/dev/block/mmcblk0p10″);
mount(“ext4″,”EMMC”,”/dev/block/mmcblk0p9″,”/system”);
mount(“ext4″,”EMMC”,”/dev/block/mmcblk0p7″,”/cache”);
mount(“ext4″,”EMMC”,”/dev/block/mmcblk0p10″,”/data”);
在屏幕上显示FormatingPartitions,对于system,cache,data分区,分别执行卸载,格式化,挂载操作。这几条命令的作用就是清空了system,cache,data分区中的所有内容,然后把这些分区挂载在/system,/cache和/data目录下。

是否格式化system分区是我们判断一个刷机包是否完整包或者升级包的依据,完整包意味着刷写整个system分区,升级包意味着只是更新system分区的某些文件。

但是从技术角度来说,没有必要区分完整包和升级包,它们的内在结构是完全一致的,都是由updater-script决定的。
ui_print(“Extracting/system”);
package_extract_dir(“system”,”/system”);
ui_print(“Extracting/data”);
package_extract_dir(“data”,”/data”);
打印提示信息,将刷机包中system和data目录的内容完整的拷贝到/system和/data目录,这两个package_extract_dir命令真正完成刷写system和data分区。
ui_print(“Symlinking”);
symlink(“busybox”,”/system/xbin/[“,”/system/xbin/[[“,”/system/xbin/acpid”,”/system/xbin/addgroup”,”/system/xbin/adduser”,”/system/xbin/adjtimex”,”/system/xbin/ar”,”/system/xbin/arp”,”/system/xbin/arping”,”/system/xbin/ash”,”/system/xbin/awk”,”/system/xbin/basename”,”/system/xbin/bbconfig”,”/system/xbin/beep”,”/system/xbin/blkid”,”/system/xbin/bootchartd”,”/system/xbin/brctl”,”/system/xbin/bunzip2″,”/system/xbin/bzcat”,”/system/xbin/bzip2″,”/system/xbin/cal”,”/system/xbin/catv”,”/system/xbin/chat”,”/system/xbin/chattr”,”/system/xbin/chgrp”,”/system/xbin/chpasswd”,”/system/xbin/chpst”,”/system/xbin/chroot”,”/system/xbin/chrt”,”/system/xbin/chvt”,”/system/xbin/cksum”,”/system/xbin/clear”,”/system/xbin/comm”,”/system/xbin/conspy”,”/system/xbin/cp”,”/system/xbin/cpio”,”/system/xbin/crond”,”/system/xbin/crontab”,”/system/xbin/cryptpw”,”/system/xbin/cttyhack”,”/system/xbin/cut”,”/system/xbin/dc”,”/system/xbin/deallocvt”,”/system/xbin/delgroup”,”/system/xbin/deluser”,”/system/xbin/depmod”,”/system/xbin/devmem”,”/system/xbin/dhcprelay”,”/system/xbin/diff”,”/system/xbin/dirname”,”/system/xbin/dnsd”,”/system/xbin/dnsdomainname”,”/system/xbin/dos2unix”,”/system/xbin/dpkg”,”/system/xbin/dpkg-deb”,”/system/xbin/du”,”/system/xbin/dumpkmap”,”/system/xbin/dumpleases”,”/system/xbin/echo”,”/system/xbin/ed”,”/system/xbin/egrep”,”/system/xbin/eject”,”/system/xbin/env”,”/system/xbin/envdir”,”/system/xbin/envuidgid”,”/system/xbin/ether-wake”,”/system/xbin/expand”,”/system/xbin/expr”,”/system/xbin/fakeidentd”,”/system/xbin/false”,”/system/xbin/fbset”,”/system/xbin/fbsplash”,”/system/xbin/fdflush”,”/system/xbin/fdformat”,”/system/xbin/fdisk”,”/system/xbin/fgconsole”,”/system/xbin/fgrep”,”/system/xbin/find”,”/system/xbin/findfs”,”/system/xbin/flash_eraseall”,”/system/xbin/flash_lock”,”/system/xbin/flash_unlock”,”/system/xbin/flashcp”,”/system/xbin/flock”,”/system/xbin/fold”,”/system/xbin/free”,”/system/xbin/freeramdisk”,”/system/xbin/fsck”,”/system/xbin/fsck.minix”,”/system/xbin/fsync”,”/system/xbin/ftpd”,
“/system/xbin/ftpget”,”/system/xbin/ftpput”,”/system/xbin/fuser”,”/system/xbin/getopt”,”/system/xbin/getty”,”/system/xbin/grep”,”/system/xbin/gunzip”,”/system/xbin/halt”,”/system/xbin/hdparm”,”/system/xbin/head”,”/system/xbin/hexdump”,”/system/xbin/hostid”,”/system/xbin/hostname”,”/system/xbin/httpd”,”/system/xbin/hush”,”/system/xbin/hwclock”,”/system/xbin/ifdown”,”/system/xbin/ifenslave”,”/system/xbin/ifplugd”,”/system/xbin/ifup”,”/system/xbin/inetd”,”/system/xbin/init”,”/system/xbin/inotifyd”,”/system/xbin/install”,”/system/xbin/ipaddr”,”/system/xbin/ipcalc”,”/system/xbin/ipcrm”,”/system/xbin/ipcs”,”/system/xbin/iplink”,”/system/xbin/iproute”,”/system/xbin/iprule”,”/system/xbin/iptunnel”,”/system/xbin/kbd_mode”,”/system/xbin/killall”,”/system/xbin/killall5″,”/system/xbin/klogd”,”/system/xbin/last”,”/system/xbin/length”,”/system/xbin/less”,”/system/xbin/linux32″,”/system/xbin/linux64″,”/system/xbin/linuxrc”,”/system/xbin/loadfont”,”/system/xbin/loadkmap”,”/system/xbin/logger”,”/system/xbin/login”,”/system/xbin/logname”,”/system/xbin/logread”,”/system/xbin/losetup”,”/system/xbin/lpd”,”/system/xbin/lpq”,”/system/xbin/lpr”,”/system/xbin/lsattr”,”/system/xbin/lspci”,”/system/xbin/lsusb”,”/system/xbin/lzcat”,”/system/xbin/lzma”,”/system/xbin/lzop”,”/system/xbin/lzopcat”,”/system/xbin/makedevs”,”/system/xbin/makemime”,”/system/xbin/man”,”/system/xbin/md5sum”,”/system/xbin/mdev”,”/system/xbin/mesg”,”/system/xbin/microcom”,”/system/xbin/mkdosfs”,”/system/xbin/mke2fs”,”/system/xbin/mkfifo”,”/system/xbin/mkfs.ext2″,”/system/xbin/mkfs.minix”,”/system/xbin/mkfs.reiser”,”/system/xbin/mkfs.vfat”,”/system/xbin/mknod”,”/system/xbin/mkpasswd”,”/system/xbin/mkswap”,”/system/xbin/mktemp”,”/system/xbin/modinfo”,”/system/xbin/modprobe”,”/system/xbin/more”,”/system/xbin/mountpoint”,”/system/xbin/mt”,”/system/xbin/nameif”,”/system/xbin/nc”,”/system/xbin/nice”,”/system/xbin/nmeter”,”/system/xbin/nohup”,”/system/xbin/nslookup”,”/system/xbin/ntpd”,”/system/xbin/od”,”/system/xbin/openvt”,”/system/xbin/passwd”,”/system/xbin/patch”,”/system/xbin/pgrep”,”/system/xbin/pidof”,”/system/xbin/ping6″,”/system/xbin/pipe_progress”,”/system/xbin/pivot_root”,”/system/xbin/pkill”,”/system/xbin/popmaildir”,”/system/xbin/poweroff”,”/system/xbin/printf”,”/system/xbin/pscan”,”/system/xbin/pwd”,”/system/xbin/raidautorun”,”/system/xbin/rdate”,”/system/xbin/rdev”,”/system/xbin/readlink”,”/system/xbin/readprofile”,”/system/xbin/realpath”,”/system/xbin/reformime”,”/system/xbin/reset”,”/system/xbin/resize”,”/system/xbin/rev”,”/system/xbin/rpm”,”/system/xbin/rpm2cpio”,”/system/xbin/rtcwake”,”/system/xbin/run-parts”,”/system/xbin/runlevel”,”/system/xbin/runsv”,”/system/xbin/runsvdir”,”/system/xbin/rx”,”/system/xbin/script”,”/system/xbin/scriptreplay”,”/system/xbin/sed”,”/system/xbin/sendmail”,”/system/xbin/seq”,”/system/xbin/setarch”,”/system/xbin/setfont”,”/system/xbin/setkeycodes”,”/system/xbin/setlogcons”,”/system/xbin/setsid”,”/system/xbin/setuidgid”,”/system/xbin/sha1sum”,”/system/xbin/sha256sum”,”/system/xbin/sha512sum”,”/system/xbin/showkey”,”/system/xbin/slattach”,”/system/xbin/smemcap”,”/system/xbin/softlimit”,”/system/xbin/sort”,”/system/xbin/split”,”/system/xbin/start-stop-daemon”,”/system/xbin/stat”,”/system/xbin/strings”,”/system/xbin/stty”,”/system/xbin/sulogin”,”/system/xbin/sum”,”/system/xbin/sv”,”/system/xbin/svlogd”,”/system/xbin/swapoff”,”/system/xbin/swapon”,”/system/xbin/switch_root”,”/system/xbin/sysctl”,”/system/xbin/syslogd”,”/system/xbin/tac”,”/system/xbin/tail”,”/system/xbin/tar”,”/system/xbin/taskset”,”/system/xbin/tcpsvd”,”/system/xbin/tee”,”/system/xbin/telnet”,”/system/xbin/telnetd”,”/system/xbin/test”,”/system/xbin/tftp”,
“/system/xbin/tftpd”,”/system/xbin/time”,”/system/xbin/timeout”,”/system/xbin/touch”,”/system/xbin/tr”,”/system/xbin/traceroute”,”/system/xbin/traceroute6″,”/system/xbin/true”,”/system/xbin/tty”,”/system/xbin/ttysize”,”/system/xbin/tunctl”,”/system/xbin/tune2fs”,”/system/xbin/ubiattach”,”/system/xbin/ubidetach”,”/system/xbin/udhcpc”,”/system/xbin/udhcpd”,”/system/xbin/udpsvd”,”/system/xbin/uname”,”/system/xbin/uncompress”,”/system/xbin/unexpand”,”/system/xbin/uniq”,”/system/xbin/unix2dos”,”/system/xbin/unlzma”,”/system/xbin/unlzop”,”/system/xbin/unxz”,”/system/xbin/unzip”,”/system/xbin/uptime”,”/system/xbin/usleep”,”/system/xbin/uudecode”,”/system/xbin/uuencode”,”/system/xbin/vconfig”,”/system/xbin/vi”,”/system/xbin/vlock”,”/system/xbin/volname”,”/system/xbin/wall”,”/system/xbin/watch”,”/system/xbin/watchdog”,”/system/xbin/wc”,”/system/xbin/wget”,”/system/xbin/which”,”/system/xbin/who”,”/system/xbin/whoami”,”/system/xbin/xargs”,”/system/xbin/xz”,”/system/xbin/xzcat”,”/system/xbin/yes”,”/system/xbin/zcat”,”/system/xbin/zcip”);
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”);
symlink(“/system/etc/ppp/ip-up-vpn”,”/system/etc/ppp/ip-down-vpn”);
symlink(“/system/bin/dumpstate”,”/system/bin/dumpmesg”);
symlink(“/system/bin/debuggerd”,”/system/bin/csview”);
这些命令创建符号连接,第一个symlink创建所有的busybox命令。

ui_print(“SettingPermissions”);
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_recursive(0,2000,06755,06755,”/system/etc/init.d”);
set_perm(0,0,06755,”/system/etc/init.d”);
set_perm(0,2000,0550,”/system/etc/init.goldfish.sh”);
set_perm_recursive(0,0,0755,04755,”/system/etc/ppp”);
set_perm(0,0,04755,”/system/etc/ppp/ip-up-vpn”);
set_perm(0,0,04755,”/system/etc/ppp/ip-down-vpn”);
set_perm_recursive(0,2000,0755,0755,”/system/xbin”);
set_perm(0,0,06755,”/system/xbin/su”);
set_perm(0,0,06755,”/system/xbin/busybox”);
set_perm(0,0,06755,”/system/xbin/invoke-as”);
set_perm_recursive(1000,1000,0771,0771,”/data”);
这些命令设置文件和目录的uid,gid和访问权限。

show_progress(0.200000,0);
show_progress(0.200000,10);
show_progress(0.200000,10);
进度显示相关,在20秒内显示安装进度增长了60%。

package_extract_file(“flash_image”,”/tmp/flash_image”);
set_perm(0,0,0777,”/tmp/flash_image”);
ui_print(“Installationdukernel…”);
ui_print(“”);
assert(package_extract_file(“zImage”,”/tmp/zImage”),
run_program(“/tmp/flash_image”,”/dev/block/mmcblk0p5″,”/tmp/zImage”),
delete(“/tmp/zImage”));
这些命令的作用就是刷写boot分区,将刷机包中zImage的内容刷写到boot分区。

如果不想改变boot分区很简单,删除这些命令。
ui_print(“Installationmodem…”);
ui_print(“”);
show_progress(0.2,15);
assert(package_extract_file(“modem.bin”,”/tmp/modem.bin”),
run_program(“/tmp/flash_image”,”/dev/block/mmcblk0p8″,”/tmp/modem.bin”),
这些命令的作用是刷写moden分区,即我们通常所说的刷写RADIO。
delete(“/tmp/modem.bin”));
delete(“/tmp/flash_image”);
show_progress(0.100000,0);
unmount(“/system”);
unmount(“/cache”);
unmount(“/data”);
ui_print(“_________________”);
ui_print(“/__\/__\/|//____/”);
ui_print(“///////|//__/”);
ui_print(“//_///_///|//___”);
ui_print(“/_____/\____/_/|_/_____/”);
ui_print(“—————————-“);
ui_print(“PleaseRebootPhone”);
一些善后操作,删除临时文件,卸载相应的挂载点,这样保证我们对分区的修改不会丢失,然后打印一些好玩的信息。

3.制作刷机包
看完上一节,大家可能会觉得一个完整的updater-script还是比较复杂的,但是基本上我们不需要写一个完整的updater-script。就如第三章中所提到的,在开始定制MIUIROM之前我们需要寻找一个合适的原厂ROM刷机包,这个刷机包中就包含了写好的updater-script,我们想要加入些什么功能,只需要在适当的位置加入一些命令。

比如在I9100ZCKJ1.zip包的updater-script中,我们就加入了这个命令:
set_perm(0,0,06755,”/system/xbin/invoke-as”);
invoke-as是MIUI编写的一个程序,这条命令将invoke-as设为一个可执行的set-uid程序。什么是set-uid程序,请google。

明白了updater-script的原理,在找不到ZIP包的情况下,我们也可以很容易的做出ZIP包满足patchrom项目的需要。把我们在移植过程中需要修改的所有system目录下的文件从手机中pull出来,然后写如下一个简单的updater-script,按照之前所说的组织方式压缩成ZIP包:
mount(“ext4″,”EMMC”,”/dev/block/mmcblk0p9″,”/system”);
package_extract_dir(“system”,”/system”)
unmount(“/system”)
即可。有了这样一个ZIP包,patchrom的脚本就可以自动的打包了。

其实除了通过recovery安装ZIP包这种刷机方式,对于某个机型,可能有某些特殊的刷机方式,比如说对于i9100可以制作odin包,这些大家多多在网上查找相应的资料即可。
【JK团队|MIUI移植第七课】制作刷机包

可能对你有帮助的内容:极客币获取 | 话费充值 | 下载帮助 | 刷机必看 | 阿里云代金券

文章名称:【JK团队|MIUI移植第七课】制作刷机包

文章链接:https://www.xtdiguo.com/7193.html

免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

(0)
打赏
番茄小子的头像番茄小子盟主
上一篇 2019年 11月 14日 17:53
下一篇 2019年 11月 14日 20:15

相关推荐

发表回复

登录后才能评论