【转】做Rom其实没什么奥秘,浅显易懂的补丁制作教程,带刷机脚本示例


重要说明:

看完这个帖子,你将学到:刷机脚本的含义,如何对刷机脚本进行简单修改,如何制作补丁,如何往内核里加入G大脚本,甚至如何制作Rom的zip包
另外,此贴较长,或许以后还会更长,要想学到东西的机油请耐心看

我将先以我的Blade-Bingo-2.3 Rom里的脚本为例,讲一讲刷机脚本。
然后再以我此贴的附件 KernelPatch.zip 内核补丁为例,简单讲一讲内核单刷补丁怎么做。


首先,我想说,其实,补丁的本质就是一个不完整的Rom刷机包
为什么这么说它?我想看完这个帖子大家就明白了。

首先,请把任意一个V880的Rom解压缩(或者直接用双击打开它,当然,前提是这种格式已被压缩软件关联)。
你会看到,根目录下有META-INF、system文件夹和boot.img文件(其他Rom组织方式,如含data、cust等文件夹的Rom暂不细说)。
刷补丁(或者说,刷机),成功的几个要点:正确的文件,准确的脚本,精确的操作。而这样做,的确的有效


system文件夹里是所有刷机所需文件,今天只教大家做内核补丁,所以暂时不去关心这里是什么。
META-INF\com\google\android\目录下有个edify的updater-script刷机脚本,它与Rom厨房默认的脚本有些不同。
如何不同,那里不同,这也不是今天咱们要讨论的问题,暂此越过。
用记事本或高级一点工具的如NotePad2(建议使用高级工具,自动排列,颜色突出,看起来更有条理)打开脚本文件。

------------------------------------------------------------------------------------------------------
ui_print("");
ui_print("      =================================");
ui_print("                   |     ------==bingo1991==------     |");
ui_print("      ============ 2.3.7-0214 =============");
ui_print("");
ui_print("Updating, plese wait....");
ui_print("");
assert(getprop("ro.product.device") == "blade" || getprop("ro.build.product") == "blade" || getprop("ro.product.board") == "blade");
package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");
set_perm(0, 0, 0777, "/tmp/backuptool.sh");
run_program("/tmp/backuptool.sh", "backup");
show_progress(0.100000, 3);
format("yaffs2", "MTD", "system");
mount("yaffs2", "MTD", "system", "/system");
package_extract_dir("system", "/system");
show_progress(0.600000, 40);
symlink("busybox", "/system/xbin/[", "/system/xbin/[[",
        "/system/xbin/arp", "/system/xbin/ash", "/system/xbin/awk",
        ......
        "/system/xbin/xz", "/system/xbin/xzcat", "/system/xbin/yes",
        "/system/xbin/zcat");
symlink("toolbox", "/system/bin/cat", "/system/bin/cmp",
        "/system/bin/date", "/system/bin/dd", "/system/bin/dmesg",
        ......
        "/system/bin/wipe");
set_perm_recursive(0, 0, 0755, 0644, "/system");
......
set_perm(0, 0, 06755, "/system/xbin/su");
set_perm(0, 0, 06755, "/system/xbin/tcpdump");
show_progress(0.200000, 5);
package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");
set_perm(0, 0, 0777, "/tmp/backuptool.sh");
run_program("/tmp/backuptool.sh", "restore");
package_extract_file("system/bin/modelid_cfg.sh", "/tmp/modelid_cfg.sh");
set_perm(0, 0, 0777, "/tmp/modelid_cfg.sh");
run_program("/tmp/modelid_cfg.sh");
package_extract_file("system/bin/verify_cache_partition_size.sh", "/tmp/verify_cache_partition_size.sh");
set_perm(0, 0, 0777, "/tmp/verify_cache_partition_size.sh");
run_program("/tmp/verify_cache_partition_size.sh");
show_progress(0.100000, 2);
assert(package_extract_file("boot.img", "/tmp/boot.img"),
       write_raw_image("/tmp/boot.img", "boot"),
       delete("/tmp/boot.img"));
unmount("/system");
ui_print("");
ui_print("   ***[ Thanks for using Blade-Bingo-2.3 ]***");
ui_print("**[ A compatible stable long time support Rom]**");

......号处为省略相同格式的语句。
-----------------------------------------------------------------------------------------------
很多行代码,是不是?看不太懂,是不是?
没关系,前显得很,我挑几处重要的地方讲一讲你就懂了。


