- Android群英傳
- 徐宜生
- 63字
- 2019-01-03 15:19:14
第1章
Android體系與系統(tǒng)架構(gòu)
本章作為本書的第1章,將帶領(lǐng)讀者對(duì)Google生態(tài)圈及Android系統(tǒng)有一個(gè)宏觀的概念和認(rèn)識(shí)。同時(shí),讓讀者能夠了解整個(gè)系統(tǒng)的架構(gòu),了解手機(jī)中的Android系統(tǒng)、IDE中的Android系統(tǒng)都由哪些元素構(gòu)成。
學(xué)習(xí)本章,你將了解到以下內(nèi)容:
● Google生態(tài)系統(tǒng)
● Android系統(tǒng)架構(gòu)
● Android源代碼與系統(tǒng)目錄結(jié)構(gòu)
1.1 Google生態(tài)系統(tǒng)
Android自誕生以來,就以一個(gè)“富二代”的形象出現(xiàn)在世人的眼中。從Google的收購,到成立開放手機(jī)聯(lián)盟,到現(xiàn)在一舉成為市場占有率最高的移動(dòng)操作系統(tǒng),Android一直就流淌著“富二代”的血。底層通過最快的C語言保證效率,上層使用Java簡單、快速進(jìn)行開發(fā),開放的系統(tǒng)讓各個(gè)Android社區(qū)、開發(fā)者論壇空前火爆,甚至是可以進(jìn)行無限可能的系統(tǒng)定制化。可以說Android的到來,奠定了移動(dòng)操作系統(tǒng)一個(gè)里程碑式時(shí)代的開始。現(xiàn)在,Google正利用其搜索、移動(dòng)、web的各個(gè)入口,來逐漸掌握互聯(lián)網(wǎng)的控制權(quán)。而Android有了Google這樣一個(gè)“干爹”的支持,更是如魚得水,不僅在搜索上利用Google Now的優(yōu)勢,更利用Google Map這樣一個(gè)強(qiáng)有力的工具,將移動(dòng)系統(tǒng)與Web系統(tǒng)緊密地聯(lián)系在了一起。
Android誕生已經(jīng)六年了,Android在世人的見證下不斷成長,就好比人類的進(jìn)化史,一步步逐漸走向更輝煌的未來。

圖1.1 人類進(jìn)化史

圖1.2 Android進(jìn)化史
1.2 Android系統(tǒng)架構(gòu)
我們每天都在講“Android”、“Android”,可誰能告訴我,“Android”到底是什么呢?從宏觀上講,Android是一個(gè)移動(dòng)操作系統(tǒng),但這是一個(gè)很寬泛的概念。達(dá)·芬奇通過解剖了解人體結(jié)構(gòu),才能把人物畫得逼真?zhèn)魃瘢敲次覀兘裉煲瞾怼敖馄省币幌翧ndroid。
如圖1.3所示,這是一張講解Android系統(tǒng)架構(gòu)的經(jīng)典示意圖。它將Android大致分為了四層,即Linux內(nèi)核層、庫和運(yùn)行時(shí)、Framework層和應(yīng)用層。Android的體系架構(gòu)鼓勵(lì)系統(tǒng)組件重用,共享組件間的數(shù)據(jù),并且定義組件間的訪問權(quán)限控制。可以說,這些層次結(jié)構(gòu)既是相互獨(dú)立,又是相互關(guān)聯(lián)的。

圖1.3 Android系統(tǒng)架構(gòu)
下面我們繼續(xù)“開刀”。有人說,Android是一個(gè)用于連接設(shè)備的軟件集合,圖1.4就代表了一個(gè)最抽象的Android系統(tǒng)架構(gòu)。

圖1.4 Android架構(gòu)總覽
1.2.1 Linux
Linux層,Android最低層最核心的部分。當(dāng)我們打開手機(jī)Setting,選擇about phone選項(xiàng),這一選項(xiàng)所顯示的內(nèi)核版本,就是我們所用的Linux內(nèi)核的版本。Linux層包含了Android系統(tǒng)的核心服務(wù),包括硬件驅(qū)動(dòng)、進(jìn)程管理、安全系統(tǒng),等等。
1.2.2 Dalvik與ART
Dalvik包含了一整套的Android運(yùn)行環(huán)境虛擬機(jī),每個(gè)App都會(huì)分配Dalvik虛擬機(jī)來保證互相之間不受干擾,并保持獨(dú)立。它的特點(diǎn)是在運(yùn)行時(shí)編譯。打個(gè)比方,就好比你買了一輛可折疊的自行車,平時(shí)是折疊的,只有騎的時(shí)候,才需要組裝起來用。而在Android 5.X版本開始,ART模式已經(jīng)取代了Dalvik, ART采用的是安裝時(shí)就進(jìn)行編譯,以后運(yùn)行時(shí)就不用編譯了,這就好比你買了輛組裝好了的自行車,裝好就可以騎了。當(dāng)然,對(duì)在其虛擬機(jī)環(huán)境中運(yùn)行的大部分App來說,它們都運(yùn)行著同樣的代碼。
1.2.3 Framework
如圖1.5所示為圖1.4中Android App Framework的詳細(xì)版。它包含了整個(gè)Android Framework的重點(diǎn),如果你以后要研究Framework的具體流程,基本就是在和它們打交道。

