前言:
我们先来看看Android它的体系结构
安卓机制.jpg
android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
蓝色的代表java程序,黄色的代码为运行JAVA程序而实现的虚拟机,绿色部分为C/C++语言编写的程序库,红色的代码内核(linux内核+drvier)



一.制作目的:
1.培养个人兴趣,感受动手动脑的快乐。
2.学习手机基本知识,最终动手制作自己的ROM。
3.帮助那些需要帮助的朋友(说不定有人喜欢你制作的ROM)


二.制作原理
1.安卓基础知识普及:
Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前,最新版本为Android 2.4Gingerbread和Android 3.0Honeycomb。

①——底包
:官方的系统包,相当于我们的Windows的操作系统,事实上它相当于一个纯净版或者内核版的系统包,是最底层的东西。扩展名为sbf,底包通常是官方发布的,ROM作者直接拿来用的,可以选择的版本不会太多,通常更新也不会频繁。底包通常使用PC端刷机工具(RSD)配合Bootloader的工程模式完成刷入。
②——升级包
(镜像包):广大玩家制作的底包增强包,通常表现为一个update.zip文件。升级包是对底包的扩展和增强,包含一系列的辅助工具和服务,没有中文的底包通过升级包可以实现中文。当然,很多功能也是通过升级包来实现的。可以说,在刷新了底包后,配合刷新相应的升级包,这样才形成一个完整系统。升级包通常通过Recovery工具,从SD卡读取刷入。
③——Bootloader :
Bootloader从字面上来看就是启动加载的意思。用过电脑的都知道,windows开机时会首先加载bios,然后是系统内核,最后启动完毕。那么bootloader就相当于手机的bios,它在手机启动的时候根据基带初始化硬件,然后引导系统内核,直到系统启动。因此可以看出,bootloader很重要,如果bootloader不能正常加载,手机就是砖头一个,无法正常启动和使用。这也就是为什么bootloader被锁的手机必须要XX才能刷第三方rom。如果不XXbootloader,就无法初始化手机硬件,手机也就无法使用。
④——Fastboot
fastboot是一种比recovery更底层的刷机模式。 fastboot是一种线刷,就是使用USB数据线连接手机的一种刷机模式。recovery是一种卡刷,就是将刷机包放在sd卡上,然后在recovery中刷机的模式。
常见的fastboot命令
-fastboot devices 查看驱动设备
-fastboot erasr xxx 擦出xxx
-fastboot flash xxx xxx.img 刷xxx(如:fastboot flash system system.img,fastboot flash recovery.img)
-fastboot reboot 重启
⑤——Recovery :
Moto 手机内置的一个独立备份恢复工具,类似电脑上的一些一键还原系统,既是在系统出现问题的时候仍然可以打开的一个模式。Moto 的 Recovery 主要提供了WIPE(硬启,清除数据,恢复出厂设置)和Update(通常用于安装升级包,update.zip)功能。 Recovery是不能直接刷新的底包的,通常它刷新的升级包(update.zip)的方式是:自动寻找SD卡上的特定文件,然后写入。
⑥——基带(Baseband):
是手机中的一块专门的代码,或者可以理解成为一个专门负责通讯的BIOS,负责完成移**络中无线信号的解调、解扰、解扩和解码工作。基带的不同会造成信号效果的不同。因为各地、各网络实际情况不同,需要大家自己选择适合自己的基带。
⑦——WIPE :
wipe后就恢复了出厂设置,包括联系人、短信、安装的软件等全部删除。俗称硬启,恢复出厂设置。注意,wipe后app2sd和root权限需要重新做。而且app2sd重要的分区步骤也要重新来过。某些说法提到在刷新底包或者升级包前需要进行WIPE操作,我对此操作的必要性不是很确定。
⑧——OpenRecovery(简称OR,类似于TWMrecovery) :
由于MOTO很蛋疼的在update.zip上做了一些手脚,这些东西影响到了升级包的制作。于是高手们就搞出了一个OpenRecovery,这其实就一个第三方的增强版的Recovery工具,某些OpenRecovery已经发展成为一个具有很多功能的小系统了(类似WindowsPE),在这个OR中,可以完成很多东西,我们完全可以把OR想象成电脑上用的应急PE系统,在上面可以调整超频、基带、app2sd、更换启动画面、wipe、改变时区、调整键盘布局,甚至链接USB当读卡器等等,凡是recovery能做的,OR都可以做,recovery不能做到,OR可以做到。一般OpenRecovery在sd卡上有两个部分存在:update.zip和OpenRecovery目录,最新的GOT底包添加了新的一个OpenRecovery-CFG目录,用来存放各种个人文件。update.zip就是用来坑MOTO一个标准的的zip升级包,而真正的升级包要放在/sdcard/OpenRecovery/updates目录下。
⑨——App2sd :
说白了,其实很简单,就是把APK文件安装到sd卡上,android是Linux脱胎而来,App2sd的原理就是对SD卡进行分区,然后把SD上划分出来的某个分区合并到系统分区中去(听不懂,不要紧),划分出来的分区是Ext2格式,一般Windows不能识别,不要惊慌,正常现象。App2sd对sd卡要求比较高,如果感觉app2sd后比较慢,可以试试换一张C4的sd卡。因为在2.1的环境下,app2sd需要对sd进行分区,操作比较复杂,E文不好的小白或者电脑基础薄弱的小白容易失误。建议对Android非常熟悉了再做App2sd。
⑩——Root :
大家都知道android系统脱胎自Linux,也正是这个开源的内核让广大玩家可以自由发挥。Root是Linux系统下的系统级账号,拥有系统的全部权限,Android设计上的不开放这个用户的,目的是为了保护系统安全,但是这个保护似乎也带来很多不便。于是就一些工具和方法来开放这个账号。开放Root账号的方法似乎有很多,这里就不再细说。原理上分析,root的账号,应该通过在Android系统安装某个系统级别的服务,该服务具有root权限,然后其它需要root权限的程序再向这个服务请求root权限。官方升级会造成root权限失效,需要重新root权限。

