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

第1章
Android體系與系統(tǒng)架構(gòu)

本章作為本書的第1章,將帶領(lǐng)讀者對Google生態(tài)圈及Android系統(tǒng)有一個宏觀的概念和認識。同時,讓讀者能夠了解整個系統(tǒng)的架構(gòu),了解手機中的Android系統(tǒng)、IDE中的Android系統(tǒng)都由哪些元素構(gòu)成。

學習本章,你將了解到以下內(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自誕生以來,就以一個“富二代”的形象出現(xiàn)在世人的眼中。從Google的收購,到成立開放手機聯(lián)盟,到現(xiàn)在一舉成為市場占有率最高的移動操作系統(tǒng),Android一直就流淌著“富二代”的血。底層通過最快的C語言保證效率,上層使用Java簡單、快速進行開發(fā),開放的系統(tǒng)讓各個Android社區(qū)、開發(fā)者論壇空前火爆,甚至是可以進行無限可能的系統(tǒng)定制化。可以說Android的到來,奠定了移動操作系統(tǒng)一個里程碑式時代的開始。現(xiàn)在,Google正利用其搜索、移動、web的各個入口,來逐漸掌握互聯(lián)網(wǎng)的控制權(quán)。而Android有了Google這樣一個“干爹”的支持,更是如魚得水,不僅在搜索上利用Google Now的優(yōu)勢,更利用Google Map這樣一個強有力的工具,將移動系統(tǒng)與Web系統(tǒng)緊密地聯(lián)系在了一起。

Android誕生已經(jīng)六年了,Android在世人的見證下不斷成長,就好比人類的進化史,一步步逐漸走向更輝煌的未來。

圖1.1 人類進化史

圖1.2 Android進化史

1.2 Android系統(tǒng)架構(gòu)

我們每天都在講“Android”、“Android”,可誰能告訴我,“Android”到底是什么呢?從宏觀上講,Android是一個移動操作系統(tǒng),但這是一個很寬泛的概念。達·芬奇通過解剖了解人體結(jié)構(gòu),才能把人物畫得逼真?zhèn)魃瘢敲次覀兘裉煲瞾怼敖馄省币幌翧ndroid。

如圖1.3所示,這是一張講解Android系統(tǒng)架構(gòu)的經(jīng)典示意圖。它將Android大致分為了四層,即Linux內(nèi)核層、庫和運行時、Framework層和應用層。Android的體系架構(gòu)鼓勵系統(tǒng)組件重用,共享組件間的數(shù)據(jù),并且定義組件間的訪問權(quán)限控制。可以說,這些層次結(jié)構(gòu)既是相互獨立,又是相互關(guān)聯(lián)的。

圖1.3 Android系統(tǒng)架構(gòu)

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

圖1.4 Android架構(gòu)總覽

1.2.1 Linux

Linux層,Android最低層最核心的部分。當我們打開手機Setting,選擇about phone選項,這一選項所顯示的內(nèi)核版本,就是我們所用的Linux內(nèi)核的版本。Linux層包含了Android系統(tǒng)的核心服務,包括硬件驅(qū)動、進程管理、安全系統(tǒng),等等。

1.2.2 Dalvik與ART

Dalvik包含了一整套的Android運行環(huán)境虛擬機,每個App都會分配Dalvik虛擬機來保證互相之間不受干擾,并保持獨立。它的特點是在運行時編譯。打個比方,就好比你買了一輛可折疊的自行車,平時是折疊的,只有騎的時候,才需要組裝起來用。而在Android 5.X版本開始,ART模式已經(jīng)取代了Dalvik, ART采用的是安裝時就進行編譯,以后運行時就不用編譯了,這就好比你買了輛組裝好了的自行車,裝好就可以騎了。當然,對在其虛擬機環(huán)境中運行的大部分App來說,它們都運行著同樣的代碼。

1.2.3 Framework

如圖1.5所示為圖1.4中Android App Framework的詳細版。它包含了整個Android Framework的重點,如果你以后要研究Framework的具體流程,基本就是在和它們打交道。

圖1.5 Android App Framework

1.2.4 Standard libraries