圖1.5 Android App Framework
1.2.4 Standard libraries
如圖1.6所示為圖1.4中Standard libraries的詳細(xì)版,這里包含的是Android中的一些標(biāo)準(zhǔn)庫,所謂標(biāo)準(zhǔn),就是開發(fā)者在開源環(huán)境中可以使用的開發(fā)庫。

圖1.6 Standard libraries
1.2.5 Application
圖1.7和圖1.8分別表示了使用NDK開發(fā)和Java開發(fā)的App的主要構(gòu)成。可以看出,不管是哪種App,它們都有Android Manifest文件、Dalvik Classes、Resource Bundle這幾個(gè)東西,相信解壓過Apk的朋友應(yīng)該注意到了,這些就是我們解壓Apk后的文件。

圖1.7 Android NDK App

圖1.8 Android SDK App
對(duì)于開發(fā)者來說,與Android系統(tǒng)最直接的接觸就是SDK,應(yīng)用開發(fā)者應(yīng)當(dāng)關(guān)注每個(gè)版本的SDK修改,從而提高應(yīng)用的兼容性。如果站在Android設(shè)計(jì)者的角度上來看整個(gè)Android的架構(gòu),設(shè)計(jì)者希望Android的框架層能夠起到承上啟下的功能,讓應(yīng)用的各個(gè)組件之間解耦,并通過框架來進(jìn)行統(tǒng)一的調(diào)度、管理。
Android的系統(tǒng)架構(gòu),說簡單點(diǎn),可以只用一張圖展示,說復(fù)雜點(diǎn),可以寫幾千頁的書,Android的系統(tǒng)架構(gòu)就像人心一樣,有時(shí)候看似簡單,卻蘊(yùn)藏著難以捉摸的東西,要想真搞清楚,也絕非一朝一夕之功。所以,初學(xué)者首先只需要對(duì)這些有一個(gè)大概的認(rèn)識(shí)就可以了,等掌握了使用方法后,就可以慢慢地了解它的運(yùn)行原理,到時(shí)候,自然而然,你就會(huì)看清楚Android的系統(tǒng)架構(gòu)。
1.3 Android App組件架構(gòu)
前面講解了Android的系統(tǒng)架構(gòu),而在應(yīng)用層,Android的App組件架構(gòu),通常就是我們所說的Android四大組件,指的是Activity、BroadCastReciever、ContentProvider和Service,它們是組成一個(gè)Android App的最基本元素。
1.3.1 Android四大組件如何協(xié)同工作
Android中的四大組件的使用方法與適用場景都各不相同,但它們之間也保持著緊密的聯(lián)系,你中有我,我中有你,緊密而不可分。
Activity作為人機(jī)交互的第一界面,負(fù)責(zé)向用戶展示信息和處理結(jié)果,而這些信息的來源,可以是通過資源獲取,也可以通過Content Provider來獲取其他應(yīng)用的信息,或是Service從后臺(tái)計(jì)算、下載、處理的結(jié)果,當(dāng)然也可以是通過BroadCast Reciever獲取到的廣播信息。同時(shí),Android系統(tǒng)還提供了一個(gè)信使——Intent,作為信息傳遞的載體。組件與組件之間通過Intent來通信、傳遞信息、交換數(shù)據(jù),正是通過這樣一種方式,四大組件形成了各自獨(dú)立而又緊密聯(lián)系的關(guān)系,讓整個(gè)Android系統(tǒng)“活”了起來。
Android的四大組件在開發(fā)者的調(diào)度下,共同完成著開發(fā)者賦予它們的使命,它們之間沒有孰優(yōu)孰劣,所有的組件存在的道理就是為了讓程序能夠更好地實(shí)現(xiàn)開發(fā)者的功能。當(dāng)然,熟知每個(gè)組件的功能、特點(diǎn),才能在使用時(shí)運(yùn)籌帷幄。在這里,大家只需要對(duì)四大組件的協(xié)同工作模式有個(gè)基本的概念即可,隨著本書的講解,大家會(huì)慢慢掌握這些組件的使用技巧。
1.3.2 應(yīng)用運(yùn)行上下文對(duì)象
在高中的時(shí)候,語文課本上經(jīng)常會(huì)出現(xiàn)這樣一句話——“請(qǐng)聯(lián)系上下文,分析這句話在文中的作用”,那么這個(gè)“上下文”到底是指什么意思呢?在語文中,我們可以理解為語境,在程序中,我們可以理解為當(dāng)前對(duì)象在程序中所處的一個(gè)環(huán)境,一個(gè)與系統(tǒng)交互的過程。
Android系統(tǒng)的上下文對(duì)象,即在Context中,為我們封裝了這樣一個(gè)“語境”。Activity、Service、Application都是繼承自Context。
Android應(yīng)用程序會(huì)在如下所示的幾個(gè)時(shí)間點(diǎn)創(chuàng)建應(yīng)用上下文Context。
● 創(chuàng)建Application
● 創(chuàng)建Activity
● 創(chuàng)建Service
不難發(fā)現(xiàn),創(chuàng)建Context的時(shí)機(jī)就是在創(chuàng)建Context的實(shí)現(xiàn)類的時(shí)候。當(dāng)應(yīng)用程序第一次啟動(dòng)時(shí),Android系統(tǒng)都會(huì)創(chuàng)建一個(gè)Application對(duì)象,同時(shí)創(chuàng)建Application Context,所有的組件都共同擁有這樣一個(gè)Context對(duì)象,這個(gè)應(yīng)用上下文對(duì)象貫穿整個(gè)應(yīng)用進(jìn)程的生命周期,為應(yīng)用全局提供了功能和環(huán)境支持。而創(chuàng)建Activity和Service組件時(shí),系統(tǒng)也會(huì)給它們提供運(yùn)行的上下文環(huán)境,即創(chuàng)建Activity實(shí)例、Service實(shí)例的Context對(duì)象。所以很多讀者在Activity中獲取Context對(duì)象時(shí),可以直接使用this,而在匿名內(nèi)部類中,就必須指定XXXXActivity.this才可以獲得該Activity的Context對(duì)象。當(dāng)然,你也可以通過getApplicationContext()方法來獲取整個(gè)App的Context,但是通過getApplicationContext()方法獲得的是整個(gè)應(yīng)用的上下文引用,這與某個(gè)組件的上下文引用,在某些時(shí)候還是有區(qū)別的。
1.4 Android系統(tǒng)源代碼目錄與系統(tǒng)目錄
Android源代碼的目錄中包含了Android系統(tǒng)所有的源代碼,從底層驅(qū)動(dòng)到上層應(yīng)用,Android系統(tǒng)對(duì)所有文件都進(jìn)行了詳細(xì)管理。而在手機(jī)中,Android系統(tǒng)的目錄與源代碼的目錄并不是一一對(duì)應(yīng)的,而是與源代碼編譯之后,與打包生成的Image文件的結(jié)構(gòu)相同。了解這些目錄的結(jié)構(gòu),對(duì)于認(rèn)識(shí)整個(gè)Android系統(tǒng)有很好的幫助。
1.4.1 Android系統(tǒng)源代碼目錄
前面我們已經(jīng)把Android“大卸八塊”了,下面我們就來給Android登記入庫,不過這可不是一件容易的事情,要想看完整個(gè)Android的源代碼,你要懂C、懂腳本、懂Java,不僅軟硬兼通,而且有一顆耐得住寂寞、忍得了枯燥的心。所以,對(duì)于大多數(shù)人來說,我們只需要了解它的框架結(jié)構(gòu),出了問題知道從哪里著手解決就可以了。這就好比圖書管理員,他不一定要把所有的書都讀一遍,但是只要有用到,他就可以很快地找到相應(yīng)的資料。
這里筆者給讀者朋友們提供一個(gè)查看Android源代碼的網(wǎng)站:http://androidxref.com/。網(wǎng)站首頁如圖1.9所示。

