本章主要內(nèi)容
Android是Google公司推出的一款手機(jī)開發(fā)平臺(tái)。該平臺(tái)本身是基于Linux內(nèi)核的,圖1-1展示了這個(gè)系統(tǒng)的架構(gòu):
http://wiki.jikexueyuan.com/project/deep-android-v1/images/chapter1/001.png" alt="image" />
圖1-1? Android系統(tǒng)架構(gòu)
從上圖中可以看出,Android系統(tǒng)大體可分為四層,從下往上依次是:
從上面的介紹可看出,Android最大的特點(diǎn)之一,恐怕就是搭建了一個(gè)被廣大Java開發(fā)者熱捧的Java世界了。但該世界并不是空中樓閣,它的運(yùn)轉(zhuǎn)依賴另一個(gè)被Google極力隱藏的Native世界。兩個(gè)世界的交互關(guān)系可用圖1-2來表示:
http://wiki.jikexueyuan.com/project/deep-android-v1/images/chapter1/002.png" alt="image" />
圖1-2? Java世界和Native世界交互
從上圖可知:
本書所分析的模塊也將遵循Android系統(tǒng)架構(gòu),如圖1-3所示:
http://wiki.jikexueyuan.com/project/deep-android-v1/images/chapter1/003.png" alt="image" />
圖1-3? 本書的架構(gòu)圖
從上圖可知,本書所分析的各個(gè)模塊除未涉及Kernel外,其他三層均有所涉足,它們分別是:
?
本節(jié),將介紹如何搭建Android源碼開發(fā)環(huán)境。
首先,需要一個(gè)Linux系統(tǒng),我本人推薦安裝Ubuntu10.04(32位版本)。讀者可從網(wǎng)上下載該版本的系統(tǒng)。Windows用戶可使用VMWare或VirtualBox作為虛擬機(jī),來安裝Ubuntu10.04。我本人推薦VMWare,因?yàn)樗墓δ芴珡?qiáng)大了!
如果要使用VMWare,那么在安裝完Ubuntu之后,一定要把VMWare Tools也安裝上,因?yàn)檫@個(gè)工具會(huì)提供很多非常實(shí)用的功能。這里還有一個(gè)小建議,如果Linux系統(tǒng)只是個(gè)人使用,則建議用root賬戶登錄系統(tǒng)。在工作中,曾發(fā)現(xiàn)很多用非root賬戶登錄的同事整天都在sudo,輸入密碼,這樣做就浪費(fèi)了不少零碎的時(shí)間片。
假設(shè)讀者已經(jīng)安裝好了Ubuntu 10.04(32位版本),并且以root賬戶登錄到系統(tǒng)上了,接下來的工作是:
Android源碼采用Git①做版本管理工具,這個(gè)工具由Linux之父LinusTorvalds采用純C開發(fā)。關(guān)于Git為什么使用C語(yǔ)言開發(fā)的問題,還引發(fā)了一場(chǎng)關(guān)于C和C++孰好孰壞的大討論,不過Linus Torvalds顯然沒樹起“居廟堂之高,則憂其民”的形象。對(duì)于普通碼農(nóng)而言,用最合適的工具、最實(shí)用的辦法來完成好工作才是最重要的。所以C、C++、Java、Python等都僅僅是工具而已。
下面介紹如何下載源碼。
下載Android源碼前,有些下載工具需要從Ubuntu軟件源上下載。可以為Ubuntu系統(tǒng)指定一個(gè)軟件源。有些軟件源上有這些工具,有些卻沒有,而且各個(gè)軟件源的下載速度也不同,所以應(yīng)首先找到一個(gè)合適的軟件源。Ubuntu軟件源的設(shè)置界面如圖1-4所示:

圖1-4? Ubuntu軟件源設(shè)置
從上圖中可發(fā)現(xiàn),將軟件源地址設(shè)置成了http://mirror.bjtu.edu.cn/ubuntu。每個(gè)人可根據(jù)自己的情況選擇合適的軟件源。
下面開始下載Android源碼,工序比較簡(jiǎn)單,可一氣呵成。
下載完后,該目錄中的內(nèi)容如圖1-5所示:

