打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【第六讲】如何制作刷机补丁和CWM刷机包ROM

SunnyOK系列讲座索引

【第一讲】如何用Odin刷机 - 新手必读
http://bbs.361zn.com/thread-20664-1-1.html

【第二讲】I897卡刷或CWM刷机教程
http://bbs.361zn.com/thread-20665-1-1.html

【第三讲】APK应用程序的解包、修改、编辑、打包及应用
http://bbs.361zn.com/thread-20666-1-1.html

【第四讲】ROM的提取和RFS文件的解包打包
http://bbs.361zn.com/thread-20668-1-1.html

【第五讲】如何制作或定制Odin刷机包ROM
http://bbs.361zn.com/thread-20669-1-1.html

【第六讲】如何制作刷机补丁和CWM刷机包ROM
http://bbs.361zn.com/thread-20670-1-1.html

-----------------------------------------------

如何制作刷机补丁和CWM刷机包ROM

在第一讲和第二讲中介绍过两种刷机方法:用Odin刷机程序在“挖煤”模式下刷TAR刷机包(线刷)和在Recovery(恢复)模式下刷zip刷机包(卡刷)。在第五讲中教给大家如何制作或定制Odin刷机包ROM(TAR包)。在这一讲中,我们来介绍一下制作卡刷刷机包的方法。

在第二讲里的开头讲过:“卡刷”或CWM刷机就是用手机里安装的ClockworkMod程序来在Recovery模式下进行刷机。刷机包为单个签名的zip压缩包。在刷机包中有一个脚本文件,里面有一系列命令,规定好把不同的文件内容复制的手机的指定分区,从而达到刷机目的。那么怎样来制备这种zip刷机包呢?那个脚本文件又是什么呢?

本讲的内容包括两个部分:
1.制作刷机补丁
2.制作完整刷机包ROM


通常,两者都称作刷机包。在本文中,我们说“刷机补丁”是指ROM的补充内容。例如:在英文底包上刷中文文件,或者替换字库,替换主题或桌面等等。它们不构成可使手机运行的全部文件,它们仅仅是ROM的一部分。以前,常用update.zip来传播。当我们说“完整刷机包ROM”时,我们是特指一个独立完整的ROM,包含一个刷ROM所具有的所有必要刷机元素。

1. 制作刷机补丁

我们都知道,ROM发布者通常发布刷机补丁来升级ROM。ROM发布后,需要增加、刷新、更改ROM内容或功能时,没有必要重新安装整个ROM。只要把需要更新的部分写成一个“刷机补丁”,刷进手机与已有的系统合并就行了。

在介绍如何制作刷机补丁之前,先让我们来看一个实例:用刷机补丁来更新两个主题文件,把TouchWiz30Launcher.apk和SystemUI.apk复制进手机的/system/app目录。刷机包补丁文件名为:CWM_Update.zip。

用WinRAR打开刷机补丁文件CWM_Update.zip,看到有两个目录:
META-INF 刷机脚本文件和签名
system 要复制的补丁内容


继续打开/system就看到文件夹/app,再下去在 /app下看到要复制的两个主题文件TouchWiz30Launcher.apk和SystemUI.apk(见截图)。从/system目录开始,所有的目录结构和akp文件放置的位置都必须与手机里的内容一一对应。

然后进入META-INF目录(见截图),我们看到有三个文件和一个字文件夹com。这三个文件是签名文件,是签名操作产生的。在Android手机里,所有要刷入手机或在手机里运行的程序都必须经过签名。从com继续向下走,在/META-INF/com/google/android目录下看到有两个文件:
update-binary 刷机包用的二进制文件
updater-script 刷机包脚本文件
这个刷机包脚本文件updater-script规定了要刷什么,刷到哪和怎样刷。


从这个具体的例子,我们可以总结制作刷机补丁的步骤如下:

1)创建一个工作目录:先假定它是CWM_Update。
2)在CWM_Update下产生两个子文件夹:META-INF和system
CWM_Update/META-INF
CWM_Update/system
3)再在CWM_Update/system下产生下一级子文件夹,存放补丁的内容。目录结构和文件放置要与手机里的文件结构完全一致。apk应用程序放在/app下,字库放在/fonts下,主题放在/framework下,触摸键定义放在/usr/keylayout下,库文件放在/lib下,等等。
4)在CWM_Update/META-INF下再产生
/META-INF/com/google/android
到其它的刷机包里去把现成的update-binary和 updater-script复制进/android目录。

