前言
经 常看到网友问:哥几个,推荐一个好用的ROM啊?这时候我们要有信心说:自己制作的ROM才是最好的ROM。当然制作ROM并不是那么简单,但也不是难到 一般人做不了。高端的大大可以从安卓源码开始编译ROM,但也是以团队的形式,比较出名的有CM和MIUI。一般人还是只能从底包提取文件进行修改制作。 但这也不是轻易能完成的事。我写这个教程只是出于爱好,本人并非计算机专业,所以写的并不是很专业。但正因为如此,才能给大家更多的 信心,我都能简单制作,你还怕你不行?本篇教程采用一种新的模式给大家展示这个教程。将会从简单的知识普及,制作工具,步骤等说明,工程巨大,错误也不 少,但还是希望能帮助到大家。以下内容参考到的作者较多,就不一一详说了,感谢这些兄弟的奉献,让我们有一个更好的玩机空间。
关键词:java环境配置
制作工具 update-script编写美化 集成 编译反编译
一.
制作目的:
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 :相当于电脑里面的bios(基本输入输出系统),手机一开机,控制手机的就是Bootloader。我们通常所说的进入Bootloader,实际上是指进入Bootloader的工程模式,既是刷机模式,在此模式下可以将moto的sbf文件(底包)刷到机器里面。
④
Recovery : Moto
手机内置的一个独立备份恢复工具,类似电脑上的一些一键还原系统,既是在系统出现问题的时候仍然可以打开的一个模式。Moto
的 Recovery
主要提供了WIPE(硬启,清除数据,恢复出厂设置)和Update(通常用于安装升级包,update.zip)功能。
Recovery是不能直接刷新的底包的,通常它刷新的升级包(update.zip)的方式是:自动寻找SD卡上的特定文件,然后写入。
⑤
基带(Baseband):是手机中的一块专门的代码,或者可以理解成为一个专门负责通讯的BIOS,负责完成移动网络中无线信号的解调、解扰、解扩和解码工作。基带的不同会造成信号效果的不同。因为各地、各网络实际情况不同,需要大家自己选择适合自己的基带。
⑥
WIPE :wipe后就恢复了出厂设置,包括联系人、短信、安装的软件等全部删除。俗称硬启,恢复出厂设置。注意,wipe后app2sd和root权限需要重新做。而且app2sd重要的分区步骤也要重新来过。某些说法提到在刷新底包或者升级包前需要进行WIPE操作,我对此操作的必要性不是很确定。
⑦
OpenRecovery(简称OR)
:由于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权限。WIPE、刷机都有可能会造成root权限失效,需要重新root权限。
额外说明:
①
从原理上分析,通常
底包,Bootloader,Recovery,基带都是可以刷新替换的,升级包当然更可以。但是底包、Bootloader很少会有第三方开发或者修改的,一般都使用官方发布的。底包有时候会内置Bootloader、Recovery,这样的底包刷新时会连上述两者一起更新(推测结果,不确定)。更新这样的底包是有危险的,有可能会造成Bootloader损坏,这个东西损坏了,基本就是变砖了,真正的变砖,只能花钱去修了。只有这个东西没坏,就不是砖。②
我们通常所说的刷机ROM实际是升级包,升级包是对应于特定的底包制作的,所以刷机时务必确保使用的底包和升级包版本上保持一致。③
需要注意版本号的还有:Bootloader版本、基带版本、Recovery版本④
目前有些OpenRecovery工具支持底包、升级包一起从SD卡读取刷入⑤
似乎刷机前确保系统干净整洁是很重要的,很多教程提到要通过 WIPE -
刷底包的步骤来确保刷机前的干净,实际上如果底包版本没有变化,刷底包似乎、也许、大概、可能是不必要的。
2.
系统结构及文件简单剖析:
一个常见的自制ROM根目录会有以下几个文件夹及文件:
data,META-IN,system,boot.img(锁了BL的可以无视这个,但制作时需要它,打包时把它拿出来。)
系统目录说明
①应用程序安装目录
1) 系统应用程序所在目录/system/app/*.apk
2)用户安装应用程序所在目录/data/app/*.apk
3) 注意:a)在模拟器中,每重启一次,/system/app/下的应用都会被还原,有时/data/app下也会被清除
b)若在/system/app和/data/app下有重名的应用,不一定会启动哪一个,尤其是在adb
install杀死正在运行的程序时,有时旧的就会被启动
②.用户数据所在目录
/data/data/应用包名/shared_prefs配置文件
/data/data/应用包名/databases/*库文件所在目录
③. SD卡对应目录/sdcard/
而我们需要处理的只是两个文件夹里面的内容:
data/app ——该文件夹里的文件可以全删,也可以自由添加自已所需安装的应用软件,刷机安装后可以自由删除。
system/app ——在这个文件夹下的程序为系统默认的组件,可以看到都是以APK格式结尾的文件,但有些系统自带的ROM里面还有和APK文件名对应的odex文件。我们主要是针对该文件夹里的文件进行精简,如果有odex文件的,删除APK文件名时同时也删除与其对应的odex文件。虽然一般定制时只是对以上两个文件夹里的文件做相应的增减,但我们还是一起来了解system相应目录常见相应文件的用途吧。rom版本不同,里面的APK也会不一样,其它文件夹下需要改动的较少,或者不需要改动。但app文件下是制作时的重点,所以详细列出:
[url=file://system/app]\\system\\app[/url]
[url=file://system/app/AlarmClock.apk]\\system\\app\\AlarmClock.apk[/url]
闹钟
[url=file://system/app/Browser.apk]\\system\\app\\Browser.apk[/url]
浏览器
[url=file://system/app/Bugreport.apk]\\system\\app\\Bugreport.apk[/url] Bug报告
\\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\\HtcTwitter.apk
集成Twitter客户端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:数据分区.
cache:缓存分区
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文件中定义)
根目录: |
Linux 块设备 |
/挂载点/ |
文件系统 |
大小 |
描述 |
BOOT: |
/dev/mtdblock[?] |
/ |
(RAM) |
Raw |
内核、内存盘和引导配置。 |
DATA: |
/dev/mtdblock5 |
/data/ |
yaffs2 |
91904kb |
用户、系统配置,软件配置以及软件(没有a2sd的话) |
CACHE: |
/dev/mtdblock4 |
/cache/ |
yaffs2 |
30720kb |
OTA缓存,recovery/更新配置及临时文件夹 |
MISC: |
/dev/mtdblock[?] |
N/A |
Raw,[?]kb |
(等待添加) |
|
PACKAGE: |
(相对于刷机包) |
N/A |
刷机包的伪文件系统。 |
||
RECOVERY: |
/dev/mtdblock[?] |
/ |
(RAM) |
Raw,[?]kb |
recovery和更新环境的内核和内存盘。类似于BOOT:。 |
SDCARD: |
/dev/mmcblk0(p1) |
/sdcard/ |
fat32 |
32MB-32GB |
TF卡。通常刷机包就放在这里。 |
SYSTEM: |
/dev/mtdblock3 |
/system/ |
yaffs2 |
92160kb |
系统分区,静态且是只读的。 |
TMP: |
/tmp/ |
(RAM) |
标准的Linux临时文件夹 |
在关机/重启时清空。 |
④.具体实例:
1.
assert(getprop("ro.product.device")==
"swift" || getprop("ro.build.product") =="swift" ||
getprop("ro.product.board") =="swift");
2.
package_extract_file("system/bin/backuptool.sh","/tmp/backuptool.sh");
3.
set_perm(0, 0, 0777,"/tmp/backuptool.sh");
4.
run_program("/tmp/backuptool.sh","backup");
5.
show_progress(0.500000,0);
6.
format("yaffs2","MTD", "system");
7.
mount("yaffs2","MTD", "system", "/system");
8.
package_extract_dir("recovery","/system");
9.
package_extract_dir("system","/system");
10.
symlink("busybox","/system/xbin/[", "/system/xbin/[[",
11.
"/system/xbin/arp", "/system/xbin/ash","/system/xbin/awk",
12.
"/system/xbin/basename", "/system/xbin/bbconfig","/system/xbin/brctl",
13.
"/system/xbin/bunzip2","/system/xbin/bzcat", "/system/xbin/bzip2",
14.
"/system/xbin/cal", "/system/xbin/cat","/system/xbin/catv",
15.
"/system/xbin/chgrp","/system/xbin/chmod", "/system/xbin/chown",
16.
"/system/xbin/chroot","/system/xbin/cksum", "/system/xbin/clear",
17.
"/system/xbin/cmp", "/system/xbin/cp","/system/xbin/cpio",
18.
"/system/xbin/cut", "/system/xbin/date","/system/xbin/dc",
19.
"/system/xbin/dd", "/system/xbin/depmod","/system/xbin/devmem",
20.
"/system/xbin/df", "/system/xbin/diff","/system/xbin/dirname",
21.
"/system/xbin/dmesg","/system/xbin/dnsd", "/system/xbin/dos2unix",
22.
"/system/xbin/du", "/system/xbin/echo","/system/xbin/ed",
23.
"/system/xbin/egrep", "/system/xbin/env","/system/xbin/expr",
24.
"/system/xbin/false","/system/xbin/fdisk", "/system/xbin/fgrep",
25.
"/system/xbin/find", "/system/xbin/fold","/system/xbin/free",
26.
"/system/xbin/freeramdisk", "/system/xbin/fuser","/system/xbin/getopt",
27.
"/system/xbin/grep","/system/xbin/gunzip", "/system/xbin/gzip",
28.
"/system/xbin/head","/system/xbin/hexdump", "/system/xbin/id",
29.
"/system/xbin/ifconfig","/system/xbin/insmod", "/system/xbin/install",
30.
"/system/xbin/ip", "/system/xbin/kill","/system/xbin/killall",
31.
"/system/xbin/killall5","/system/xbin/length", "/system/xbin/less",
32.
"/system/xbin/ln","/system/xbin/losetup", "/system/xbin/ls",
33.
"/system/xbin/lsmod", "/system/xbin/lspci","/system/xbin/lsusb",
34.
"/system/xbin/lzop","/system/xbin/lzopcat", "/system/xbin/md5sum",
35.
"/system/xbin/mkdir","/system/xbin/mke2fs", "/system/xbin/mkfifo",
36.
"/system/xbin/mkfs.ext2","/system/xbin/mknod", "/system/xbin/mkswap",
37.
"/system/xbin/mktemp","/system/xbin/modprobe", "/system/xbin/more",
38.
"/system/xbin/mount","/system/xbin/mountpoint", "/system/xbin/mv",
39.
"/system/xbin/netstat","/system/xbin/nice", "/system/xbin/nohup",
40.
"/system/xbin/nslookup","/system/xbin/ntpd", "/system/xbin/od",
41.
"/system/xbin/patch","/system/xbin/pgrep", "/system/xbin/pidof",
42.
"/system/xbin/ping","/system/xbin/pkill", "/system/xbin/printenv",
43.
"/system/xbin/printf", "/system/xbin/ps","/system/xbin/pwd",
44.
"/system/xbin/rdev","/system/xbin/readlink", "/system/xbin/realpath",
45.
"/system/xbin/renice","/system/xbin/reset", "/system/xbin/rm",
46.
"/system/xbin/rmdir","/system/xbin/rmmod", "/system/xbin/route",
47.
"/system/xbin/run-parts","/system/xbin/sed", "/system/xbin/seq",
48.
"/system/xbin/setsid", "/system/xbin/sh","/system/xbin/sha1sum",
49.
"/system/xbin/sha256sum","/system/xbin/sha512sum",
50.
"/system/xbin/sleep", "/system/xbin/sort","/system/xbin/split",
51.
"/system/xbin/stat","/system/xbin/strings", "/system/xbin/stty",
52.
"/system/xbin/swapoff","/system/xbin/swapon", "/system/xbin/sync",
53.
"/system/xbin/sysctl","/system/xbin/tac", "/system/xbin/tail",
54.
"/system/xbin/tar", "/system/xbin/tee","/system/xbin/telnet",
55.
"/system/xbin/test", "/system/xbin/tftp","/system/xbin/time",
56.
"/system/xbin/top", "/system/xbin/touch","/system/xbin/tr",
57.
"/system/xbin/traceroute", "/system/xbin/true","/system/xbin/tty",
58.
"/system/xbin/tune2fs","/system/xbin/umount", "/system/xbin/uname",
59.
"/system/xbin/uniq","/system/xbin/unix2dos", "/system/xbin/unlzop",
60.
"/system/xbin/unzip","/system/xbin/uptime", "/system/xbin/usleep",
61.
"/system/xbin/uudecode","/system/xbin/uuencode", "/system/xbin/vi",
62.
"/system/xbin/watch", "/system/xbin/wc","/system/xbin/wget",
63.
"/system/xbin/which","/system/xbin/whoami", "/system/xbin/xargs",
64.
"/system/xbin/yes",
65.
"/system/xbin/zcat");
66.
symlink("iwmulticall","/system/xbin/iwconfig", "/system/xbin/iwgetid",
67.
"/system/xbin/iwlist","/system/xbin/iwpriv",
68.
"/system/xbin/iwspy");
69.
symlink("toolbox","/system/bin/cat", "/system/bin/cmp",
70.
"/system/bin/date", "/system/bin/dd","/system/bin/dmesg",
71.
"/system/bin/getevent","/system/bin/getprop", "/system/bin/hd",
72.
"/system/bin/id", "/system/bin/ifconfig","/system/bin/iftop",
73.
"/system/bin/insmod","/system/bin/ioctl", "/system/bin/ionice",
74.
"/system/bin/kill", "/system/bin/log","/system/bin/lsmod",
75.
"/system/bin/mkdir","/system/bin/nandread", "/system/bin/netstat",
76.
"/system/bin/newfs_msdos","/system/bin/notify", "/system/bin/printenv",
77.
"/system/bin/ps","/system/bin/reboot", "/system/bin/renice",
78.
"/system/bin/rmdir", "/system/bin/rmmod","/system/bin/route",
79.
"/system/bin/schedtop","/system/bin/sendevent",
80.
"/system/bin/setconsole","/system/bin/setprop", "/system/bin/sleep",
81.
"/system/bin/smd", "/system/bin/start","/system/bin/stop",
82.
"/system/bin/sync", "/system/bin/top","/system/bin/uptime",
83.
"/system/bin/vmstat","/system/bin/watchprops",
84.
"/system/bin/wipe");
85.
set_perm_recursive(0,0, 0755, 0644, "/system");
86.
set_perm_recursive(0,2000, 0755, 0755, "/system/bin");
87.
set_perm(0, 3003,02750, "/system/bin/netcfg");
88.
set_perm(0, 3004,02755, "/system/bin/ping");
89.
set_perm(0, 2000,06750, "/system/bin/run-as");
90.
set_perm_recursive(1002,1002, 0755, 0440, "/system/etc/bluetooth");
91.
set_perm(0, 0, 0755,"/system/etc/bluetooth");
92.
set_perm(1000, 1000,0640, "/system/etc/bluetooth/auto_pairing.conf");
93.
set_perm(3002, 3002,0444, "/system/etc/bluetooth/blacklist.conf");
94.
set_perm(1002, 1002,0440, "/system/etc/dbus.conf");
95.
set_perm(1014, 2000,0550, "/system/etc/dhcpcd/dhcpcd-run-hooks");
96.
set_perm_recursive(0,2000, 0755, 0750, "/system/etc/init.d");
97.
set_perm(0, 0, 0755,"/system/etc/init.d");
98.
set_perm(0, 2000, 0550,"/system/etc/init.goldfish.sh");
99.
set_perm(0, 0, 0544,"/system/etc/install-recovery.sh");
100.
set_perm_recursive(0,0, 0755, 0555, "/system/etc/ppp");
101.
set_perm_recursive(0,2000, 0755, 0755, "/system/xbin");
102.
set_perm(0, 0, 06755,"/system/xbin/hcitool");
103.
set_perm(0, 0, 06755,"/system/xbin/librank");
104.
set_perm(0, 0, 06755,"/system/xbin/procmem");
105.
set_perm(0, 0, 06755,"/system/xbin/procrank");
106.
set_perm(0, 0, 06755,"/system/xbin/su");
107.
set_perm(0, 0, 06755,"/system/xbin/tcpdump");
108.
show_progress(0.200000,0);
109.
show_progress(0.200000,10);
110.
package_extract_file("system/bin/backuptool.sh","/tmp/backuptool.sh");
111.
set_perm(0, 0, 0777,"/tmp/backuptool.sh");
112.
run_program("/tmp/backuptool.sh","restore");
113.
package_extract_file("system/bin/modelid_cfg.sh","/tmp/modelid_cfg.sh");
114.
set_perm(0, 0, 0777, "/tmp/modelid_cfg.sh");
115.
run_program("/tmp/modelid_cfg.sh");
116.
package_extract_file("system/bin/verify_cache_partition_size.sh","/tmp/verify_cache_partition_size.sh");
117.
set_perm(0, 0, 0777,"/tmp/verify_cache_partition_size.sh");
118.
run_program("/tmp/verify_cache_partition_size.sh");
119.
show_progress(0.200000,10);
120.
assert(package_extract_file("boot.img","/tmp/boot.img"),
121.
write_raw_image("/tmp/boot.img", "boot"),
122.
delete("/tmp/boot.img"));
123.
show_progress(0.100000,0);
124.
unmount("/system");
125.
4.BL————手机爱好者心中最大的痛
Bootloader从字面上来看就是启动加载的意思。用过电脑的都知道,windows开机时会首先加载bios,然后是系统内核,最后启动完毕。那么bootloader就相当于手机的bios,它在手机启动的时候根据基带初始化硬件,然后引导系统内核,直到系统启动。因此可以看出,bootloader很重要,如果bootloader不能正常加载,手机就是砖头一个,无法正常启动和使用。这也就是为什么bootloader被锁的手机必须要破解才能刷第三方rom。如果不破解bootloader,就无法初始化手机硬件,手机也就无法使用。
先思考一下大家为什么想要解锁bootloader?肯定都是因为想要刷各种各样的第三方rom。为什么大家想要第三方的rom呢?
一是因为官方的rom更新慢,并且官方的rom里面有各种各样运营商集成的软件。而第三方rom是根据google官方的rom源码重新打包编译的,也就是所谓的原生系统,很干净。这样很多用户都会选择第三方rom,这就损害了运营商的利益,这是摩托罗拉不愿意看到的
二是因为摩托罗拉官方的rom集成了摩托罗拉自己的BLUR服务,主要是一些社交服务,国外的facebook、twitter等,国内的人人,新浪等。相信很多人都是用不到这些的,这些人也会选择第三方rom,这也是摩托罗拉不愿意看到的。
摩 托罗拉不愿意看到上面的情况发生,但偏偏安卓系统又是开源的,必须要公布源代码,无奈的摩托罗拉只好另辟蹊径,于是就有了锁bootloader。内核开 源,但bootloader不需要开源,加密bootloader是合理的。于是摩托罗拉锁了bootloader并且给内核做了文件签名,只有签名通过 的内核才能被bootloader识别。这样一个bootloader锁诞生了。
bootloader 锁直接导致摩托罗拉的手机无法使用各种第三方的rom,于是很多国外的高手开始破解bootloader。前一段有一个传闻说bootloader被破解 了,但是被摩托罗拉官方发了律师函,于是便不了了之。这也正是摩托罗拉bootloader一直无法破解的原因,一是很难破解,二是高手们怕惹祸烧身。
现在有消息说,官方会今年晚些时候会为手机解锁bootloader,算是一个值得期待的好消息,各位摩托罗拉用户可以耐心等待一下,不用着急。
最后,送给摩托罗拉官方一句话:解锁Bootloader—摩托罗拉用户的心声
。在这个用户至上的社会,千万不要因为一点小利益而忽略了用户,这注定会失败,无论你是一个多么老多么大的品牌厂商。
在刷机过程中未停电且未断开数据线的情况下,开不了机普遍有两种可能。
①
boot.img是加过密的。就是锁了bl。各个手机制造商在做ROM的时候,以他们独自的加密算法,对整个文件进行CRC验算,然后将验算值添加到boot.img的最末尾。刷机的时候,手机的硬件BIOS就像一名尽职的士兵,对此进行验算,对不上口令的,那么对不起,请君离开,不离开我报警了~~呃,报不了警,那反正我不让你进门~~
②
boot.img还有一个重要的参数,基址 base,用于告诉手机从哪个地址开始,是准备给内存盘的入口,哪个地址是给kernel的入口。如果你对不上号,对不起,不能非法入室的。
5.摩托常见刷机方法:
例如:Milestone2系统备份+恢复+ZIP格式的刷机包+镜像文件刷机包的方法,非常适合经常刷机,DIY刷机包的童鞋们使用。先备份好系统后,不管你把ROM弄得怎么个乱,怎么个精减。出问题了直接恢复备份好的系统就是你完美的包包了。省去你重新刷机,重新精减,重装软件的麻烦事情。
①备份Milestone2系统的方法:
Milestone2必须要ROOT过,获得权限。
a.按装恢复模式工具Droid2Boot 3.0 中文版 Droid2bootstrap3.0.apk (2.34 MB)
b.运行复模式工具-----选择-----引导恢复模式-----出现权限---选择---允许---确定----然后选择---重启到恢复模式
c.选择----backup and restore(备份和恢复)
d.
选择---backup(备份)---接下来软件自动备份开始,时间需要几分钟左右。
e.
备份结束后,选择---reboot system now----手机重启
f.
完整的Milestone2系统备份保存在:内存卡----clockworkmod文件夹----backup文件夹----备份时间文件夹----备份好的系统-----备份容量大小500多M.
从另一个角度考虑,这也是提取system.img的一种办法。
Milestone2系统备份还原的方法:
a.运行复模式工具-----选择-----引导恢复模式-----出现权限---选择---允许---确定----然后选择---重启到恢复模式
b. 选择----backup and restore(备份和恢复)
c.
选择----Recovery(恢复备份的系统)
d. 软件将会从:内存卡----clockworkmod文件夹----backup文件夹----备份时间文件夹----备份好的系统,来恢复你曾经备份过的系统。
e. 恢复备份完成。重启手机。这样你完整的Milestone2系统又回来了。
镜像文件的刷机包,刷机方法:
只要把下载好的镜像文件刷机包放入到----内存卡-----clockworkmod文件夹------backup文件夹------镜像刷机文件夹(文件名只能用英文,不能有空格哦)照着上面的恢复备份方法就可以刷镜像文件的刷机包了。
ZIP格式刷机包,刷机方法:
a.把下载好的ZIP格式的刷机包存放到放到内存卡根目录里
b.选择-----重启到恢复模式,手机重启
c.
选择install zip from sdcard-----------在选择--------choose
zip from sdcard
d.找到你存放在内存卡里的ZIP升级包------选择YES-------然后系统开始刷写入手机
e.
刷写完成后,按电源键返回------选择reboot
system now,手机重启,刷机完成
删除恢复模式的方法:
a:先删除恢复模式工具
b:用RootExplorer进入/system/bin/
c:点右上角,切换为读写状
d:删除文件hijack,删除文件logwrapper,把文件logwrapper.bin改名为logwrapper
e:点击右上角按钮,切换回只读状态
f:重启手机就OK啦
三、制作工具
1.jdk1.7.0:(115网盘)
安装,配置jdk1.7.0:
执行jdk安装程序,自定义路径,我的安装路径为:C:\ProgramFiles\Java\jdk1.7.0(根据个人的具体路径)
配置jdk:配置环境变量:
Win7下为:计算机->属性->高级系统设置->环境变量->系统变量中添加以下环境变量:
JAVA_HOME= C:\Program Files\Java\jdk1.7.0(根据自己的路径修改)
CLASSPATH=
.;C:\Program Files\Java\jdk1.7.0\lib\tools.jar;C:\Program Files\Java\jdk1.7.0\lib\dt.jar
path= C:\Program Files\Java\jdk1.7.0\bin;
写一个简单的java程序来测试jdk是否已安装成功:
public class hello
{
public static void main(String args[])
{
System.out.println("Hello");
}
}
将程序保存为文件名为hello.java的文件。
打开命令提示符窗口,进入到hello.java所在目录,键入下面的命令
javac hello.java
java hello
此时若打出来hello则安装成功,若没有打印出这句话,仔细检查以上配置是否正确。
注意系统文件夹选项中应确定“隐藏已知文件类型的扩展名”不勾选。
2.apktool工具箱(115网盘)
可以解压放到你的cmd默认目录下,这样就不用每次都那么麻烦进入工具:
比如我的默认目录为C:\Users\users,我就把解压出来的所有文件包括:aapt.exe,apktool.bat,apktool.jar放到这个文件夹下,具体的应用自己解决。
简单应用举例:主要是在美化时用到。
①
apktoold "C:\framework-res.apk" "C:\framework”
命令行解释:apktool d 要反编译的文件输出文件夹
我们可以看到一个叫做res的目录,打开后看到一堆目录,所有的程序界面资源就放在这个res目录里面,我们这里简单的介绍一下这些目录对应的作用。
drawable,这个目录是放程序需要用到的图标以及各种图片的
layout-land,这个目录是放竖版界面的xml描述文件的
layout-port,这个目录是放横版界面的xml描述文件的
menu,这个顾名思义,就是放菜单布局的xml描述文件的
values,这个目录是汉化重头戏,绝大部分需要汉化的字符串资源定义就在这里面
xml,其他不再详细分类的布局xml描述文件
一个写的很规范的Android程序,会把整个程序里面所用到的字符串资源都分离出来,放在values的strings.xml文件里面,而放在values目录的,基本上就是英文字符串资源。而一般的程序在处理字符串资源上都是交给Android系统去判断是什么环境,从而自己选择语言的
②
apktool b"C:\framework"
命令行解释:apktool b 要打包内容所在文件夹
3.UltraEdit:用于编写代码的好软件.(在115网盘)
4.核心软件:厨房(115网盘)
①为厨房安装 Cygwin 的步骤
1) 1) 解压下载到的压缩包(比如解压到C盘,解压出来的东西包括:包的文件夹c:\cygwin_packages、安装程序c:\setup.exe、文档c:\安装说明.txt),记得路径中不要带中文,最好也不要带空格。
2)
运行 Setup.exe,
然后点击 Next
(下一步)。
3) 选择"Install from Local Directory,"
4) 接下来,指定根目录。也就是你想要安装 Cygwin 的位置(但不能是本压缩包解压出来的 cygwin_packages 文件夹)。如果你喜欢,可以是 C:\Cygwin,注意要确定文件夹名种没有空格。
5) 然后,要指定的Local Package Directory 必须指定为 cygwin_packages 文件夹所在路径,例如 C:\cygwin_packages假如跳出了一个警告对话框,点击确定(是)。
6) 当安装程序显示出所有的包名时,点击更改上方的 "All <-> Default" 为"All <-> Install" (需要点击那个箭头)
7) 然后点击 Next,安装程序就会为你安装好 android Kitchen 需要 Cygwin 提供的一切支持
8) 最后,点击桌面上的Cygwin 快捷方式以便为你创建 home 文件夹。搞定!
本 Cygwin 安装包中包含了以下的包,这些都是厨房正常工作所需要的:* Devel /gcc * Interpreters / perl
* Utils / cpio
* Utils / util-linux* Utils / ncurses *Archive / zip* Archive / unzip * Web / wget
②如何开始使用ROM组专用定制工具:
1) 完成上面的步骤后,将下载到ROM组专用定制工具解压到G:\Cygwin\home\Administrator文件夹中(这里假设你的Cygwin是安装在C盘根目录下,而且你电脑的用户名为Administrator。具体请根据各自的设置进行变通)。
2) 点击桌面上的 Cygwin
快捷方式
3) 执行命令:cd android_Kitchen
4) 执行命令:./menu
OK,剩下的事情就靠你自己自由发挥了。
PS:一个小技巧,使用用文本编辑器(例如EmEditor,不建议使用系统自带的记事本程序)打开C:\Cygwin\home\Administrator\.bashrc,在最后面添加以下两行。
cd android_Kitchen/
./menu
这样做的好处是,一旦你点击了桌面上的 Cygwin
快捷方式,就会直接进入厨房界面了。
5.ROM提取工具
HTC:本人没有用过HTC的手机,这只是网上找的一篇文章以作参考,具体的还请自己尝试吧。
第一步:下载官方RUU刷机程序(EXE文件)
第二步:运行您已经下载的RUU刷机程序RUU_Legend_hTC_Asia_TW_1.31.709.2_Radio_47.26.35.04_7.05.35.26L_release_122023_signed)
第三步:打开用户临时文件目录:
以xp为例:C:\Documentsand Settings\Administrator\Local Settings\Temp(系统默认,Administrator为您登录xp的用户名,如果您修改了用户变量,则到您修改的目录,例如我的是:D:\Temp\Temp)
第三步:查找类似 {2EA82A29-B9B5-4A60-BB4F-B52F1BCD2E68}
(每次打开都不同,建议查看文件夹创建时间就知道)的文件夹并打开
第四步:进入刚刚打开的刷机临时目录,打开该目录下的唯一文件夹。(例如我的是:{50F2F878-636A-496F-A7CB-544C067E0C4B})
第五步:复制该文件夹下的 Rom.zip
压缩文件,该文件即为官方原版ROM,该文件大小:135173407字节(以RUU_Legend_hTC_Asia_TW_1.31.709.2_Radio_47.26.35.04_7.05.35.26L_release_122023_signed
版本为例);该 ROM 包含以下:
文件列表 |
文件大小 |
文件说明 |
其他说明 |
android-info.txt |
85 字节 |
ROM版本及刷写配置信息 |
|
boot.img |
2342912 字节 |
手机启动的必要系统(Linux内核) |
Linux内核 |
hboot_7227_0.43.0001_100218.nb0 |
524288 字节 |
bootloader |
需要金卡就是因为这个东西吧?刷错一定变砖 |
radio.img |
24379392 字节 |
无线通讯模块(包括电话、WIFI、蓝牙) |
最新的不一定是最好的。要和hboot匹配? |
rcdata.img |
41 字节 |
脚本资源 |
刷机时使用的脚本 |
recovery.img |
3532800 字节 |
刷写 Recovery 模式(包含硬件底层驱动) |
恢复出厂设置、OTA升级补丁升级、Firmware升级 |
splash1.nb0 |
393216 字节 |
开机第一屏 |
替换此文件可以修改开机第一屏 |
system.img |
224364096 字节 |
系统核心(应该是主要修改此文件) |
我们主要定制此部分的 |
userdata.img |
2112 字节 |
用户的设置 |
看起来应该是初始化用户数据 |
至此,已获得官方 RUU 原版ROM
根据我的理解,boot.img radio.img recovery.img splash1.nb0system.img 应该可以单刷的,我们定制 rom 主要修改 system.img。
首先运行要提取的官方RUU程序,本教程中就是RUU_Buzz_Froyo_HTC_WWE_2.22.405.1_Radio_13.55.55.24H_3.35.20.10_release_160191_signed.exe。这个时候手机无需连接上电脑(连接与否和提取没有关系),等待exe执行到出现第一个提示界面。运行任务管理器,点“进程”标签,找到adb.exe,在其上右键,选择“打开所在目录”。将打开的目录中的rom.zip复制出来,然后可以关闭官方RUU程序了。提取完成。
摩托: 解底包工具.rar (610.63 KB)
①
运行解SBF包工具MotoAndroidDepacker.exe程序
②
选择Open From File,找到你存放的SBF刷机包
③
选择Split To Folder,进行刷机包拆解过程
④
拆解完成,关闭软件,得到如下文件。
一般来说需要修改CG35.smg----boot.img,CG39.smg-----system.img, CG45.smg----radio.img,锁了bl的只需CG39.smg和CG45.img(如果需要切换基带)
如下是一个典型SBF
文件
拆开之后的构成(uk3.4.3)
每个smg本身都有签名,
不签名不能刷,
多半都有自己的版本号
CG31.smg 18,432 版本 4
CG31/CDT是描述各文件版本号的,
相当于注释文件
CG32.smg 133,120 版本 1
CG33.smg 14,419,968 版本 1
CG33/CDROM是个ISO文件,
可以用WinRAR之类的打开,
包含PC端程序(MotoHelperAgent)
CG34.smg 18,432 版本 1
/usr/data_resource,CG34应该说是皮肤铃声包,一些软件的信息和收藏夹的设置在这里面
CG35.smg 8,388,608
版本 2
CG35/Boot包含了
系统
内核<-8.3MB的boot-only就是这个
/ezx_user
CG39.smg 342,624,256 版本 4
CG39/system分区
就是恢复包中
的 system.img
CG40.smg
cache缓存分区(国行多余的部分),
显然里面什么都没有
CG42.smg 262,144
CG45.smg 3,147,776 版本 0
CG45/Baseband基带固件
CG47.smg 8,388,608 版本 2
CG47/Recovery就是
官方
恢复,
里面也包含独立的内核,
但不用于启动
CG53.smg 2,048
CG61.smg 524,288 版本 1
CG61/devtree包含设备描述符
CG64.smg 18,432 版本 1
CG65.smg 18,432 版本 1
RAMDLD.smg 315,392
RAMDLD/RamDisk&tmpfs, Android/Linux启动初始化的一部分,
不涉及具体设备
每次不可降级的升级中CG31和CG39版本都会升高
(2.21/国行=2,2.51=3,
3.4.x=4)
而国行1.11和uk3.4.3-3不同的文件(md5值校验)如下
而CG39就是个EXT3的文件系统镜像,
其内容和镜像版的system.img(yaffs2文件系统)完全一致,
可以直接从CG39创建system.img
此时,你可以把CG39.smg重新命名为system.img(可能有些小问题,或者进一步提取)
⑤运行yaffs2img浏览器20.exe程序
⑥
选择
打开
选择
CG39.smg 点击
打开
⑦
接下来,你可以选择
全部导出
也可以只提取你想要了文件就OK了
⑧
接下来把你提取出来的东西放到厨房工作文件夹下,也可开始制作。
工具打包下载:http://u.115.com/file/cl74ytbo#
手机开发.rar
四、制作步骤:
1.
解压待修改ROM。
将system.img和boot.img解压出来,如果需要在刷机时同时刷入radio.img,则把radio.img也解压出来。将文件(如果是修改其他制作者的ROM,文件则为*.zip,比如buzz_2.2_1.2-Beta2_android.zip)放到以下文件夹中(根据个人安装的位置决定,不再累述):G:\Cygwin\home\<用户名>\android_Kitchen\original_update
支持的格式如图:
2.修改ROM。
①运行厨房。双击执行桌面上的Cygwin快捷方式(也可以双击执行C:\Cygwin\Cygwin.bat),输入命令:
01. cd android_Kitchen
02.
./menu
至此,厨房已成功运行。
接下来就开始你的制作之旅吧。
②
解压待修改的ROM。选择厨房的第1项“1
- 分解 ROM
包到工作目录中”,然后根据情况的不同,选择对应的ROM。解压得到的文件位于以下文件夹中:C:\Cygwin\home\<用户名>\android_Kitchen\WORKING_<日期>_<时间>
只支持如上几种格式的原文件。
③
添加常用功能支持。厨房提供了多种常用的功能,请根据个人的喜好进行选选择。此步不做具体解释,厨房中每个功能基本都有相应的解释,请仔细查看。
④
去除不需要的apk。如果想要精简掉ROM中的某个不需要的软件,则删除对应的apk(如有同名的odex文件,也将其删除)即可。譬如,我要去掉YouTube,则删除YouTube.apk,又想要去掉世界时钟,则删除了WorldClock.apk和WorldClock.odex。
⑤
集成apk。进入工作目录文件夹,再进入data\app目录,看这里是否有你所需的程序,不需要的请删除。你还可以添加你需要的默认安装软件。进入工作目录文件夹,再进入system\app删除你不想要的组件、或是添加你需要的组件。由于有一些组件与其它组件是有依赖的,所以删除时请注意。但也不要怕,如果你删除的组件不对,刷机时最多是无法进入系统,你用完整ROM重新刷一次既可。一般不会变成砖的。注意文件名不能有中文,也不要有空格。同时,避免出现特殊字符。集成输入法等带有so库的apk程序。以搜狗输入法为例。需要在将apk放置到/system/app的同时将包中的so库提取出来,放至/system/lib文件夹中(不要对原apk做修改,仅提取)。删除、添加软件完毕,接下来就可进行deodex等操作。
⑥
关于美化的话也是一个很长的问题,推荐有点英文基础的同学到http://uot.dakra.lt/去定制一个,参考教程:http://bbs.gfan.com/viewthread.php?tid=1991363&extra=&page=1
或者自己手动做一个也行:
参考我的另一个帖子吧,虽然写的不是很好。
http://bbs.gfan.com/viewthread.php?tid=1720417&page=1&extra=#pid30778663
修改完以后,替换/system/framework/文件夹下的framework-res.apk文件等
⑦
集成apn自动设置。将附件apns-conf.rar解压,覆盖/system/etc下的同名文件即可。apns-conf
apns-conf.rar
(16.44 KB)
⑧
修改开机动画。开机动画即为bootanimation.zip,具体位置在/system/customize/resource文件夹中。
⑨
默认中文。修改三个文件:1、/system/build.prop;2、/system/customize/CID/default.xml;3、/system/customize/MNS/default.xml
1)、修改ro.product.locale.language和ro.product.locale.region。(此处修改的是系统的默认显示语言)
1.
ro.product.locale.language=zh
2.
ro.product.locale.region=CN
2)、修改以下代码。这里我仅保留了简繁体和英文。(此处修改的是可供选择的语言)
1.
<modulename="locale">
2.
<function>
3.
<set name="single">
4.
<item
name="total_list">en_AT;en_CH;en_DE;en_ES;en_FR;en_GB;en_GR;en_IT;en_NL;en_PT;en_RU;en_NO;en_DK;en_SE;en_FI;en_CZ;en_PL;en_RO;en_HU;en_SK;en_ZA;en_IL;en_IE;en_LV;en_EE;en_LT;en_LU;en_UA;fr_AT;fr_CH;fr_DE;fr_ES;fr_FR;fr_GB;fr_IE;fr_NL;fr_PT;fr_ZA;fr_IT;fr_IL;fr_LU;it_AT;it_CH;it_DE;it_GB;it_IE;it_IT;it_IL;es_ES;es_GB;es_IE;es_IL;es_PT;nl_NL;nl_LU;de_AT;de_CH;de_DE;de_ES;de_NL;de_IT;de_LU;de_PT;el_GR;pt_ES;pt_PT;pt_ZA;nb_NO;nb_DK;nb_SE;nb_FI;da_NO;da_DK;da_SE;da_FI;sv_NO;sv_DK;sv_SE;sv_FI;cs_CZ;cs_PL;cs_RO;cs_HU;cs_SK;cs_LV;cs_EE;cs_LT;pl_CZ;pl_PL;pl_RO;pl_HU;pl_SK;pl_LV;pl_EE;pl_LT;ru_CZ;ru_PL;ru_RO;ru_HU;ru_SK;ru_RU;ru_LV;ru_EE;ru_LT;ru_UA;fi_DK;fi_FI;fi_NO;fi_SE;</item>
5.
<item type="boolean"name="en_AT">yes</item>
6.
<item type="boolean"name="en_CH">yes</item>
7.
<item type="boolean"name="en_DE">yes</item>
8.
<item type="boolean"name="en_ES">yes</item>
9.
<item type="boolean"name="en_FR">yes</item>
10.
<item type="boolean"name="en_GB">yes</item>
11.
...
12.
</set>
13.
</function>
14.
</module>
修改为:
1.
<modulename="locale">
2.
<function>
3.
<set name="single">
4.
<item name="total_list">en_GB;zh_CN;zh_TW;</item>
5.
<item type="boolean"name="en_GB">yes</item>
6.
<item type="boolean"name="zh_CN">yes</item>
7.
<item type="boolean" name="zh_TW">yes</item>
8.
</set>
9.
</function>
10.
</module>
3)、修改以下代码。(此处修改的是默认选中的语言)
1.
<modulename="defaultLocale">
2.
<function>
3.
<set name="single">
4.
<item name="auto_detect">false</item>
5.
<item name="defeault">en_GB</item>
6.
</set>
7.
</function>
8.
</module>
修改为(简体中文):
1.
<modulename="defaultLocale">
2.
<function>
3.
<set name="single">
4.
<item name="auto_detect">false</item>
5.
<item name="defeault">zh_CN</item>
6.
</set>
7.
</function>
8.
</module>
⑩
默认时区。在/system/default.prop中修改persist.sys.timezone(如果没有该项,则手动添加)的值为Asia/Shanghai(即东八区),即
persist.sys.timezone=Asia/Shanghai
注:如果没有/system/default.prop,也可以在/system/build.prop中修改或添加。
⑾锁了bl的同学,在修改时注意看运行时的语句,凡是涉及到的功能修改了boot.img,你就趁早删了update-script相关语句重来吧,不然也不会出什么大事,就是手机卡在第一屏进不去,或者一直进入恢复模式。解决办法如果你先前备份了,那就还原一下。如果没备份,重刷底包吧。
⑿接下来就是打包签名,按照提示一步一步来就OK了。
五、制作结果与讨论:
制作过程是一个需要很多次重新备份或刷机的过程,难点在于update-script的编写,你必须保证每一句都是对的,不涉及boot.img的语句少一些,一般也就几十句,或更少,完整的ROM估计在一两百句之间,虽然厨房会帮你编写部分语句,但你还得自己打开来再看一遍,修改添加删除一些语句,只要其中一句是错的,你就刷机或者恢复重新再来吧。比如你语句中要添加一个软件,但包里没有这个软件,这也算错误语句,也一样要悲剧。新的脚本updater-script不知解决了这个问题没有。反正旧的脚本是不行的。
教程基本就到这,本人手机是摩托的,所以更侧重于摩托的制作过程,其它手机也可做一个参考。都是安卓嘛,肯定有想通的地方。当然还有很多是不完整或错误的,也还有一些没有说得清楚,争取在以后的学习中慢慢修正。谢谢大家的观看,很长,你们也辛苦了。
原文链接:http://bbs.gfan.com/android-2116558-1-1.html