圖1-5? 源碼下載結(jié)果
注意,Kernel的代碼必須要單獨(dú)下載,下載方法如下:
git clone git://android.git.kernel.org/kernel/common.gitkernel
Froyo的編譯依賴JDK1.5,所以首先要做的就是下載JDK1.5。下載網(wǎng)址是http://www.oracle.com/technetwork/java/javase/downloads/index-jdk5-jsp-142662.html。下載得到的文件為jdk-1_5_0_22-linux-i586.bin。把它放到一個(gè)目錄中,比如我本人,就將它放在了/develop中,然后在這個(gè)目錄中執(zhí)行:
./jdk-1_5_0_22-linux-i586.bin? #執(zhí)行這個(gè)文件
這個(gè)命令其實(shí)就是解壓,解壓后的結(jié)果在/develop/jdk1.5.0_22目錄中?,F(xiàn)有了JDK,再按照下面的步驟部署它即可:
exportJAVA_HOME=/develop/jdk1.5.0_22 #設(shè)置為剛才解壓的目錄
exportJRE_HOME=JAVA_HOME/jre
exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
Android的編譯有自己的一套規(guī)則,主要利用的就是mk文件。網(wǎng)上有太多關(guān)于它的解說了,這里不再贅述,只簡(jiǎn)單介紹其編譯工序:
進(jìn)入源碼目錄(以我的開發(fā)環(huán)境為例),也就是 cd /develop/download_froyo
執(zhí)行完上面幾個(gè)步驟后,就可以編譯系統(tǒng)了。Android平臺(tái)提供了三個(gè)命令用于編譯,它們分別是make、mmm和mm,這三個(gè)命令的使用方法及其優(yōu)劣如下:
從使用的角度來看,我本人有如下建議:
一般的編譯方式都使用增量編譯,即只編譯發(fā)生變化的目標(biāo)文件。但有時(shí)則需重新編譯所有目標(biāo)文件,那么就可使用make命令的-B選項(xiàng)。例如 make –B 模塊名,或者mm –B、mmm –B 。mm和mmm內(nèi)部,也是調(diào)用make命令的,而make的-B選項(xiàng)將強(qiáng)制編譯所有目標(biāo)文件。
Android的編譯工序比較簡(jiǎn)單,難點(diǎn)主要在Android.mk文件的編寫。讀者可上網(wǎng)搜索與此相關(guān)的學(xué)習(xí)資料。
本書各模塊的編譯目標(biāo)如表1-1所示,這里僅列出幾個(gè)有代表性的模塊:
表1-1? 本書各模塊編譯目標(biāo)
|
目標(biāo)模塊 |
make命令 |
mmm命令 |
|
init |
make init |
mmm system/core/init |
|
zygote |
make app_process |
mmm frameworks/base/cmds/app_process |
|
system_server |
make services |
mmm frameworks/base/services/java |
|
RefBase等 |
make libutils |
mmm frameworks/base/libs/utils |
|
Looper等 |
make framework |
mmm frameworks/base |
|
AudioTrack |
make libmedia |
mmm frameworks/base/media/libmedia |
|
AudioFlinger |
make libaudioflinger |
mmm frameworks/base/libs/audioflinger |
|
AudioPolicyService |
make libaudiopolicy |
mmm hardware/msm7k/libaudio-qsd8k (示例) |
|
SurfaceFlinger |
make libsurfaceflinger |
mmm frameworks/base/libs/surfaceflinger |
|
Vold |
make vold |
mmm system/vold/ |
|
Rild |
make rild |
mmm hardware/ril/rild/ |
|
MediaProvider |
make MediaProvider |
mmm packages/providers/MediaProvider |
|
Phone |
make Phone |
mmm packages/apps/Phone/ |
假設(shè)make framework,那么編譯完的結(jié)果則如圖1-6所示:
http://wiki.jikexueyuan.com/project/deep-android-v1/images/chapter1/006.png" alt="image" />
圖1-6? make framework的結(jié)果
從上圖可看出,make命令編譯了framework-res.apk以及framework.jar兩個(gè)模塊。它們編譯的結(jié)果在out/target/product/generic/system/framework下。讀者利用adb 命令把這兩個(gè)文件push到手機(jī)的system/framework目錄,即可替換舊的文件。如想測(cè)試這個(gè)新模塊,則需要先殺掉所有使用該模塊的進(jìn)程,進(jìn)程重啟后會(huì)重新加載模塊,這時(shí)就能使用新的文件了。例如,想測(cè)試剛修改的libaudioflinger模塊,adb push上去后,先殺掉mediaserver進(jìn)程,因?yàn)閘ibaudioflinger庫(kù)目前只有該進(jìn)程使用。當(dāng)mediaserver重啟后,就會(huì)加載新push上來的libaudioflinger庫(kù)了。
系統(tǒng)服務(wù)被殺掉后一般都會(huì)自動(dòng)重啟(由init控制,在第三章中可見到)。
本節(jié)介紹Android開發(fā)和源碼研究過程中兩件比較實(shí)用的工具。
Source Insight是閱讀源碼的必備工具,是一個(gè)Windows下的軟件,在Linux平臺(tái)上可通過wine安裝。這里,就不講述如何安裝Source Insight了,相信讀者都會(huì)。下面介紹一下在Source Insight使用上的小技巧。
使用Source Insight時(shí),需要新建一個(gè)源碼工程,通過菜單項(xiàng)Project→New Project,可指定源碼的目錄。在工作中發(fā)現(xiàn),很多同事常一股腦把Android所有源代碼都加到工程中,從而導(dǎo)致了Source Insight運(yùn)行速度非常慢。實(shí)際上,只需要將當(dāng)前分析的源碼目錄加到工程即可。例如,新建一個(gè)Source Insight工程后,只把源碼/framework/base目錄加進(jìn)去了。另外,當(dāng)一個(gè)目錄下的源碼分析完后,可以通過Project→Add and Remove Project Files選項(xiàng)把無須再分析的目錄從工程中去掉。如圖1-7所示:
http://wiki.jikexueyuan.com/project/deep-android-v1/images/chapter1/007.png" alt="image" />
圖1-7? 添加或刪除工程中的目錄
從圖中的框線我們可以發(fā)現(xiàn):
一般首先把framework/base下的目錄加到工程,以后如有需要,再把其他目錄加進(jìn)來。
Source Insight默認(rèn)的字體比較小,看著很費(fèi)眼。怎么辦?
選擇工具欄上Options→Document options菜單,彈出Document Options對(duì)話框,其中左上部分有個(gè)Screen Fonts,然后會(huì)彈出一個(gè)字體對(duì)話框,在那里可選擇大字體,例如四號(hào),五號(hào)字體等。如圖1-8所示:

圖1-8? 字體調(diào)節(jié)
工程建立好后,須通過Project→Rebuild Project選項(xiàng)來解析源碼。另外,在研究源碼時(shí)常常會(huì)只記得源碼文件名,而不記得是在哪個(gè)目錄下。沒關(guān)系,Source Insight支持在源碼中快速定位文件。使用方法如圖1-9所示:

圖1-9? 快速定位文件
使用方法是:
???????????????????
Busybox,號(hào)稱Linux平臺(tái)上的“瑞士軍刀”,它提供了很多常用的工具,例如grep、find等。這些工具在標(biāo)準(zhǔn)Linux上都有,但Android系統(tǒng)卻去掉了其中的大多數(shù)工具。這導(dǎo)致了我們?cè)谡{(diào)試程序、研究Android系統(tǒng)時(shí)步履維艱,所以就需要在手機(jī)上安裝Busybox。
我們可從下面這個(gè)網(wǎng)站中下載已編譯好的Busybox,如圖1-10所示:
http://www.busybox.net/downloads/binaries/1.18.4/
http://wiki.jikexueyuan.com/project/deep-android-v1/images/chapter1/010.png" alt="image" />
圖1-10? Busybox下載
注意該網(wǎng)站已經(jīng)根據(jù)不同平臺(tái)編譯好了對(duì)應(yīng)的Busybox,我們可根據(jù)自己手機(jī)的情況下載對(duì)應(yīng)的文件。例如HTC G7的CPU支持armv7l,所以我下載了最接近的busybox-armv6l。
小知識(shí):arm v7表示的是ARM指令集為v7,目前ARM Cortex-A8/A9系列的CPU支持該指令集。
下載完busybox后,需將它push到手機(jī)上。如:
adb push busybox /system/xbin #為了避免沖突,我push到了/system/xbin目錄下了。
cd /system/xbin?????#進(jìn)入對(duì)應(yīng)目錄
chmod 755 busybox??#更改busybox權(quán)限為可執(zhí)行
busybox –-install??#安裝busybox
grep? #執(zhí)行busybox提供的grep命令,或者busybox xxx執(zhí)行xxx命令也行
Busybox安裝完了,如執(zhí)行busybox命令,就會(huì)打印如圖1-11的輸出。
http://wiki.jikexueyuan.com/project/deep-android-v1/images/chapter1/011.png" alt="image" />
圖1-11? busybox提供的工具
從上圖中可看出,busybox提供了不少的工具,這樣,我們?cè)谘芯緼ndroid系統(tǒng)時(shí)就如虎添翼了。
給手機(jī)安裝busybox須有root權(quán)限,為學(xué)好Android,大家最好還是購(gòu)買那種能被破解的手機(jī)吧。
本章對(duì)Android系統(tǒng)、源碼搭建、研究工具等做了部分介紹,相信讀者現(xiàn)在已是迫不及待,躍躍欲試了吧?馬上開始我們的源碼征程!
① 如果你對(duì)Git不熟或者是對(duì)此很感興趣,建議閱讀《Git權(quán)威指南》(機(jī)械工業(yè)出版社,2011.7月出版,蔣鑫 著),這是目前最全面、最深入的一本Git著作。
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。