我的做法是把META-INF的整个目录内容都一起复制过了,里面已经有了三个签名文件和刷机包用的二进制文件update-binary,一次搞定,省事。不要碰再它们了。
5)现在来编辑脚本文件updater-script,它规定了要复制什么、怎么复制、复制到什么地方。用文本编辑器打开updater-script,看到内容如下:

mount("MTD", "system", "/system");
ui_print("Updating system...");
show_progress(0.100000, 0);
set_progress(1.000000);

package_extract_dir("system", "/system");
show_progress(0.900000, 10);
ui_print("Update complete!");
unmount("/system");

对脚本文件updater-script内容解释如下:
mount("MTD", "system", "/system");
挂载MTD、system、/system(system是CWM_Update.zip里的/system文件夹,/system是手机空间上的文件夹)
ui_print("Updating system...");
手机屏幕显示提示信息 Updating system...
show_progress(0.100000, 0);
是控制进度条状态(进度条当操作完成后前进10%)
set_progress(1.000000);
把进度条手动设置到100%
package_extract_dir("system", "/system");
将CWM_Update.zip的system文件夹下的内容复制到手机的/system
show_progress(0.900000, 10);
同上,是控制进度条状态(进度条当操作完成后前进90%)
ui_print("Update complete!");
手机屏幕显示提示信息 Update complete!
unmount("/system");
卸载手机/system文件系统,刷机到此结束。
注意:在unmount之后必须有一个空行!这是规定。
6)在CWM_Update目录下,把META-INF和system两个目录打包成一个压缩文件CWM_Update.zip。

7)最后,用签名程序Auto-Sign对CWM_Update.zip进行签名。制作过程结束,刷机补丁就做好了。

注释:如果你打算制作一个刷机补丁的话,原样使用这个脚本文件就行了,不用做任何修改。在实际制作时,可以直接从已有的刷机补丁中把META-INF目录完全复制过来,连签名过程都省了。但是注意检查一下updater-script的内容,以防造成错误后果!

2. 制作完整刷机包ROM

有了上面如何制作刷机补丁做基础,你也不难制作出一个完整的“卡刷”刷机包ROM。与制作Odin刷机包相比,这里没有复杂的RFS解包和打包过程,不需要Linux环境,所有操作在Windows下就搞定了。编辑/system目录下的内容直截了当,删减和添加内容都方便。

