官术网_书友最值得收藏!

第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)行操作。

主站蜘蛛池模板: 信宜市| 惠安县| 天台县| 安图县| 墨竹工卡县| 山阴县| 紫阳县| 毕节市| 蓬莱市| 门头沟区| 新沂市| 临武县| 台北县| 栖霞市| 林州市| 中山市| 扎囊县| 舟山市| 崇州市| 兰州市| 娄烦县| 聂拉木县| 南陵县| 闵行区| 灵川县| 新密市| 莆田市| 河津市| 姜堰市| 呼伦贝尔市| 琼海市| 正阳县| 宜都市| 新河县| 华容县| 扬中市| 东方市| 育儿| 黄山市| 攀枝花市| 汨罗市|