代码段1:
ui_print("");是在recovery刷机屏幕上显示出一行空格。
ui_print("      |     ------==bingo1991==------     |");
是在recovery刷机屏幕上显示括号内的文字,为什么不用中文?
因为汉化的Recovery的中文字库极为有限,仅支持刷机界面的那些必须显示的文字,其他不包含的文字会显示成“?”
至此,你可以随便改刷机界面的显示信息了,不过,可别盗版哦。
比如,拿我的Rom,把里面的 bingo1991 改为你的大名,然后不加修改地再发出去。。。
这样的行为是我坚决不会赞同的,违者罚款。罚款请主动交至中国工商银行XXXXXXXXXX账号处。。。。。。
开个玩笑。。。。


代码段2:
assert(getprop("ro.product.device") == "blade" || getprop("ro.build.product") == "blade" || getprop("ro.product.board") == "blade");
获取手机信息,验证你的手机到底是不是V880,否则将无法刷入。
这是为了防止让一些其他机型的小白误刷咱们V880的Rom从而发生变砖的惨剧。
不加这行的Rom所有机型都可以刷入,建议Rom同行或者补丁制作者们一定要加上,人性化关怀
当然,你不加这些,但在补丁或Rom发布时仔细说明适用机型的话也是可以的。


代码段:3:
format("yaffs2", "MTD", "system");
mount("yaffs2", "MTD", "system", "/system");
package_extract_dir("system", "/system");
这是非常重要的一段代码,第一步,格式化MTD为yaffs格式,分区命名为system,就是咱们常常说的system分区了;
第二步,以yaffs2格式将此分区挂载到/system挂载点;
最后,解压缩Rom文件里的system目录到/system。
这样,Rom里的system文件夹下所有内容已经写入system分区了。


代码段4:
symlink("busybox", "/system/xbin/[", "/system/xbin/[[",
        "/system/xbin/arp", "/system/xbin/ash", "/system/xbin/awk",
        ......
        "/system/xbin/xz", "/system/xbin/xzcat", "/system/xbin/yes",
        "/system/xbin/zcat");
symlink("toolbox", "/system/bin/cat", "/system/bin/cmp",
        "/system/bin/date", "/system/bin/dd", "/system/bin/dmesg",
        ......
        "/system/bin/wipe");
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
......
set_perm(0, 0, 06755, "/system/xbin/su");
set_perm(0, 0, 06755, "/system/xbin/tcpdump");
这是刷机脚本的主体,是最长的一段代码。
symlink是创建xbin目录下的各种工具与其存放路径的链接,著名的busybox工具也在其中。
set_perm是设置权限,类似Ubuntu下的chmod。这些代码把相应的文件全部设置成正确的权限。
其中,set_perm_recursive(0, 0, 0755, 0644, "/system");与set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
是以递归方式将目录及目录下的文件设成相应的权限。
余下的代码是把一些特殊的文件设置成需要的权限。
看不懂的机油请直接略过此段


代码段5:
assert(package_extract_file("boot.img", "/tmp/boot.img"),
       write_raw_image("/tmp/boot.img", "boot"),
       delete("/tmp/boot.img"));
这是今天的重点。
首先,我们要知道boot.img是启动分区boot的镜像文件,而内核就在这个文件里面(至少V880是这样的,三星等其他一些机型不是这样的)。
---------------------------
如果我们用工具解开这个文件(文件夹名称在不同工具里稍有不同),会发现一个文件夹和一个zImage文件。
文件夹内是ramdisk的内容,zImage就是大名鼎鼎的linux内核了(准确地说是内核镜像文件)。
如何加入G大脚本?
解开G大Rom的boot.img,复制ramdisk文件夹里sbin文件夹的内容覆盖目标内核里相同文件夹及内部文件。
修改ramdisk文件夹里的 init.blade.rc 文件(其他机型不同,如华为的机型是init.huawei.rc),在最末位添加
#by geno
service geno /sbin/geno
    oneshot
service optimize /sbin/odex
    disabled
    oneshot
service timing /sbin/timing
    disabled
    oneshot

on property:dev.bootcomplete=1
    start optimize
    start timing
#by geno

为了尊重G大,请务必把首行和末行"#by geno"留着,当然你也可以写一些附加信息,仅限英文或拼音。
这几行的作用是开启G大脚本运行所需的服务。

如何删除G大内核里的开机第二屏(非开机动画)?
仔细看看ramdisk目录下是否有个 initlogo.rle 文件,它就是第二屏了,不想要的删掉就行。
其实第二屏的作用是让你在等待开机的“漫长”时光里有点东西可以看,让你感觉不那么漫长。
你如果需要的话,可以自己制作第二屏,必须在linux系统下(如Ubuntu)制作,方法此处不说了,问度娘。