我们还是从一个实例出发,考察ROM结构和文件的放置,然后归纳制作步骤,介绍制作技巧。
打开我6月22日的“发布定制I897 2.3.4 XXJVP ROM升级中文版本”(http://bbs.361zn.com/thread-20671-1-1.html)中的第二个卡刷ROM JVP2.3.4_SunnyOK_CN-2.zip,截图如下:

META-INF目录在上一节介绍过了,存放的是签名文件和重要的刷机脚本文件updater-script。
system目录下的内容就是你手机里/system目录下的内容,一模一样。
与上一节相比,这里多了一个目录updates。它是干什么用的呢?打开就一目了然了。updates目录里面有三个文件:modem.bin,zImage和redbend_ua。大家对modem.bin和zImage不陌生吧?它们分别是基带和内核文件。另一个文件redbend_ua是刷机用的,不用管它,但是,不能删掉。
最后一个文件installbusybox也不要动它。

现在再回过头来看看刷机脚本文件updater-script。由于现在要刷进手机的内容多了,所以updater-script的内容也就更复杂了。完整的脚本文件给出如下:
show_progress(0.200000, 10);
set_perm(0, 0, 0777, "/sbin/mount");
run_program("/sbin/mount", "/system");
set_perm(0, 0, 0777, "/sbin/mount");
run_program("/sbin/mount", "/dev/block/stl10", "/dbdata");
set_perm(0, 0, 0777, "/sbin/mount");
run_program("/sbin/mount", "CACHE:");
set_perm(0, 0, 0777, "/sbin/mount");
run_program("/sbin/mount", "/dev/block/mmcblk0p2", "/data");
delete_recursive("/system");
delete_recursive("/dbdata");
delete_recursive("/cache");
delete_recursive("/data/dalvik-cache");
delete_recursive("/data");
mount("MTD", "system", "/system");
package_extract_dir("system", "/system");
package_extract_dir("updates", "/tmp");
show_progress(0.200000, 50);
symlink("toolbox", "/system/bin/cat");
symlink("toolbox", "/system/bin/chmod");
symlink("toolbox", "/system/bin/chown");
symlink("toolbox", "/system/bin/cmp");
symlink("toolbox", "/system/bin/date");
symlink("toolbox", "/system/bin/dd");
symlink("toolbox", "/system/bin/df");
symlink("toolbox", "/system/bin/dmesg");
symlink("toolbox", "/system/bin/getevent");
symlink("toolbox", "/system/bin/getprop");
symlink("toolbox", "/system/bin/hd");
symlink("toolbox", "/system/bin/id");
symlink("toolbox", "/system/bin/ifconfig");
symlink("toolbox", "/system/bin/iftop");
symlink("toolbox", "/system/bin/insmod");
symlink("toolbox", "/system/bin/ioctl");
symlink("toolbox", "/system/bin/ionice");
symlink("toolbox", "/system/bin/kill");
symlink("toolbox", "/system/bin/ln");
symlink("toolbox", "/system/bin/log");
symlink("toolbox", "/system/bin/ls");
symlink("toolbox", "/system/bin/lsmod");
symlink("toolbox", "/system/bin/mkdir");
symlink("toolbox", "/system/bin/mount");
symlink("toolbox", "/system/bin/mv");
symlink("toolbox", "/system/bin/nandread");
symlink("toolbox", "/system/bin/netstat");
symlink("toolbox", "/system/bin/newfs_msdos");
symlink("toolbox", "/system/bin/notify");
symlink("toolbox", "/system/bin/printenv");
symlink("toolbox", "/system/bin/ps");
symlink("toolbox", "/system/bin/reboot");
symlink("toolbox", "/system/bin/renice");
symlink("toolbox", "/system/bin/rm");
symlink("toolbox", "/system/bin/rmdir");
symlink("toolbox", "/system/bin/rmmod");
symlink("toolbox", "/system/bin/route");
symlink("toolbox", "/system/bin/schedtop");
symlink("toolbox", "/system/bin/sendevent");
symlink("toolbox", "/system/bin/setconsole");
symlink("toolbox", "/system/bin/setprop");
symlink("toolbox", "/system/bin/sleep");
symlink("toolbox", "/system/bin/smd");
symlink("toolbox", "/system/bin/start");
symlink("toolbox", "/system/bin/stop");
symlink("toolbox", "/system/bin/sync");
symlink("toolbox", "/system/bin/top");
symlink("toolbox", "/system/bin/umount");
symlink("toolbox", "/system/bin/vmstat");
symlink("toolbox", "/system/bin/watchprops");
symlink("toolbox", "/system/bin/wipe");
symlink("/system/bin/dumpstate", "/system/bin/dumpmesg");
symlink("/system/bin/debuggerd", "/system/bin/csview");
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm_recursive(0, 0, 0755, 0755, "/system/etc");
set_perm_recursive(1002, 1002, 0755, 0440, "/system/etc/bluetooth");
set_perm_recursive(0, 2000, 0755, 0755, "/system/vendor/bin");
set_perm_recursive(0, 2000, 0755, 0644, "/system/vendor/etc");
set_perm_recursive(0, 2000, 0755, 0644, "/system/vendor/firmware");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm(0, 2000, 0755, "/system/vendor");
set_perm(0, 2000, 0755, "/system/vendor/firmware");
set_perm(0, 2000, 0755, "/system/vendor/bin/launch_gps.sh");
set_perm(0, 2000, 0755, "/system/vendor/bin/gpsd");
set_perm(0, 2000, 0755, "/system/etc/bluetooth");
set_perm(0, 3003, 02755, "/system/bin/netcfg");
set_perm(0, 3004, 02755, "/system/bin/ping");
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(0, 0, 06755, "/system/bin/su");
symlink("/system/bin/su", "/system/xbin/su");
set_perm(0, 0, 06755, "/system/xbin/busybox");
set_perm(0, 0, 755, "/tmp/redbend_ua");
show_progress(0.200000, 60);
set_perm(0, 0, 0777, "/system/xbin/busybox");
run_program("/system/xbin/busybox", "--install", "-s", "/system/xbin");
show_progress(0.200000, 70);
set_perm(0, 0, 0777, "/tmp/redbend_ua");
run_program("/tmp/redbend_ua", "restore", "/tmp/modem.bin", "/dev/block/bml12");
show_progress(0.200000, 80);
set_perm(0, 0, 0777, "/tmp/redbend_ua");
run_program("/tmp/redbend_ua", "restore", "/tmp/zImage", "/dev/block/bml7");
show_progress(0.200000, 90);
set_perm(0, 0, 0777, "/tmp/redbend_ua");
run_program("/tmp/redbend_ua", "restore", "/tmp/zImage", "/dev/block/bml8");
show_progress(1.000000, 0);
set_perm(0, 1000, 0755, "/system/xbin/busybox");
package_extract_file("installbusybox", "/tmp/installbusybox");
set_perm(0, 0, 0777, "/tmp/installbusybox");
run_program("/tmp/installbusybox");
unmount("/system");


感兴趣的机友可以到机锋论坛或其它论坛去学习脚本文件里的语句和语法,这里不作介绍。也看看参考目录中的链接。值得要提的是下面这两句,用run_program语句把基带文件modem.bin复制到bml12分区,把内核文件zImage复制进bml7分区。
run_program("/tmp/redbend_ua", "restore", "/tmp/modem.bin", "/dev/block/bml12");
run_program("/tmp/redbend_ua", "restore", "/tmp/zImage", "/dev/block/bml7");


现在给出制作完整刷机包ROM的步骤:
1)创建一个工作目录:先假定它是JVP-ROM。
2)在JVP-ROM下产生三个子文件夹:META-INF,system和updates:
JVP-ROM/META-INF
JVP-ROM /system
JVP-ROM /updates
3)去找一个现成的卡刷刷机包ROM,例如我6月22日发的卡刷包ROM:JVP2.3.4_SunnyOK_CN-2.zip。把解压后得到的META-INF和installbusybox都复制进JVP-ROM目录,把redbend_ua复制进/updates文件夹。
4)在JVP-ROM/system下准备好所用相应的内容。这个不用教你,自己看一下手机里的/system就清楚了。另外,定制ROM必须会修改和编辑/system。
5)把选好的基带和内核文件放到JVP-ROM/updates目录下。
6)在JVP-ROM目录下,把META-INF,system,updates和installbusybox一起打包成压缩文件JVP-ROM.zip。这就是完成了的完整刷机包ROM了。