圖1.9 AndroidXRef1
圖1.10展示了該網(wǎng)站中Android 5.0版本的源代碼搜索界面。

圖1.10 AndroidXRef2
這里就是我們整個(gè)Android圖書館的索引了,每個(gè)目錄都具有不同的功能和目的,而它們組成在一起,便構(gòu)成了整個(gè)Android大廈,整個(gè)結(jié)構(gòu)關(guān)系圖如下所示。
- Makefile -bionic (bionic C庫) -bootable (啟動(dòng)引導(dǎo)相關(guān)代碼) -build (存放系統(tǒng)編譯規(guī)則等基礎(chǔ)開發(fā)包配置) -cts (Google兼容性測試標(biāo)準(zhǔn)) -dalvik (dalvik虛擬機(jī)) -development (應(yīng)用程序開發(fā)相關(guān)) -external (android使用的一些開源的模塊) -frameworks (Framework框架核心) -hardware (廠商硬件適配層HAL代碼) -out (編譯完成后的代碼輸出目錄) -packages (應(yīng)用程序包) -prebuilt (x86和arm架構(gòu)下預(yù)編譯資源) -sdk (sdk及模擬器) -system (底層文件系統(tǒng)庫、應(yīng)用及組件) -vendor (廠商定制代碼)
不過這里要注意的是,并不是所有的源代碼結(jié)構(gòu)都是這樣。只有AOSP的Android項(xiàng)目才是這樣一個(gè)結(jié)構(gòu),有些芯片廠商如MTK,它們的目錄結(jié)構(gòu)就與此不同。
Android作為手機(jī)操作系統(tǒng),我們需要將源代碼編譯后才能使用,那么問題來了,代碼編譯哪家強(qiáng)?Eclipse? Android Studio?這些都不對(duì),我們首先需要知道,Eclipse、Android Studio這些屬于開發(fā)IDE,也就是我們的集成開發(fā)環(huán)境,它體現(xiàn)的是一種簡化計(jì)算機(jī)與開發(fā)者的交互,然而當(dāng)你接觸的程序架構(gòu)越來越豐富,在了解越來越深入后,你就會(huì)發(fā)現(xiàn),很多事情,IDE是無法完成的,比如自動(dòng)化編譯、定制編譯、版本控制、自動(dòng)測試等。因此Android與很多語言一樣,引入了Makefile機(jī)制。那么Makefile到底有什么好處呢?我們先看一下對(duì)Makefile的解釋:一個(gè)像Android這樣的大型工程,它的源文件不計(jì)其數(shù),不同的功能、模塊,按類型分別放置在不同的目錄中,這些模塊通常會(huì)有一個(gè)叫Makefile的文件來進(jìn)行管理。它定義了一系列的規(guī)則來指定模塊,哪些文件需要編譯,以及這些文件該按照怎樣的順序去編譯。甚至,它還可以配置更復(fù)雜的功能操作,比如定義編譯規(guī)則,打包規(guī)則等,因?yàn)镸akefile就像一個(gè)shell腳本,不僅可以使用自己的語法,也能調(diào)用操作系統(tǒng)的命令。
可以看到,Makefile最大的好處就是自動(dòng)化編譯,同時(shí)還可以做到可控制的編譯,Android通過Makefile來描述Android各個(gè)組件間的聯(lián)系并指導(dǎo)它們進(jìn)行自動(dòng)化編譯。Makefile的語法,指定了各個(gè)源代碼該如何連接并生成相應(yīng)的可執(zhí)行程序。這時(shí)候大家再來看看我們前面列出的Android源代碼目錄結(jié)構(gòu),每個(gè)目錄中,還會(huì)包含更多的目錄,而它的每一個(gè)最小的功能單位的目錄下,都會(huì)有一個(gè)Makefile文件,這樣每一級(jí)向上,通過這樣一個(gè)個(gè)Makefile文件,就把整個(gè)源代碼有條不紊地聯(lián)系在一起了。
很多人可能對(duì)Android源代碼的編譯沒有概念,這里舉一個(gè)例子,筆者公司的電腦CPU是i73770,主頻3.4GHz,全編一次Android的代碼需要90分鐘,如果沒有Makefile,簡直無法想象該如何去編譯源代碼。
1.4.2 Android系統(tǒng)目錄
在Android手機(jī)里,系統(tǒng)的目錄結(jié)構(gòu)與源代碼目錄結(jié)構(gòu)還是有所不同的,我們通過ADB連接上手機(jī),通過Linux的ls命令查看Android系統(tǒng)的根目錄,如圖1.11所示。其中/system和/data是開發(fā)者非常關(guān)心的兩個(gè)目錄。