如圖1.6所示為圖1.4中Standard libraries的詳細版,這里包含的是Android中的一些標準庫,所謂標準,就是開發(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這幾個東西,相信解壓過Apk的朋友應該注意到了,這些就是我們解壓Apk后的文件。

圖1.7 Android NDK App

圖1.8 Android SDK App

對于開發(fā)者來說,與Android系統(tǒng)最直接的接觸就是SDK,應用開發(fā)者應當關(guān)注每個版本的SDK修改,從而提高應用的兼容性。如果站在Android設計者的角度上來看整個Android的架構(gòu),設計者希望Android的框架層能夠起到承上啟下的功能,讓應用的各個組件之間解耦,并通過框架來進行統(tǒng)一的調(diào)度、管理。

Android的系統(tǒng)架構(gòu),說簡單點,可以只用一張圖展示,說復雜點,可以寫幾千頁的書,Android的系統(tǒng)架構(gòu)就像人心一樣,有時候看似簡單,卻蘊藏著難以捉摸的東西,要想真搞清楚,也絕非一朝一夕之功。所以,初學者首先只需要對這些有一個大概的認識就可以了,等掌握了使用方法后,就可以慢慢地了解它的運行原理,到時候,自然而然,你就會看清楚Android的系統(tǒng)架構(gòu)。

1.3 Android App組件架構(gòu)

前面講解了Android的系統(tǒng)架構(gòu),而在應用層,Android的App組件架構(gòu),通常就是我們所說的Android四大組件,指的是Activity、BroadCastReciever、ContentProvider和Service,它們是組成一個Android App的最基本元素。

1.3.1 Android四大組件如何協(xié)同工作

Android中的四大組件的使用方法與適用場景都各不相同,但它們之間也保持著緊密的聯(lián)系,你中有我,我中有你,緊密而不可分。

Activity作為人機交互的第一界面,負責向用戶展示信息和處理結(jié)果,而這些信息的來源,可以是通過資源獲取,也可以通過Content Provider來獲取其他應用的信息,或是Service從后臺計算、下載、處理的結(jié)果,當然也可以是通過BroadCast Reciever獲取到的廣播信息。同時,Android系統(tǒng)還提供了一個信使——Intent,作為信息傳遞的載體。組件與組件之間通過Intent來通信、傳遞信息、交換數(shù)據(jù),正是通過這樣一種方式,四大組件形成了各自獨立而又緊密聯(lián)系的關(guān)系,讓整個Android系統(tǒng)“活”了起來。

Android的四大組件在開發(fā)者的調(diào)度下,共同完成著開發(fā)者賦予它們的使命,它們之間沒有孰優(yōu)孰劣,所有的組件存在的道理就是為了讓程序能夠更好地實現(xiàn)開發(fā)者的功能。當然,熟知每個組件的功能、特點,才能在使用時運籌帷幄。在這里,大家只需要對四大組件的協(xié)同工作模式有個基本的概念即可,隨著本書的講解,大家會慢慢掌握這些組件的使用技巧。

1.3.2 應用運行上下文對象

在高中的時候,語文課本上經(jīng)常會出現(xiàn)這樣一句話——“請聯(lián)系上下文,分析這句話在文中的作用”,那么這個“上下文”到底是指什么意思呢?在語文中,我們可以理解為語境,在程序中,我們可以理解為當前對象在程序中所處的一個環(huán)境,一個與系統(tǒng)交互的過程。

Android系統(tǒng)的上下文對象,即在Context中,為我們封裝了這樣一個“語境”。Activity、Service、Application都是繼承自Context。

Android應用程序會在如下所示的幾個時間點創(chuàng)建應用上下文Context。

● 創(chuàng)建Application

● 創(chuàng)建Activity

● 創(chuàng)建Service

不難發(fā)現(xiàn),創(chuàng)建Context的時機就是在創(chuàng)建Context的實現(xiàn)類的時候。當應用程序第一次啟動時,Android系統(tǒng)都會創(chuàng)建一個Application對象,同時創(chuàng)建Application Context,所有的組件都共同擁有這樣一個Context對象,這個應用上下文對象貫穿整個應用進程的生命周期,為應用全局提供了功能和環(huán)境支持。而創(chuàng)建Activity和Service組件時,系統(tǒng)也會給它們提供運行的上下文環(huán)境,即創(chuàng)建Activity實例、Service實例的Context對象。所以很多讀者在Activity中獲取Context對象時,可以直接使用this,而在匿名內(nèi)部類中,就必須指定XXXXActivity.this才可以獲得該Activity的Context對象。當然,你也可以通過getApplicationContext()方法來獲取整個App的Context,但是通過getApplicationContext()方法獲得的是整個應用的上下文引用,這與某個組件的上下文引用,在某些時候還是有區(qū)別的。

1.4 Android系統(tǒng)源代碼目錄與系統(tǒng)目錄

Android源代碼的目錄中包含了Android系統(tǒng)所有的源代碼,從底層驅(qū)動到上層應用,Android系統(tǒng)對所有文件都進行了詳細管理。而在手機中,Android系統(tǒng)的目錄與源代碼的目錄并不是一一對應的,而是與源代碼編譯之后,與打包生成的Image文件的結(jié)構(gòu)相同。了解這些目錄的結(jié)構(gòu),對于認識整個Android系統(tǒng)有很好的幫助。

1.4.1 Android系統(tǒng)源代碼目錄

前面我們已經(jīng)把Android“大卸八塊”了,下面我們就來給Android登記入庫,不過這可不是一件容易的事情,要想看完整個Android的源代碼,你要懂C、懂腳本、懂Java,不僅軟硬兼通,而且有一顆耐得住寂寞、忍得了枯燥的心。所以,對于大多數(shù)人來說,我們只需要了解它的框架結(jié)構(gòu),出了問題知道從哪里著手解決就可以了。這就好比圖書管理員,他不一定要把所有的書都讀一遍,但是只要有用到,他就可以很快地找到相應的資料。

這里筆者給讀者朋友們提供一個查看Android源代碼的網(wǎng)站:http://androidxref.com/。網(wǎng)站首頁如圖1.9所示。

圖1.9 AndroidXRef1

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

圖1.10 AndroidXRef2

這里就是我們整個Android圖書館的索引了,每個目錄都具有不同的功能和目的,而它們組成在一起,便構(gòu)成了整個Android大廈,整個結(jié)構(gòu)關(guān)系圖如下所示。

        - Makefile
        -bionic            (bionic C庫)
        -bootable          (啟動引導相關(guān)代碼)
        -build             (存放系統(tǒng)編譯規(guī)則等基礎開發(fā)包配置)
        -cts               (Google兼容性測試標準)
        -dalvik            (dalvik虛擬機)
        -development       (應用程序開發(fā)相關(guān))
        -external          (android使用的一些開源的模塊)
        -frameworks        (Framework框架核心)
        -hardware          (廠商硬件適配層HAL代碼)
        -out               (編譯完成后的代碼輸出目錄)
        -packages          (應用程序包)
        -prebuilt          (x86和arm架構(gòu)下預編譯資源)
        -sdk               (sdk及模擬器)
        -system            (底層文件系統(tǒng)庫、應用及組件)
        -vendor            (廠商定制代碼)

不過這里要注意的是,并不是所有的源代碼結(jié)構(gòu)都是這樣。只有AOSP的Android項目才是這樣一個結(jié)構(gòu),有些芯片廠商如MTK,它們的目錄結(jié)構(gòu)就與此不同。

Android作為手機操作系統(tǒng),我們需要將源代碼編譯后才能使用,那么問題來了,代碼編譯哪家強?Eclipse? Android Studio?這些都不對,我們首先需要知道,Eclipse、Android Studio這些屬于開發(fā)IDE,也就是我們的集成開發(fā)環(huán)境,它體現(xiàn)的是一種簡化計算機與開發(fā)者的交互,然而當你接觸的程序架構(gòu)越來越豐富,在了解越來越深入后,你就會發(fā)現(xiàn),很多事情,IDE是無法完成的,比如自動化編譯、定制編譯、版本控制、自動測試等。因此Android與很多語言一樣,引入了Makefile機制。那么Makefile到底有什么好處呢?我們先看一下對Makefile的解釋:一個像Android這樣的大型工程,它的源文件不計其數(shù),不同的功能、模塊,按類型分別放置在不同的目錄中,這些模塊通常會有一個叫Makefile的文件來進行管理。它定義了一系列的規(guī)則來指定模塊,哪些文件需要編譯,以及這些文件該按照怎樣的順序去編譯。甚至,它還可以配置更復雜的功能操作,比如定義編譯規(guī)則,打包規(guī)則等,因為Makefile就像一個shell腳本,不僅可以使用自己的語法,也能調(diào)用操作系統(tǒng)的命令。

可以看到,Makefile最大的好處就是自動化編譯,同時還可以做到可控制的編譯,Android通過Makefile來描述Android各個組件間的聯(lián)系并指導它們進行自動化編譯。Makefile的語法,指定了各個源代碼該如何連接并生成相應的可執(zhí)行程序。這時候大家再來看看我們前面列出的Android源代碼目錄結(jié)構(gòu),每個目錄中,還會包含更多的目錄,而它的每一個最小的功能單位的目錄下,都會有一個Makefile文件,這樣每一級向上,通過這樣一個個Makefile文件,就把整個源代碼有條不紊地聯(lián)系在一起了。

很多人可能對Android源代碼的編譯沒有概念,這里舉一個例子,筆者公司的電腦CPU是i73770,主頻3.4GHz,全編一次Android的代碼需要90分鐘,如果沒有Makefile,簡直無法想象該如何去編譯源代碼。

1.4.2 Android系統(tǒng)目錄

在Android手機里,系統(tǒng)的目錄結(jié)構(gòu)與源代碼目錄結(jié)構(gòu)還是有所不同的,我們通過ADB連接上手機,通過Linux的ls命令查看Android系統(tǒng)的根目錄,如圖1.11所示。其中/system和/data是開發(fā)者非常關(guān)心的兩個目錄。

圖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格式字體替換原字體,達到修改系統(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所示,一些手機中的.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)默認的鈴聲,alarms目錄是鬧鈴提醒,notification目錄是短信或提示音,ringtones目錄是來電鈴聲,而ui目錄則是一些界面音效,如圖1.19所示。

圖1.19 Android /system/media/audio/目錄

● /system/usr/

該目錄用來保存用戶的配置文件,如鍵盤布局、共享、時區(qū)文件等,如圖1.20所示。

圖1.20 Android /system/usr/目錄

● /data/app/

data目錄包含了用戶的大部分數(shù)據(jù)信息。其中,/data/app/這個目錄包含了用戶安裝的App或者升級的App,如圖1.21所示。

圖1.21 Android /data/app/目錄

● /data/data/

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

圖1.22 Android /data/data/目錄

● /data/system/

這個目錄包含了手機的各項系統(tǒng)信息,如圖1.23所示。

圖1.23 /data/system/目錄

● /data/misc/

這個目錄保存了大部分的Wi-Fi、VPN信息,如圖1.24所示。

圖1.24 Android /data/misc/目錄

1.4.3 Android App文件目錄

現(xiàn)在終于回到了我們熟悉的應用層,大家可以長舒一口氣,不用再看幾個GB大小的源代碼了。下面我們就以Android Studio IDE為開發(fā)環(huán)境,來分析一下Android Application的文件目錄結(jié)構(gòu)。

當你使用Android Studio生成一個Android Application工程后,文件目錄結(jié)構(gòu)如圖1.25所示。

圖1.25 Android Application目錄

關(guān)于Eclipse和Android Studio的文件目錄區(qū)別,在第2章中會進行詳細講解,簡單來說,大家只需要了解一點,Android Studio中的Project就相當于Eclipse里面的Workspace,而Android Studio中的Module就相當于Eclipse里面的Project就可以了。

圖1.25中,App目錄中的代碼為應用程序代碼,而下面的Gradle Scripts為編譯腳本,后面我們講Android Studio的使用的時候,會再詳細地了解它們的作用。

總體來看,Android Application的目錄是比較清晰、簡單的,這也得力于Android底層做的良好的封裝和IDE的強大。后面我們的大部分工作都將在這個目錄結(jié)構(gòu)下進行操作。

主站蜘蛛池模板: 东山县| 岗巴县| 达州市| 鄂尔多斯市| 永修县| 新民市| 龙江县| 永平县| 龙胜| 营山县| 壶关县| 莎车县| 太原市| 仙桃市| 兴隆县| 武穴市| 云梦县| 梓潼县| 迁安市| 芷江| 静海县| 体育| 巴林右旗| 清水河县| 开原市| 康乐县| 东阳市| 新巴尔虎左旗| 同江市| 古田县| 宁南县| 响水县| 外汇| 元氏县| 略阳县| 溧阳市| 寻乌县| 若尔盖县| 共和县| 永嘉县| 达孜县|