[实用教程] 关于ROM的updater-script脚本详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

注意本帖为本人纯手打,转载需注明:小白杨出品 适用于小白,高手掠
过很多人都对制作刷机包非常感兴趣,也有很大部分已经实践,也有些实践了却越不过update-binary这个槛。

为了为更多初学者解惑,写了这篇文章。

一般初学者都是从用厨房开始作rom,但往往大部分教程都说用厨房做好后,直接刷入即可,但其实我们直接刷入时,一般都会出现错误,无法刷入。

这些教程不知害惨多少热血的小白。

最关键的update-binary他们只字不提,这是很具有误导性的。

制作rom最关键的就是updater-script脚本和update-binary二进制可执行文件,今天就只讲update-binary,因为我发现这种教程比较匮乏。

为什么厨房制作好rom后一般会刷机失败呢,这涉及到updater-script脚本和update-binary,下面回复可见:邪恶吧,呵呵
本帖隐藏的内容
本帖隐藏的内容笼统的说update-binary就是为updater-script脚本的解释执行提供一些函数的支持,比如format,mount等等。

而update-binary提供的函数支持是以函数调用即函数名+形參的形式呈现给调用者,(学过c的都知道)。

我们在updater-script脚本调用这些函数时只需根据函数名即实参即可。

简而言之,我们就可以这样理解,要做好刷机包,一定要确保updater-script脚本中语法的正确,这就必须要知道update-binary提供的函数接口。

下面以一段的update-binary源码为例进行分析,以下为注释
// format(fs_type, partition_type, location,mount_point)
//
// fs_type="yaffs2" partition_type="MTD" location=partition fs_size=<bytes> mount_point=<location> // fs_type="ext4" partition_type="EMMC" location=device fs_size=<bytes> mount_point=<location>
// if fs_size == 0, then make_ext4fs uses the entire partition.
// if fs_size > 0, that is the size to use
// if fs_size < 0, then reserve that many bytes at the end of the partition
我们发现,format函数提供了4个接口,fs_type, partition_type, location, fs_size, mount_point分别代表文件系统类型如ext4,存储设备类型如emmc,位置,即类似/dev/block/mmcblk0p19,然后是挂载点,如
/system,
这样在updater-script中调用就是format("ext4", "EMMC", "/dev/block/mmcblk0p19", "0");现在懂了吧,
但是不同源码编译出来的update-binary的函数接口不同,我只以4个接口的为例,我也碰到过只有三个接口的,比如format("ext3", "MTD", "/system");
所以问题就在这,我们一般经过厨房优化的一般情况下format函数调用由
format("ext4", "EMMC", "/dev/block/mmcblk0p19", "0");
变为
format("ext4", "EMMC", "/dev/block/mmcblk0p19");显然错误,因为update-binary提供函数调用时有如下语句
Value* FormatFn(const char* name, State* state, int argc, Expr* argv[]) {
if (argc != 4) {
return ErrorAbort(state, "%s() expects 5 args, got %d", name, argc);
}
他就是用于统计接口个素的,argc != 4表示接口个素不为4,就终止。

故而无法刷入。

其他函数mount,delete,set_perm等类似。

总之不同源码编译出来的update-binary接口不同,这就要根据接口修改updater-script脚本,
以上为原理部分,
下面讲讲方法,其实我们不必懂得源码,我们只关心函数接口就行了,一般用厨房定制rom后,我们需用原来的rom和定制后的rom中的updater-script脚本(用notepad++,别用记事本之类的)进行函数接口对比,然后
修改即可。

下面实战,
下面是厨房优化后的部分代码,我看优化前的脚本已经知晓format有四个接口,但优化后只有三个,可做如下修改
format("ext4", "EMMC", "/dev/block/mmcblk0p19"); 修改后format("ext4", "EMMC",
"/dev/block/mmcblk0p19", "0");
mount("ext4", "EMMC", "/dev/block/mmcblk0p19", "/system");
package_extract_dir("system", "/system");
----中间略去一部分--------------------------------------
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 0, 0777, 0777, "/system/etc/init.d");
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_recursive(0, 0, 0755, 0555, "/system/etc/ppp");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm(0, 1000, 0755, "/system/xbin/busybox");
symlink("/system/xbin/busybox", "/system/bin/busybox");
run_program("/system/xbin/busybox", "--install", "-s", "/system/xbin"); set_perm(0, 0, 06755, "/system/xbin/su");
symlink("/system/xbin/su", "/system/bin/su");
set_perm(0, 1000, 0755, "/system/xbin/busybox");
symlink("/system/xbin/busybox", "/system/bin/busybox");
run_program("/system/xbin/busybox", "--install", "-s", "/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/tcpdump");
show_progress(0.200000, 0);
show_progress(0.200000, 10);
package_extract_file("boot.img", "/dev/block/mmcblk0p16");
show_progress(0.100000, 0);
package_extract_file("splash.img", "/dev/block/mmcblk0p18"); package_extract_file("qcsbl.mbn", "/dev/block/mmcblk0p2");
package_extract_file("fat.bin", "/dev/block/mmcblk0p13");
package_extract_file("qcsblhd_cfgdata.mbn", "/dev/block/mmcblk0p1"); package_extract_file("OEMSBL.MBN", "/dev/block/mmcblk0p3");
package_extract_file("EMMCBOOT.MBN", "/dev/block/mmcblk0p15");
show_progress(0.100000, 0);
assert(package_extract_file("boot.img", "/tmp/boot.img"),
write_raw_image("/tmp/boot.img", "boot"),
delete("/tmp/boot.img")); assert到这里的 这部分为厨房加进去的我们将之删除,删除后为show_progress(0.100000, 0);
unmount("/system"); unmount("/system");
至此就可以刷入了,当然也许你会碰到一些其他问题,但这不是今天我讲的
内容。

相关文档
最新文档