圖1.11 Android系統(tǒng)目錄
● /system/app/
這里面放的是一些系統(tǒng)的App,如圖1.12所示為App目錄。

圖1.12 Android /system/app/目錄
● /system/bin/
這里面主要放的是Linux自帶的組件,如圖1.13所示為bin目錄。

圖1.13 Android /system/bin/目錄
● /system/build.prop
這里記錄的是系統(tǒng)的屬性信息,如圖1.14所示。

圖1.14 Android /system/build.prop
● /system/fonts/
系統(tǒng)字體存放目錄root后可下載TTF格式字體替換原字體,達(dá)到修改系統(tǒng)字體的效果,如圖1.15所示fonts目錄。

圖1.15 Android /system/fonts/目錄
● /system/framework/
系統(tǒng)的核心文件、框架層,如圖1.16所示。

圖1.16 Android /system/framework/目錄
● /system/lib/
存放幾乎所有的共享庫(.so)文件,如圖1.17所示,一些手機(jī)中的.so庫文件。

圖1.17 Android /system/lib/目錄
● /system/media/
該目錄用來保存系統(tǒng)提示音、系統(tǒng)鈴聲,如圖1.18所示。

圖1.18 Android /system/media/目錄
其中/system/media/audio/目錄,這里面保存著Android系統(tǒng)默認(rèn)的鈴聲,alarms目錄是鬧鈴提醒,notification目錄是短信或提示音,ringtones目錄是來電鈴聲,而ui目錄則是一些界面音效,如圖1.19所示。