额外说明:
①从原理上分析,通常底包,Bootloader,Recovery,基带都是可以刷新替换的,升级包当然更可以。但是底包、Bootloader很少会有第三方开发或者修改的,一般都使用官方发布的。底包有时候会内置Bootloader、Recovery,这样的底包刷新时会连上述两者一起更新(推测结果,不确定)。更新这样的底包是有危险的,有可能会造成Bootloader损坏,这个东西损坏了,基本就是变砖了,真正的变砖,只能送售后。只有这个东西没坏,就不是砖。
②我们通常所说的刷机ROM实际是升级包,升级包是对应于特定的底包制作的,所以刷机时务必确保使用的底包和升级包版本上保持一致。
③需要注意版本号的还有:Bootloader版本、基带版本、Recovery版本
④目前有些OpenRecovery工具支持底包、升级包一起从SD卡读取刷入
⑤似乎刷机前确保系统干净整洁是很重要的,很多教程提到要通过 WIPE – 刷底包的步骤来确保刷机前的干净,实际上如果底包版本没有变化,刷底包似乎、也许、大概、可能是不必要的。

2.系统结构及文件简单剖析:
一个常见的自制ROM根目录会有以下几个文件夹及文件:
dataMETA-INsystemboot.img(锁了BL的可以无视这个,但制作时需要它,打包时把它拿出来。)
1)应用程序安装目录
(1) 系统应用程序所在目录/system/app/*.apk
(2)用户安装应用程序所在目录/data/app/*.apk
(3) 注意:a)在模拟器中,每重启一次,/system/app/下的应用都会被还原,有时/data/app下也会被清除
若在/system/app和/data/app下有重名的应用,不一定会启动哪一个,尤其是在adb install杀死正在运行的程序时,有时旧的就会被启动
2)用户数据所在目录
/data/data/应用包名/shared_prefs配置文件
/data/data/应用包名/databases/*库文件所在目录
3) SD卡对应目录/sdcard/

系统目录说明
——data
data/app该文件夹里的文件可以全删,也可以自由添加自已所需安装的应用软件,刷机安装后可以自由删除。
——system
system/app在这个文件夹下的程序为系统默认的组件,可以看到都是以APK格式结尾的文件,但有些系统自带的ROM里面还有和APK文件名对应的odex文件。我们主要是针对该文件夹里的文件进行精简,如果有odex文件的,删除APK文件名时同时也删除与其对应的odex文件。虽然一般定制时只是对以上两个文件夹里的文件做相应的增减,但我们还是一起来了解system相应目录常见相应文件的用途吧。rom版本不同,里面的APK也会不一样,其它文件夹下需要改动的较少,或者不需要改动。
app文件下软件详细列出:
\\system\\app
\\system\\app\\AlarmClock.apk闹钟
\\system\\app\\Browser.apk浏览器
\\system\\app\\Bugreport.apkBug报告
\\system\\app\\Calculator.apk计算器
\system\app\Calendar.apk日历
\\system\\app\\CalendarProvider.apk日历提供
\\system\\app\\Camera.apk照相机
\\system\\app\\Contacts.apk联系人
\\system\\app\\DownloadProvider.apk下载提供
\\system\\app\\DrmProvider.apk DRM数字版权提供
\\system\\app\\Email.apk电子邮件客户端
\\system\\app\\FieldTest.apk测试程序
\\system\\app\\GDataFeedsProvider.apk GoogleData提供
\\system\\app\\Gmail.apk Gmail电子邮件
\\system\\app\\GmailProvider.apk Gmail提供
\\system\\app\\GoogleApps.apk谷歌程序包
\\system\\app\\GoogleSearch.apk搜索工具
\\system\\app\\gtalkservice.apk GTalk服务
\\system\\app\\HTMLViewer.apk HTML查看器
\\system\\app\\Htc**.apk集成**客户端PEEP
\\system\\app\\IM.apk即使通讯组件包含MSN、yahoo通
\\system\\app\\Launcher.apk启动加载器
\\system\\app\\Maps.apk电子地图
\\system\\app\\MediaProvider.apk多媒体播放提供
\\system\\app\\Mms.apk短信、彩信
\\system\\app\\Music.apk音乐播放器
\\system\\app\\PackageInstaller.apk apk安装程序
\\system\\app\\Phone.apk电话拨号器
\\system\\app\\Settings.apk系统设置
\\system\\app\\SettingsProvider.apk设置提供
\\system\\app\\SetupWizard.apk设置向导
\\system\\app\\SoundRecorder.apk录音工具
\\system\\app\\Street.apk街景地图
\\system\\app\\Sync.apk同步程序
\\system\\app\\Talk.apk语音程序
\\system\\app\\TelephonyProvider.apk电话提供
\\system\\app\\Updater.apk更新程序
\\system\\app\\***Services.apk ***服务
\\system\\app\\Vending.apk制造商信息
\\system\\app\\VoiceDialer.apk语音拨号器
\\system\\app\\VoiceSearch.apk语音搜索
app文件夹
内放的就是内置软件,有不想要的,直接删除之。请在删除之前先弄清楚它能不能删除。有些官方内置的软件,删除了ROM就废了。当然,你也可以在没弄清楚的情况下乱删一气,只要在刷机完发现问题之后,把删除的软件,一个个放回去排查,刷个十遍八遍,大约也就搞定了。所以我们要佩服那么敢于探索的先驱,不容易啊。
fonts文件夹放的是手机的字体,如果没有美术细胞的人就不要乱改,改字体有时候会死人的,刺眼、字形不协调、大小不一致等等诸如此类。要改也刷机完以后再改。具体方法要参见自己区的人发的帖子。
lib文件夹
顾名思义,是内置软件的库文件。有些软件需要动态库支持才能正常使用的,比如常见的输入法之类的。所以,如果你向一个原本可以正常使用的ROM中加入了新的软件之后,反而出现
某程序意外关闭
某程序意外结束的情况后,那么基本上就是你忘了把库文件给它移动过去。
bin文件夹
中放的是系统内置的工具,像什么busybox,su之类的都在里面,没事不要删除它,可以添加,但不要删除。
etc文件夹
中放置的是系统的设置,诸如无线、GPS、DHCP、拨号、APN列表之类的设置。这个目录中,如果你改了重要的CONF文件,则可能系统出问题。也可以改一部分不重要的东西(比如说APN列表)而不出现问题,但貌似APN列表没必要改。
framework目录
就是系统的UI了,想改界面的人应该改这个目录中的文件。。大约也就是替换一些什么图片,换掉界面框架什么的,改改字体颜色什么的?以达到改换界面的目的。
media目录
是系统内置的媒体文件,如开机音乐,内置的通话铃声、信息铃声、闹钟铃声,可以改,但格式是OGG的,可以自己去搜索如何换格式。
usr目录
是系统的部分使用配置,包括键盘映射表什么的,没事不要改。。。
xbin目录
这个目录可以放一些工具,而且貌似官方本身在里面放了一个tcpdump,是截获网络数据包的。没试过删除它,推荐有冒险精神的可以删除之,再将结果告诉我们。

分区目录:
——system:系统分区.我们刷机器一般就是刷的这个分区.
——userdata:数据分区.
——recovery:Recovery分区,相当于建立在hboot与android系统间的一个中间层,主要用于系统调试和恢复。.
——boot:存放内核和ramdisk的分区.
——hboot:这个是SPL所在的分区,即 bootloader
——splash1:这个就是开机第一屏幕了.
——radio:这个是无线所在的分区,即基带所在分区。
——misc:其他分区

3.创建一个刷机包,update-script脚本语法说明
①简单举例:创建一个update.zip文件是很简单的事情,你所需要做的就是将文件放置到与Android文件系统中相对应的文件夹中,然后编写一个用来复制这些文件到手机对应位置的update-script, 文件。作为举例,比如安装Calculator.apk到system/app文件夹,复制libsec-ril.so文件到system/lib文件夹:新建一个空文件夹(本文例:G:\android)新建用来放置Calculator.apk的文件夹C:\android\system\app以及用来放置libsec-ril.so的文件夹G:\android\system\lib。创建用来放置update-script文件的文件夹G:\android\META-INF\com\google\android。
创建一个名为updater-script的文件,其内容如下:
1.show_progress 0.1 0
2.
3.
copy_dir PACKAGE:systemSYSTEM:
4.
5.show_progress 0.1 10
6.
行1和行5:显示进度条
行3:复制刷机包中的system文件夹到Android的/system
注意:你应该在文件的最末尾多添加一个空行(也就是行6)将C:\android压缩中的所有内容压缩为zip包(千万记住:是压缩android这个文件夹中的内容,不是android文件夹本身)为android.zip签名

②基础语法篇
1.copy_dir
语法:copy_dir <src-dir> <dst-dir> [<timestamp>]
<src-dir>表示原文件夹,<dst-dir>表示目的文件夹,[<timestamp>]表示时间戳
作用:将<src-dir>文件夹中的内容复制到<dst-dir>文件夹中。<dst-dir>文件夹中的原始内容将会保存不变,除非<src-dir>文件夹中有相同的内容,这样<dst-dir>中的内容将被覆盖
举例:copy_dir PACKAGE:system SYSTEM:(将升级包中的system文件夹复制到手机中)
2.format
语法:format <root>
<root>表示要格式化的分区
作用:格式化一个分区
举例:format SYSTEM:(将手机/system分区完全格式化)
注意:格式化之后的数据是不可以恢复的
3.delete
语法:delete <file1> [... <fileN>]
<file1> [... <fileN>]表示要格式化的文件,可以是多个文件用空格隔开
作用:删除文件1,2到n
举例:delete SYSTEM:app/Calculator.apk(删除手机systen文件夹中app中的Calculator.apk文件)
4.delete_recursive
语法:delete_recursive <file-or-dir1> [... <file-or-dirN>]
<file-or-dir1> [... <file-or-dirN>]表示要删除的文件或文件夹,可以使多个,中间用空格隔开
作用:删除文件或者目录,删除目录时会将目录中的所有内容全部删除
举例:delete_recursive DATA:dalvik-cache(删除/data/dalvik-cache文件夹下的所有内容)
5.run_program
语法:run_program <program-file> [<args> ...]
<program-file>表示要运行的程序,[<args> ...]表示运行程序所加的参数
作用:运行终端程序
举例:run_program PACKAGE:install_busybox.sh(执行升级包中的install_busybox.sh脚本)
6.set_perm
语法:set_perm <uid> <gid> <mode> <path> [...<pathN>]
<uid>表示用户名称,<gid>表示用户组名称,<mode>,表示权限模式,<path> [... <pathN>]表示文件路径,可以使多个,用空格隔开
作用:设置单个文件或目录的所有者和权限,像linux中的chmod、chown或chgrp命令一样,只是集中在了一个命令当中
举例:set_perm 0 2000 0550 SYSTEM:etc/init.goldfish.sh(设置手机system中的etc/init.goldfish.sh的用户为root,用户组为shell,所有者以及所属用户组成员可以进行读取和执行操作,其他用户无操作权限)
7.set_perm_recursive
语法:set_perm_recursive <uid> <gid> <dir-mode><file-mode> <path> [... <pathN>]
<uid>表示用户,<gid>表示用户组,<dir-mode>表示文件夹的权限,<file-mode>表示文件的权限,<path> [... <pathN>]表示文件夹的路径,可以多个,用空格分开
作用:设置文件夹及文件夹中的文件的所有者和用户组
举例:set_perm_recursive 0 0 0755 0644 SYSTEM:app(设置手机system/app文件夹及其中文件的用户为root,用户组为root,app文件夹权限为所有者可以进行读、写、执行操作,其他用户可以进行读取和执行操作,其中的文件的权限为所有者可以进行读写操作,其他用户可以进行读取操作)
rwx 对应421 R读权限 w写权限 x执行权限
5代表R+X,6代表R+W,7代表R+W+X。一般系统文件常见的权限是644。
8.show_progress
语法:show_progress <fraction> <duration>
<表示一个小部分> <表示一个小部分的持续时间>
作用:为下面进行的程序操作显示进度条,进度条会根据<duration>进行前进,当操作时间是确定的时候会更快
举例:show_progress 0.1 0(显示进度条当操作完成后前进10%)
9.symlink
语法:symlink <link-target> <link-path>
<link-target>表示链接到的目标,<link-path>表示快捷方式的路径
作用:相当于linux中的ln命令,将<link-target>在<link-path>处创建一个软链接,<link-target>的格式应为绝对路径(或许相对路径也可以),<link-path>为“根目录:路径”的形式
举例:symlink /system/bin/su SYSTEM:xbin/su(在手机中system中的xbin中建立一个/system/bin/su的快捷方式)
10.assert
语法:assert <boolexpr>
作用:此命令用来判断表达式boolexpr的正确与否,当表达式错误时程序终止执行※此作用有待验证

11.package_extract_file/dir
语法:package_extract_file(file/dir,file/dir)
作用:提取包中文件/路径
举例:package_extract_dir(“system”, “/system”);
package_extract_file(“system/bin/modelid_cfg.sh”,”/tmp/modelid_cfg.sh”);
12.write_radio_image
语法:write_radio_image<src-image>
作用:将基带部分的镜像写入手机,<src-image>表示镜像文件
举例:write_radio_imagePACKAGE:radio.img
13.write_hboot_image
语法:write_hboot_image<src-image>
作用:将系统bootloader镜像写入手机,<src-image>表示镜像位置,此命令在直到在所有的程序安装结束之后才会起作用
举例:write_hboot_imagePACKAGE:hboot.img
14.write_raw_image
语法:write_raw_image <src-image> <dest-root>
作用:将boot.img写入手机,里面包含了内核和ram盘
举例:write_raw_image PACKAGE:boot.img BOOT:

③对于根目录以及分区的定义,在Android源代码的root.c文件中定义
[table=1012,#ffffff,,1][tr][td=1,1,83] 根目录:[/td][td] Linux 块设备[/td][td=1,1,80] /挂载点/[/td][td] 文件系统[/td][td=1,1,120] 大小[/td][td] 描述[/td][/tr][tr][td=1,1,83] BOOT:[/td][td] /dev/mtdblock[?][/td][td=1,1,80] /[/td][td] (RAM)[/td][td=1,1,120] Raw[/td][td] 内核、内存盘和引导配置。[/td][/tr][tr][td=1,1,83] DATA:[/td][td] /dev/mtdblock5[/td][td=1,1,80] /data/[/td][td] yaffs2[/td][td=1,1,120] 91904kb[/td][td] 用户、系统配置,软件配置以及软件(没有a2sd的话)[/td][/tr][tr][td=1,1,83] CACHE:[/td][td] /dev/mtdblock4[/td][td=1,1,80] /cache/[/td][td] yaffs2[/td][td=1,1,120] 30720kb[/td][td] OTA缓存,recovery/更新配置及临时文件夹[/td][/tr][tr][td=1,1,83] MISC:[/td][td] /dev/mtdblock[?][/td][td=1,1,80] N/A[/td][td] [/td][td] Raw,[?]kb[/td][td=1,1,391] (等待添加)[/td][/tr][tr][td] PACKAGE:[/td][td=1,1,141] (相对于刷机包)[/td][td] N/A[/td][td] [/td][td] [/td][td=1,1,391] 刷机包的伪文件系统。[/td][/tr][tr][td] RECOVERY:[/td][td=1,1,141] /dev/mtdblock[?][/td][td] /[/td][td=1,1,78] (RAM)[/td][td] Raw,[?]kb[/td][td=1,1,391] recovery和更新环境的内核和内存盘。类似于BOOT:。[/td][/tr][tr][td] SDCARD:[/td][td=1,1,141] /dev/mmcblk0(p1)[/td][td] /sdcard/[/td][td=1,1,78] fat32[/td][td] 32MB-32GB[/td][td=1,1,391] TF卡。通常刷机包就放在这里。[/td][/tr][tr][td] SYSTEM:[/td][td=1,1,141] /dev/mtdblock3[/td][td] /system/[/td][td=1,1,78] yaffs2[/td][td] 92160kb[/td][td=1,1,391] 系统分区,静态且是只读的。[/td][/tr][tr][td] TMP:[/td][td] [/td][td=1,1,80] /tmp/[/td][td] (RAM)[/td][td=1,1,120] 标准的Linux临时文件夹[/td][td] 在关机/重启时清空。

[/td][/tr][/table]


④具体实例updater-script(刷机脚本)
show_progress(0.1, 0);
format("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system");
mount("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system", "/system");
format("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system");
package_extract_dir("system", "/system");
symlink("dumpstate", "/system/bin/dumpcrash");
symlink("toolbox", "/system/bin/cat");
symlink("toolbox", "/system/bin/chmod");
symlink("toolbox", "/system/bin/chown");
symlink("toolbox", "/system/bin/cmp");
symlink("debuggerd", "/system/bin/csview");
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/lsof");
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("mksh", "/system/bin/sh");
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/touch");
symlink("toolbox", "/system/bin/umount");
symlink("toolbox", "/system/bin/uptime");
symlink("toolbox", "/system/bin/vmstat");
symlink("toolbox", "/system/bin/watchprops");
symlink("toolbox", "/system/bin/wipe");
symlink("/system/etc/wifi/WCNSS_qcom_cfg.ini", "/system/etc/firmware/wlan/prima/WCNSS_qcom_cfg.ini");
symlink("/system/etc/wifi/WCNSS_hw_wlan_nv_3660b.bin", "/system/etc/firmware/wlan/prima/WCNSS_hw_wlan_nv_3660b.bin");
symlink("/system/etc/wifi/WCNSS_hw_wlan_nv.bin", "/system/etc/firmware/wlan/prima/WCNSS_hw_wlan_nv.bin");
symlink("toolbox", "/system/bin/chcon");
symlink("toolbox", "/system/bin/setenforce");
symlink("toolbox", "/system/bin/grep");
symlink("toolbox", "/system/bin/runcon");
symlink("toolbox", "/system/bin/touchinput");
symlink("toolbox", "/system/bin/md5");
symlink("toolbox", "/system/bin/getsebool");
symlink("toolbox", "/system/bin/setsebool");
symlink("toolbox", "/system/bin/restorecon");
symlink("toolbox", "/system/bin/getenforce");
symlink("toolbox", "/system/bin/load_policy");
symlink("toolbox", "/system/bin/cp");
symlink("toolbox", "/system/bin/playback");
symlink("toolbox", "/system/bin/du");
set_perm_recursive(0, 0, 0755, 0644, "/system");
set_perm_recursive(0, 2000, 0755, 0755, "/system/bin");
set_perm(0, 3003, 06755, "/system/bin/ip");
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_pair_devlist.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, 0644, "/system/vendor");
set_perm_recursive(0, 0, 0755, 0644, "/system/vendor/firmware");
set_perm(0, 2000, 0755, "/system/vendor/firmware");
set_perm(0, 2000, 0755, "/system/vendor/lib");
set_perm(0, 2000, 0755, "/system/vendor/lib/egl");
set_perm(0, 2000, 0755, "/system/vendor/lib/hw");
set_perm_recursive(0, 2000, 0755, 0755, "/system/xbin");
set_perm(0, 0, 06755, "/system/xbin/su");
symlink("/system/xbin/su", "/system/bin/su");
show_progress(0.1, 10);
show_progress(0.2, 0);
package_extract_file("boot.img", "/dev/block/platform/msm_sdcc.1/by-name/boot");
show_progress(0.2, 10);
unmount("/system");


在刷机过程中未停电且未断开数据线的情况下,开不了机普遍有两种可能。
①boot.img是加过密的:
就是锁了bl。各个手机制造商在做ROM的时候,以他们独自的加密算法,对整个文件进行CRC验算,然后将验算值添加到boot.img的最末尾。刷机的时候,手机的硬件BIOS就像一名尽职的士兵,对此进行验算,对不上口令的,那么对不起,请君离开,不离开我报警了~~呃,报不了警,那反正我不让你进门~~
②boot.img还有一个重要的参数:
基址 base,用于告诉手机从哪个地址开始,是准备给内存盘的入口,哪个地址是给kernel的入口。如果你对不上号,对不起,不能非法入室的。



三.刷机途中报错解决方法(参考独行无疆!)
1.刷机失败出现status 0错误:
这种错误一般是因为update-binary在你的机器上不能执行导致的,解决这个问题的办法很简单,找一个你机器能够使用的ROM包的update-binary文件,然后替换进你自己的ROM包中。此时你还需要检查updater-script脚本中format和mount函数的参数是否一致。如果不一致,你就需要参照正常的ROM包的刷机脚本来修改,全部修改为正常ROM包的刷机脚本命令。update-binary和updater-script是配套使用的,所以替换了update-binary就需要注意比对修改updater-script.
2.刷机失败出现status 6, status 7的错误:
这种错误一般是updater-script脚本的问题,包括脚本里面添加了操作某些文件的语句,但是实际上ROM包中并不存在这样的文件。常见的就是/system/etc/install-recovery.sh文件,如果你的ROM包中没这个文件而刷机脚本中却对这个文件进行了操作,那么刷机就会失败报错。所以你需要删掉脚本中这种空操作的语句。
3.assert failed错误
这个错误一般是脚本的第一行加了机型判断,把刷机脚本的第一行的assert语句删掉就行了。这个错误可能是recovery没有getprop这个命令导致的,也可能是你机型不对应导致的。


我们有着不一样的人生,却踏着相同的步伐!

[flash=235,130,1]http://www.xiami.com/widget/42980108_1771873507,_235_120_FF8719_494949_1/multiPlayer.swf[/flash]