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文件下是制作时的重点,所以详细列出:
\\system\\app
\\system\\app\\AlarmClock.apk
闹钟
\\system\\app\\Browser.apk
浏览器
\\system\\app\\Bugreport.apk 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\\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:数据分区.
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
作用:将
举例:copy_dir PACKAGE:system SYSTEM:(将升级包中的system文件夹复制到手机中)
2.format
语法:format
作用:格式化一个分区
举例:format SYSTEM:(将手机/system分区完全格式化)
注意:格式化之后的数据是不可以恢复的
3.delete
语法:delete
作用:删除文件1,2到n
举例:delete SYSTEM:app/Calculator.apk(删除手机systen文件夹中app中的Calculator.apk文件)
4.delete_recursive
语法:delete_recursive
作用:删除文件或者目录,删除目录时会将目录中的所有内容全部删除
举例:delete_recursive DATA:dalvik-cache(删除/data/dalvik-cache文件夹下的所有内容)
5.run_program
语法:run_program
作用:运行终端程序
举例:run_program PACKAGE:install_busybox.sh(执行升级包中的install_busybox.sh脚本)
6.set_perm
语法:set_perm
作用:设置单个文件或目录的所有者和权限,像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
作用:设置文件夹及文件夹中的文件的所有者和用户组
举例: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
<表示一个小部分> <表示一个小部分的持续时间>
作用:为下面进行的程序操作显示进度条,进度条会根据
举例:show_progress 0.1 0(显示进度条当操作完成后前进10%)
9.symlink
语法:symlink
作用:相当于linux中的ln命令,将
举例:symlink /system/bin/su SYSTEM:xbin/su(在手机中system中的xbin中建立一个/system/bin/su的快捷方式)
10.assert
语法:assert
作用:此命令用来判断表达式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
作用:将基带部分的镜像写入手机,
举例:write_radio_imagePACKAGE:radio.img
13.write_hboot_image
语法:write_hboot_image
作用:将系统bootloader镜像写入手机,
举例:write_hboot_imagePACKAGE:hboot.img
14.write_raw_image语法:write_raw_image
作用:将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/ r oute",
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/trace r oute", "/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/ r oute",
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");
4.BL
Bootloader从字面上来看就是启动加载的意思。用过电脑的都知道,windows开机时会首先加载bios,然后是系统内核,最后启动完毕。那么bootloader就相当于手机的bios,它在手机启动的时候根据基带初始化硬件,然后引导系统内核,直到系统启动。因此可以看出,bootloader很重要,如果bootloader不能正常加载,手机就是砖头一个,无**常启动和使用。这也就是为什么bootloader被锁的手机必须要XX才能刷第三方rom。如果不XXbootloader,就无法初始化手机硬件,手机也就无法使用。
先思考一下大家为什么想要解锁bootloader?肯定都是因为想要刷各种各样的第三方rom。为什么大家想要第三方的rom呢?
一是因为官方的rom更新慢,并且官方的rom里面有各种各样运营商集成的软件。而第三方rom是根据google官方的rom源码重新打包编译的,也就是所谓的原生系统,很干净。这样很多用户都会选择第三方rom,这就损害了运营商的利益,这是摩托罗拉不愿意看到的
二是因为摩托罗拉官方的rom集成了摩托罗拉自己的BLUR服务,主要是一些社交服务,国外的facebook、**等,国内的人人,新浪等。相信很多人都是用不到这些的,这些人也会选择第三方rom,这也是摩托罗拉不愿意看到的。
摩托罗拉不愿意看到上面的情况发生,但偏偏安卓系统又是开源的,必须要公布源代码,无奈的摩托罗拉只好另辟蹊径,于是就有了锁bootloader。内核开源,但bootloader不需要开源,加密bootloader是合理的。于是摩托罗拉锁了bootloader并且给内核做了文件签名,只有签名通过的内核才能被bootloader识别。这样一个bootloader锁诞生了。
bootloader锁直接导致摩托罗拉的手机无法使用各种第三方的rom,于是很多国外的高手开始XXbootloader。前一段有一个传闻说bootloader被XX了,但是被摩托罗拉官方发了律师函,于是便不了了之。这也正是摩托罗拉bootloader一直无法XX的原因,一是很难XX,二是高手们怕惹祸烧身。
现在有消息说,官方会今年晚些时候会为手机解锁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.
5.jpg
从另一个角度考虑,这也是提取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
安装,配置jdk1.7.0:
执行jdk安装程序,自定义路径,我的安装路径为:C:\ProgramFiles\Java\jdk1.7.0(根据个人的具体路径)
配置jdk:配置环境变量:
Win7下为:计算机->属性->高级系统设置->环境变量->系统变量中添加以下环境变量:
环境变量配置1_2011-07-22_21-28-50.png
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工具箱
可以解压放到你的cmd默认目录下,这样就不用每次都那么麻烦进入工具:
2_2011-07-22_22-30-44.png
比如我的默认目录为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:用于编写代码的好软件.
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。
3)、修改以下代码。(此处修改的是默认选中的语言)
1.
2.
3.
4.
5.
6.
7.
8.
修改为(简体中文):
1.
2.
3.
4.
5.
6.
7.
8.
⑩默认时区。在/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不知解决了这个问题没有。反正旧的脚本是不行的。
over