注释:

1)以上没有说签名步骤,原因是在第3)步里已经把签名文件都复制过来了,不需要再签名。
2)如果没有借用以前的签名,最后一步就要用签名程序Auto-Sign对JVP-ROM.zip进行签名。
3)以上的制作过程借用了已有卡刷ROM的某些元素,使制作过程大大简化,达到自己的目的。



3. 补充内容:如何单刷基带和内核

1) 单刷基带
当单刷基带时,在/updates文件夹内放基带文件modem.bin和复制文件bmlwrite。刷机脚本文件的内容写为:
ui_print(" ");
ui_print(" ");
ui_print("Flashing I897 modem. Please wait...");
ui_print(" ");
package_extract_dir("updates", "/tmp/updates");
set_perm(0, 0, 755, "/tmp/updates/bmlwrite");
run_program("/tmp/updates/bmlwrite", "/tmp/updates/modem.bin", "/dev/block/bml12");
ui_print("Successful! Please reboot.");


2) 单刷内核

当单刷内核时,在/updates文件夹内放内核文件zImage和复制文件bmlwrite。刷机脚本文件的内容写为:

ui_print(" ");
ui_print(" ");
ui_print("Flashing I897 kernel. Please wait...");
ui_print(" ");
package_extract_dir("updates", "/tmp/updates");
set_perm(0, 0, 0755, "/tmp/updates/bmlwrite");
run_program("/tmp/updates/bmlwrite", "/tmp/updates/zImage", "/dev/block/bml7");
ui_print("Successful! Please reboot.");




感谢jdx0616在第11楼提供的单刷基带和单刷内核的模板。



附件:
1. 签名程序
Auto-sign.rar(201.18 KB, 下载次数: 0)


2. 刷机补丁模板
Update-Template.rar(146.04 KB, 下载次数: 8)


3. 完整刷机包ROM模板
ROM-Template.rar(349.79 KB, 下载次数: 0)


4. 单刷基带模板
Phone-Update.rar(188.23 KB, 下载次数: 0)


5. 单刷内核模板
Kernel-Update.rar(188.24 KB, 下载次数: 0)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
基于CyanogenMod7的ROM制作方法
T959 rom移植和内核移植以及基带相关的教程
制作属于自己的ROM,让玩机更自由,更有想象力。
【实用教程】【骑士原创教程】手把手教你写刷机脚本,小白也能学会做补丁包和rom!
ROM之家教你怎样创建一个刷机包
如何制作Android ROM,想学ROM制作的朋友必看
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服