设为首页收藏本站

移动叔叔

搜索
查看: 13375|回复: 0
打印 上一主题 下一主题

[教程] [实用教程] (转小白杨教程)写给想做rom的小白--关于update-binary的详解

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-19 07:39:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
适用于小白,高手掠过   很多人都对制作刷机包非常感兴趣,也有很大部分已经实践,也有些实践了却越不过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");



至此就可以刷入了,当然也许你会碰到一些其他问题,但这不是今天我讲的
内容。

您需要登录后才可以回帖 登录 | 注册

© 2008-2024 移动叔叔. 版权所有,专业的网络售后平台 ( 闽ICP备18006692号-3 )

商务合作点击这里给我发消息|Email:service@mobileuncle.com|手机版|移动叔叔     

GMT+8, 2024-12-23 04:45 , Processed in 0.204351 second(s), 12 queries , Gzip On, Memcache On.

返回顶部