圖1.19 Android /system/media/audio/目錄
● /system/usr/
該目錄用來保存用戶的配置文件,如鍵盤布局、共享、時(shí)區(qū)文件等,如圖1.20所示。

圖1.20 Android /system/usr/目錄
● /data/app/
data目錄包含了用戶的大部分?jǐn)?shù)據(jù)信息。其中,/data/app/這個(gè)目錄包含了用戶安裝的App或者升級(jí)的App,如圖1.21所示。

圖1.21 Android /data/app/目錄
● /data/data/
這個(gè)目錄應(yīng)該是開發(fā)者訪問的最多的目錄了,這里包含了App的數(shù)據(jù)信息、文件信息、數(shù)據(jù)庫信息等,以包名的方式來區(qū)分各個(gè)應(yīng)用,如圖1.22所示。

圖1.22 Android /data/data/目錄
● /data/system/
這個(gè)目錄包含了手機(jī)的各項(xiàng)系統(tǒng)信息,如圖1.23所示。

圖1.23 /data/system/目錄
● /data/misc/
這個(gè)目錄保存了大部分的Wi-Fi、VPN信息,如圖1.24所示。

圖1.24 Android /data/misc/目錄
1.4.3 Android App文件目錄
現(xiàn)在終于回到了我們熟悉的應(yīng)用層,大家可以長舒一口氣,不用再看幾個(gè)GB大小的源代碼了。下面我們就以Android Studio IDE為開發(fā)環(huán)境,來分析一下Android Application的文件目錄結(jié)構(gòu)。
當(dāng)你使用Android Studio生成一個(gè)Android Application工程后,文件目錄結(jié)構(gòu)如圖1.25所示。

圖1.25 Android Application目錄
關(guān)于Eclipse和Android Studio的文件目錄區(qū)別,在第2章中會(huì)進(jìn)行詳細(xì)講解,簡單來說,大家只需要了解一點(diǎn),Android Studio中的Project就相當(dāng)于Eclipse里面的Workspace,而Android Studio中的Module就相當(dāng)于Eclipse里面的Project就可以了。
圖1.25中,App目錄中的代碼為應(yīng)用程序代碼,而下面的Gradle Scripts為編譯腳本,后面我們講Android Studio的使用的時(shí)候,會(huì)再詳細(xì)地了解它們的作用。
總體來看,Android Application的目錄是比較清晰、簡單的,這也得力于Android底層做的良好的封裝和IDE的強(qiáng)大。后面我們的大部分工作都將在這個(gè)目錄結(jié)構(gòu)下進(jìn)行操作。
- ServiceNow Application Development
- JavaScript全程指南
- Learning Docker
- SQL語言從入門到精通
- Learning Linux Binary Analysis
- Neo4j Essentials
- 自制編程語言
- Learning JavaScript Data Structures and Algorithms
- Selenium Testing Tools Cookbook(Second Edition)
- C語言程序設(shè)計(jì)
- 代碼閱讀
- Python Machine Learning Blueprints:Intuitive data projects you can relate to
- 一步一步跟我學(xué)Scratch3.0案例
- C++程序設(shè)計(jì)教程
- Node.js實(shí)戰(zhàn):分布式系統(tǒng)中的后端服務(wù)開發(fā)