文章转载自:http://bbs.xiaomi.cn/t-13336185
作者斯文是我
关键词:java环境配置
制作工具 update-编写美化 集成 编译反编译
一.
制作目的:
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,-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-脚本语法说明
①简单举例:创建一个update.zip文件是很简单的事情,你所需要做的就是将文件放置到与Android文件系统中相对应的文件夹中,然后编写一个用来复制这些文件到手机对应位置的update-, 文件。作为举例,比如安装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-文件的文件夹G:\android\-INF\com\google\android。
创建一个名为updater-的文件,其内容如下:
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
⑩
默认时区。在/system/default.prop中修改persist.sys.timezone(如果没有该项,则手动添加)的值为Asia/Shanghai(即东八区),即
persist.sys.timezone=Asia/Shanghai
注:如果没有/system/default.prop,也可以在/system/build.prop中修改或添加。
⑾锁了bl的同学,在修改时注意看运行时的语句,凡是涉及到的功能修改了boot.img,你就趁早删了update-相关语句重来吧,不然也不会出什么大事,就是手机卡在第一屏进不去,或者一直进入恢复模式。解决办法如果你先前备份了,那就还原一下。如果没备份,重刷底包吧。
⑿接下来就是打包签名,按照提示一步一步来就OK了。