因爲《深刻理解Android 卷一》和《深刻理解Android卷二》再也不出版,而知識的傳播不該該由於紙質媒介的問題而中斷,因此我將在OSC博客中全文轉發這兩本書的所有內容。 html
本章主要內容 java
Android是Google公司推出的一款手機開發平臺。該平臺自己是基於Linux內核的,圖1-1展現了這個系統的架構: linux
圖1-1 Android系統架構 android
從上圖中能夠看出,Android系統大致可分爲四層,從下往上依次是: git
從上面的介紹可看出,Android最大的特色之一,恐怕就是搭建了一個被廣大Java開發者熱捧的Java世界了。但該世界並非空中樓閣,它的運轉依賴另外一個被Google極力隱藏的Native世界。兩個世界的交互關係可用圖1-2來表示: 編程
圖1-2 Java世界和Native世界交互 ubuntu
從上圖可知: bash
本書所分析的模塊也將遵循Android系統架構,如圖1-3所示: 架構
圖1-3 本書的架構圖 oracle
從上圖可知,本書所分析的各個模塊除未涉及Kernel外,其餘三層均有所涉足,它們分別是:
本節,將介紹如何搭建Android源碼開發環境。
首先,須要一個Linux系統,我本人推薦安裝Ubuntu10.04(32位版本)。讀者可從網上下載該版本的系統。Windows用戶可以使用VMWare或VirtualBox做爲虛擬機,來安裝Ubuntu10.04。我本人推薦VMWare,由於它的功能太強大了!
若是要使用VMWare,那麼在安裝完Ubuntu以後,必定要把VMWare Tools也安裝上,由於這個工具會提供不少很是實用的功能。這裏還有一個小建議,若是Linux系統只是我的使用,則建議用root帳戶登陸系統。在工做中,曾發現不少用非root帳戶登陸的同事成天都在sudo,輸入密碼,這樣作就浪費了很多零碎的時間片。
假設讀者已經安裝好了Ubuntu 10.04(32位版本),而且以root帳戶登陸到系統上了,接下來的工做是:
Android源碼採用Git①作版本管理工具,這個工具由Linux之父LinusTorvalds採用純C開發。關於Git爲何使用C語言開發的問題,還引起了一場關於C和C++孰好孰壞的大討論,不過Linus Torvalds顯然沒樹起「居廟堂之高,則憂其民」的形象。對於普通碼農而言,用最合適的工具、最實用的辦法來完成好工做纔是最重要的。因此C、C++、Java、Python等都僅僅是工具而已。
下面介紹如何下載源碼。
下載Android源碼前,有些下載工具須要從Ubuntu軟件源上下載。能夠爲Ubuntu系統指定一個軟件源。有些軟件源上有這些工具,有些卻沒有,並且各個軟件源的下載速度也不一樣,因此應首先找到一個合適的軟件源。Ubuntu軟件源的設置界面如圖1-3所示:
圖1-3 Ubuntu軟件源設置
從上圖中可發現,將軟件源地址設置成了http://mirror.bjtu.edu.cn/ubuntu。每一個人可根據本身的狀況選擇合適的軟件源。
下面開始下載Android源碼,工序比較簡單,可一鼓作氣。
下載完後,該目錄中的內容如圖1-4所示:
圖1-4 源碼下載結果
注意,Kernel的代碼必需要單獨下載,下載方法以下:
git clone git://android.git.kernel.org/kernel/common.gitkernel
Froyo的編譯依賴JDK1.5,因此首先要作的就是下載JDK1.5。下載網址是http://www.oracle.com/technetwork/java/javase/downloads/index-jdk5-jsp-142662.html。下載獲得的文件爲jdk-1_5_0_22-linux-i586.bin。把它放到一個目錄中,好比我本人,就將它放在了/develop中,而後在這個目錄中執行:
./jdk-1_5_0_22-linux-i586.bin #執行這個文件
這個命令其實就是解壓,解壓後的結果在/develop/jdk1.5.0_22目錄中。現有了JDK,再按照下面的步驟部署它便可:
exportJAVA_HOME=/develop/jdk1.5.0_22 #設置爲剛纔解壓的目錄
exportJRE_HOME=JAVA_HOME/jre
exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
Android的編譯有本身的一套規則,主要利用的就是mk文件。網上有太多關於它的解說了,這裏再也不贅述,只簡單介紹其編譯工序:
進入源碼目錄(以個人開發環境爲例),也就是 cd /develop/download_froyo
執行完上面幾個步驟後,就能夠編譯系統了。Android平臺提供了三個命令用於編譯,它們分別是make、mmm和mm,這三個命令的使用方法及其優劣以下:
從使用的角度來看,我本人有以下建議:
通常的編譯方式都使用增量編譯,即只編譯發生變化的目標文件。但有時則需從新編譯全部目標文件,那麼就可以使用make命令的-B選項。例如 make –B 模塊名,或者mm –B、mmm –B 。mm和mmm內部,也是調用make命令的,而make的-B選項將強制編譯全部目標文件。
Android的編譯工序比較簡單,難點主要在Android.mk文件的編寫。讀者可上網搜索與此相關的學習資料。
本書各模塊的編譯目標如表1-1所示,這裏僅列出幾個有表明性的模塊:
表1-1 本書各模塊編譯目標
目標模塊 |
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/ |
假設make framework,那麼編譯完的結果則如圖1-5所示:
圖1-5 make framework的結果
從上圖可看出,make命令編譯了framework-res.apk以及framework.jar兩個模塊。它們編譯的結果在out/target/product/generic/system/framework下。讀者利用adb 命令把這兩個文件push到手機的system/framework目錄,便可替換舊的文件。如想測試這個新模塊,則須要先殺掉全部使用該模塊的進程,進程重啓後會從新加載模塊,這時就能使用新的文件了。例如,想測試剛修改的libaudioflinger模塊,adb push上去後,先殺掉mediaserver進程,由於libaudioflinger庫目前只有該進程使用。當mediaserver重啓後,就會加載新push上來的libaudioflinger庫了。
系統服務被殺掉後通常都會自動重啓(由init控制,在第三章中可見到)。
本節介紹Android開發和源碼研究過程當中兩件比較實用的工具。
Source Insight是閱讀源碼的必備工具,是一個Windows下的軟件,在Linux平臺上可經過wine安裝。這裏,就不講述如何安裝Source Insight了,相信讀者都會。下面介紹一下在Source Insight使用上的小技巧。
使用Source Insight時,須要新建一個源碼工程,經過菜單項Project→New Project,可指定源碼的目錄。在工做中發現,不少同事常一股腦把Android全部源代碼都加到工程中,從而致使了Source Insight運行速度很是慢。實際上,只須要將當前分析的源碼目錄加到工程便可。例如,新建一個Source Insight工程後,只把源碼/framework/base目錄加進去了。另外,當一個目錄下的源碼分析完後,能夠經過Project→Add and Remove Project Files選項把無須再分析的目錄從工程中去掉。如圖1-6所示:
圖1-6 添加或刪除工程中的目錄
從圖中的框線咱們能夠發現:
通常首先把framework/base下的目錄加到工程,之後若有須要,再把其餘目錄加進來。
Source Insight默認的字體比較小,看着很費眼。怎麼辦?
選擇工具欄上Options→Document options菜單,彈出Document Options對話框,其中左上部分有個Screen Fonts,而後會彈出一個字體對話框,在那裏可選擇大字體,例如四號,五號字體等。如圖1-7所示:
圖1-7 字體調節
工程創建好後,須經過Project→Rebuild Project選項來解析源碼。另外,在研究源碼時經常會只記得源碼文件名,而不記得是在哪一個目錄下。不要緊,Source Insight支持在源碼中快速定位文件。使用方法如圖1-8所示:
圖1-8 快速定位文件
使用方法是:
Busybox,號稱Linux平臺上的「瑞士軍刀」,它提供了不少經常使用的工具,例如grep、find等。這些工具在標準Linux上都有,但Android系統卻去掉了其中的大多數工具。這致使了咱們在調試程序、研究Android系統時寸步難行,因此就須要在手機上安裝Busybox。
咱們可從下面這個網站中下載已編譯好的Busybox,如圖1-9所示:
http://www.busybox.net/downloads/binaries/1.18.4/
圖1-9 Busybox下載
注意該網站已經根據不一樣平臺編譯好了對應的Busybox,咱們可根據本身手機的狀況下載對應的文件。例如HTC G7的CPU支持armv7l,因此我下載了最接近的busybox-armv6l。
小知識:arm v7表示的是ARM指令集爲v7,目前ARM Cortex-A8/A9系列的CPU支持該指令集。
下載完busybox後,需將它push到手機上。如:
adb push busybox /system/xbin #爲了不衝突,我push到了/system/xbin目錄下了。
cd /system/xbin #進入對應目錄
chmod 755 busybox #更改busybox權限爲可執行
busybox –-install #安裝busybox
grep #執行busybox提供的grep命令,或者busybox xxx執行xxx命令也行
Busybox安裝完了,如執行busybox命令,就會打印如圖1-10的輸出。
圖1-10 busybox提供的工具
從上圖中可看出,busybox提供了很多的工具,這樣,咱們在研究Android系統時就如虎添翼了。
給手機安裝busybox須有root權限,爲學好Android,你們最好仍是購買那種能被破解的手機吧。
本章對Android系統、源碼搭建、研究工具等作了部分介紹,相信讀者如今已經是火燒眉毛,躍躍欲試了吧?立刻開始咱們的源碼征程!
① 若是你對Git不熟或者是對此很感興趣,建議閱讀《Git權威指南》(機械工業出版社,2011.7月出版,蔣鑫 著),這是目前最全面、最深刻的一本Git著做。