至此,重新打包boot.img,并替换回去,你就有一个加入了G大脚本的内核了。 3月1日补充:抱歉,忘了一件很重要的事。
就是,G大脚本还需要/etc/目录下有 enhanced.conf 配置文件的配合。
所以,刷了我附件的内核补丁的机油请自己下载enhanced.zip解压,把  enhanced.conf  放到/system/etc目录下,重启即可。
等等,你还没说怎么替换内核呢?
什么,到这步还要说吗?比如你要换B大N361里的最新内核,解包提取zImage替换就行了嘛。
----------------------------
好了,如果你有耐心看了上面的关于boot.img的介绍,我们已经拥有一个加入了G大脚本,并且使用最新N361内核的boot.img了。
而代码段5的作用无疑就是将boot.img镜像刷入boot启动分区。


代码6:
unmount("/system");卸载前面挂载的system分区。


代码7:
刷机脚本中对此出现的show_progress(p, t);
这是个显示进程的脚本,即在t秒的时间内显示的进度条增加p。
如show_progress(0.5, 20);就是指在20秒的时间内让进度条的进度增加20% ,用来显示刷机进度,很有用。
这些代码添加的位置和数据不合适的话,有时会给人刷机进程卡住了或者一下子很快的感觉。


好了,刷机脚本讲到这里,已经差不多了。
接下来,讲讲如何做内核单刷包,相信你已经心领神会了。
最好的办法是找一个现成的补丁,把刷机脚本改成如下内容:

ui_print("Kernel Patch for CM7");
show_progress(0.500000, 0);
ui_print("Installing...");
assert(package_extract_file("boot.img", "/tmp/boot.img"),
       write_raw_image("/tmp/boot.img", "boot"),
       delete("/tmp/boot.img"));       
ui_print("Install complete!");

删掉其他目录,在补丁根目录留下META-INF文件夹,请保证其子目录\com\google\android\里的update-binary和updater-script还在,且updater-script脚本已经改成上述的样子了(当然,ui_print("XXX");语句可以不加或改成你想要的,但要有意义的文字)。
再在根目录加入你想要的boot.img,重新打包,OK,内核单刷包完成了!
如果你不忙的话,在脚本的最前面加上代码段2,很人性化。
当然,条件允许的话,最好还签个名。重要说明:
看完这个帖子,你将学到:刷机脚本的含义,如何对刷机脚本进行简单修改,如何制作补丁,如何往内核里加入G大脚本,甚至如何制作Rom的zip包
另外,此贴较长,或许以后还会更长,要想学到东西的机油请耐心看

我将先以我的Blade-Bingo-2.3 Rom里的脚本为例,讲一讲刷机脚本。
然后再以我此贴的附件 KernelPatch.zip 内核补丁为例,简单讲一讲内核单刷补丁怎么做。


首先,我想说,其实,补丁的本质就是一个不完整的Rom刷机包
为什么这么说它?我想看完这个帖子大家就明白了。

首先,请把任意一个V880的Rom解压缩(或者直接用双击打开它,当然,前提是这种格式已被压缩软件关联)。
你会看到,根目录下有META-INF、system文件夹和boot.img文件(其他Rom组织方式,如含data、cust等文件夹的Rom暂不细说)。
刷补丁(或者说,刷机),成功的几个要点:正确的文件,准确的脚本,精确的操作。而这样做,的确的有效


system文件夹里是所有刷机所需文件,今天只教大家做内核补丁,所以暂时不去关心这里是什么。
META-INF\com\google\android\目录下有个edify的updater-script刷机脚本,它与Rom厨房默认的脚本有些不同。
如何不同,那里不同,这也不是今天咱们要讨论的问题,暂此越过。
用记事本或高级一点工具的如NotePad2(建议使用高级工具,自动排列,颜色突出,看起来更有条理)打开脚本文件。

------------------------------------------------------------------------------------------------------
ui_print("");
ui_print("      =================================");
ui_print("                   |     ------==bingo1991==------     |");
ui_print("      ============ 2.3.7-0214 =============");
ui_print("");
ui_print("Updating, plese wait....");
ui_print("");
assert(getprop("ro.product.device") == "blade" || getprop("ro.build.product") == "blade" || getprop("ro.product.board") == "blade");
package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");
set_perm(0, 0, 0777, "/tmp/backuptool.sh");
run_program("/tmp/backuptool.sh", "backup");
show_progress(0.100000, 3);
format("yaffs2", "MTD", "system");
mount("yaffs2", "MTD", "system", "/system");
package_extract_dir("system", "/system");
show_progress(0.600000, 40);
symlink("busybox", "/system/xbin/[", "/system/xbin/[[",
        "/system/xbin/arp", "/system/xbin/ash", "/system/xbin/awk",
        ......
        "/system/xbin/xz", "/system/xbin/xzcat", "/system/xbin/yes",
        "/system/xbin/zcat");
symlink("toolbox", "/system/bin/cat", "/system/bin/cmp",
        "/system/bin/date", "/system/bin/dd", "/system/bin/dmesg",
        ......
        "/system/bin/wipe");
set_perm_recursive(0, 0, 0755, 0644, "/system");
......
set_perm(0, 0, 06755, "/system/xbin/su");
set_perm(0, 0, 06755, "/system/xbin/tcpdump");
show_progress(0.200000, 5);
package_extract_file("system/bin/backuptool.sh", "/tmp/backuptool.sh");
set_perm(0, 0, 0777, "/tmp/backuptool.sh");
run_program("/tmp/backuptool.sh", "restore");
package_extract_file("system/bin/modelid_cfg.sh", "/tmp/modelid_cfg.sh");
set_perm(0, 0, 0777, "/tmp/modelid_cfg.sh");
run_program("/tmp/modelid_cfg.sh");
package_extract_file("system/bin/verify_cache_partition_size.sh", "/tmp/verify_cache_partition_size.sh");
set_perm(0, 0, 0777, "/tmp/verify_cache_partition_size.sh");
run_program("/tmp/verify_cache_partition_size.sh");
show_progress(0.100000, 2);
assert(package_extract_file("boot.img", "/tmp/boot.img"),
       write_raw_image("/tmp/boot.img", "boot"),
       delete("/tmp/boot.img"));
unmount("/system");
ui_print("");
ui_print("   ***[ Thanks for using Blade-Bingo-2.3 ]***");
ui_print("**[ A compatible stable long time support Rom]**");

......号处为省略相同格式的语句。
-----------------------------------------------------------------------------------------------
很多行代码,是不是?看不太懂,是不是?
没关系,前显得很,我挑几处重要的地方讲一讲你就懂了。


代码段1:
ui_print("");是在recovery刷机屏幕上显示出一行空格。
ui_print("      |     ------==bingo1991==------     |");
是在recovery刷机屏幕上显示括号内的文字,为什么不用中文?
因为汉化的Recovery的中文字库极为有限,仅支持刷机界面的那些必须显示的文字,其他不包含的文字会显示成“?”
至此,你可以随便改刷机界面的显示信息了,不过,可别盗版哦。
比如,拿我的Rom,把里面的 bingo1991 改为你的大名,然后不加修改地再发出去。。。
这样的行为是我坚决不会赞同的,违者罚款。罚款请主动交至中国工商银行XXXXXXXXXX账号处。。。。。。
开个玩笑。。。。


代码段2:
assert(getprop("ro.product.device") == "blade" || getprop("ro.build.product") == "blade" || getprop("ro.product.board") == "blade");
获取手机信息,验证你的手机到底是不是V880,否则将无法刷入。
这是为了防止让一些其他机型的小白误刷咱们V880的Rom从而发生变砖的惨剧。
不加这行的Rom所有机型都可以刷入,建议Rom同行或者补丁制作者们一定要加上,人性化关怀
当然,你不加这些,但在补丁或Rom发布时仔细说明适用机型的话也是可以的。


代码段:3:
format("yaffs2", "MTD", "system");
mount("yaffs2", "MTD", "system", "/system");
package_extract_dir("system", "/system");
这是非常重要的一段代码,第一步,格式化MTD为yaffs格式,分区命名为system,就是咱们常常说的system分区了;
第二步,以yaffs2格式将此分区挂载到/system挂载点;
最后,解压缩Rom文件里的system目录到/system。
这样,Rom里的system文件夹下所有内容已经写入system分区了。


代码段4:
symlink("busybox", "/system/xbin/[", "/system/xbin/[[",
        "/system/xbin/arp", "/system/xbin/ash", "/system/xbin/awk",
        ......
        "/system/xbin/xz", "/system/xbin/xzcat", "/system/xbin/yes",
        "/system/xbin/zcat");
symlink("toolbox", "/system/bin/cat", "/system/bin/cmp",
        "/system/bin/date", "/system/bin/dd", "/system/bin/dmesg",
        ......
        "/system/bin/wipe");
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
......
set_perm(0, 0, 06755, "/system/xbin/su");
set_perm(0, 0, 06755, "/system/xbin/tcpdump");
这是刷机脚本的主体,是最长的一段代码。
symlink是创建xbin目录下的各种工具与其存放路径的链接,著名的busybox工具也在其中。
set_perm是设置权限,类似Ubuntu下的chmod。这些代码把相应的文件全部设置成正确的权限。
其中,set_perm_recursive(0, 0, 0755, 0644, "/system");与set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
是以递归方式将目录及目录下的文件设成相应的权限。
余下的代码是把一些特殊的文件设置成需要的权限。
看不懂的机油请直接略过此段


代码段5:
assert(package_extract_file("boot.img", "/tmp/boot.img"),
       write_raw_image("/tmp/boot.img", "boot"),
       delete("/tmp/boot.img"));
这是今天的重点。
首先,我们要知道boot.img是启动分区boot的镜像文件,而内核就在这个文件里面(至少V880是这样的,三星等其他一些机型不是这样的)。
---------------------------
如果我们用工具解开这个文件(文件夹名称在不同工具里稍有不同),会发现一个文件夹和一个zImage文件。
文件夹内是ramdisk的内容,zImage就是大名鼎鼎的linux内核了(准确地说是内核镜像文件)。
如何加入G大脚本?
解开G大Rom的boot.img,复制ramdisk文件夹里sbin文件夹的内容覆盖目标内核里相同文件夹及内部文件。
修改ramdisk文件夹里的 init.blade.rc 文件(其他机型不同,如华为的机型是init.huawei.rc),在最末位添加
#by geno
service geno /sbin/geno
    oneshot
service optimize /sbin/odex
    disabled
    oneshot
service timing /sbin/timing
    disabled
    oneshot

on property:dev.bootcomplete=1
    start optimize
    start timing
#by geno

为了尊重G大,请务必把首行和末行"#by geno"留着,当然你也可以写一些附加信息,仅限英文或拼音。
这几行的作用是开启G大脚本运行所需的服务。

如何删除G大内核里的开机第二屏(非开机动画)?
仔细看看ramdisk目录下是否有个 initlogo.rle 文件,它就是第二屏了,不想要的删掉就行。
其实第二屏的作用是让你在等待开机的“漫长”时光里有点东西可以看,让你感觉不那么漫长。
你如果需要的话,可以自己制作第二屏,必须在linux系统下(如Ubuntu)制作,方法此处不说了,问度娘。

至此,重新打包boot.img,并替换回去,你就有一个加入了G大脚本的内核了。3月1日补充:抱歉,忘了一件很重要的事。
就是,G大脚本还需要/etc/目录下有 enhanced.conf 配置文件的配合。
所以,刷了我附件的内核补丁的机油请自己下载enhanced.zip解压,把 enhanced.conf 放到/system/etc目录下,重启即可。
等等,你还没说怎么替换内核呢?
什么,到这步还要说吗?比如你要换B大N361里的最新内核,解包提取zImage替换就行了嘛。
----------------------------
好了,如果你有耐心看了上面的关于boot.img的介绍,我们已经拥有一个加入了G大脚本,并且使用最新N361内核的boot.img了。
而代码段5的作用无疑就是将boot.img镜像刷入boot启动分区。


代码6:
unmount("/system");卸载前面挂载的system分区。


代码7:
刷机脚本中对此出现的show_progress(p, t);
这是个显示进程的脚本,即在t秒的时间内显示的进度条增加p。
如show_progress(0.5, 20);就是指在20秒的时间内让进度条的进度增加20% ,用来显示刷机进度,很有用。
这些代码添加的位置和数据不合适的话,有时会给人刷机进程卡住了或者一下子很快的感觉。


好了,刷机脚本讲到这里,已经差不多了。
接下来,讲讲如何做内核单刷包,相信你已经心领神会了。
最好的办法是找一个现成的补丁,把刷机脚本改成如下内容:

ui_print("Kernel Patch for CM7");
show_progress(0.500000, 0);
ui_print("Installing...");
assert(package_extract_file("boot.img", "/tmp/boot.img"),
       write_raw_image("/tmp/boot.img", "boot"),
       delete("/tmp/boot.img"));       
ui_print("Install complete!");

删掉其他目录,在补丁根目录留下META-INF文件夹,请保证其子目录\com\google\android\里的update-binary和updater-script还在,且updater-script脚本已经改成上述的样子了(当然,ui_print("XXX");语句可以不加或改成你想要的,但要有意义的文字)。
再在根目录加入你想要的boot.img,重新打包,OK,内核单刷包完成了!
如果你不忙的话,在脚本的最前面加上代码段2,很人性化。

当然,条件允许的话,最好还签个名。


首先声明此贴转载:http://blog.csdn.net/bingo1991/article/details/7768880

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值