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

第1章
Android體系與系統架構

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

學習本章,你將了解到以下內容:

● Google生態系統

● Android系統架構

● Android源代碼與系統目錄結構

1.1 Google生態系統

Android自誕生以來,就以一個“富二代”的形象出現在世人的眼中。從Google的收購,到成立開放手機聯盟,到現在一舉成為市場占有率最高的移動操作系統,Android一直就流淌著“富二代”的血。底層通過最快的C語言保證效率,上層使用Java簡單、快速進行開發,開放的系統讓各個Android社區、開發者論壇空前火爆,甚至是可以進行無限可能的系統定制化??梢哉fAndroid的到來,奠定了移動操作系統一個里程碑式時代的開始?,F在,Google正利用其搜索、移動、web的各個入口,來逐漸掌握互聯網的控制權。而Android有了Google這樣一個“干爹”的支持,更是如魚得水,不僅在搜索上利用Google Now的優勢,更利用Google Map這樣一個強有力的工具,將移動系統與Web系統緊密地聯系在了一起。

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

圖1.1 人類進化史

圖1.2 Android進化史

1.2 Android系統架構

我們每天都在講“Android”、“Android”,可誰能告訴我,“Android”到底是什么呢?從宏觀上講,Android是一個移動操作系統,但這是一個很寬泛的概念。達·芬奇通過解剖了解人體結構,才能把人物畫得逼真傳神,那么我們今天也來“解剖”一下Android。

如圖1.3所示,這是一張講解Android系統架構的經典示意圖。它將Android大致分為了四層,即Linux內核層、庫和運行時、Framework層和應用層。Android的體系架構鼓勵系統組件重用,共享組件間的數據,并且定義組件間的訪問權限控制??梢哉f,這些層次結構既是相互獨立,又是相互關聯的。

圖1.3 Android系統架構

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

圖1.4 Android架構總覽

1.2.1 Linux

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

1.2.2 Dalvik與ART

Dalvik包含了一整套的Android運行環境虛擬機,每個App都會分配Dalvik虛擬機來保證互相之間不受干擾,并保持獨立。它的特點是在運行時編譯。打個比方,就好比你買了一輛可折疊的自行車,平時是折疊的,只有騎的時候,才需要組裝起來用。而在Android 5.X版本開始,ART模式已經取代了Dalvik, ART采用的是安裝時就進行編譯,以后運行時就不用編譯了,這就好比你買了輛組裝好了的自行車,裝好就可以騎了。當然,對在其虛擬機環境中運行的大部分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中的一些標準庫,所謂標準,就是開發者在開源環境中可以使用的開發庫。

圖1.6 Standard libraries

1.2.5 Application

圖1.7和圖1.8分別表示了使用NDK開發和Java開發的App的主要構成??梢钥闯?,不管是哪種App,它們都有Android Manifest文件、Dalvik Classes、Resource Bundle這幾個東西,相信解壓過Apk的朋友應該注意到了,這些就是我們解壓Apk后的文件。

圖1.7 Android NDK App

圖1.8 Android SDK App

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

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

1.3 Android App組件架構

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

1.3.1 Android四大組件如何協同工作

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

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

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

1.3.2 應用運行上下文對象

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

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

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

● 創建Application

● 創建Activity

● 創建Service

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

1.4 Android系統源代碼目錄與系統目錄

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

1.4.1 Android系統源代碼目錄

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

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

圖1.9 AndroidXRef1

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

圖1.10 AndroidXRef2

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

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

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

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

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

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

1.4.2 Android系統目錄

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

圖1.11 Android系統目錄

● /system/app/

這里面放的是一些系統的App,如圖1.12所示為App目錄。

圖1.12 Android /system/app/目錄

● /system/bin/

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

圖1.13 Android /system/bin/目錄

● /system/build.prop

這里記錄的是系統的屬性信息,如圖1.14所示。

圖1.14 Android /system/build.prop

● /system/fonts/

系統字體存放目錄root后可下載TTF格式字體替換原字體,達到修改系統字體的效果,如圖1.15所示fonts目錄。

圖1.15 Android /system/fonts/目錄

● /system/framework/

系統的核心文件、框架層,如圖1.16所示。

圖1.16 Android /system/framework/目錄

● /system/lib/

存放幾乎所有的共享庫(.so)文件,如圖1.17所示,一些手機中的.so庫文件。

圖1.17 Android /system/lib/目錄

● /system/media/

該目錄用來保存系統提示音、系統鈴聲,如圖1.18所示。

圖1.18 Android /system/media/目錄

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

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

● /system/usr/

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

圖1.20 Android /system/usr/目錄

● /data/app/

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

圖1.21 Android /data/app/目錄

● /data/data/

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

圖1.22 Android /data/data/目錄

● /data/system/

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

圖1.23 /data/system/目錄

● /data/misc/

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

圖1.24 Android /data/misc/目錄

1.4.3 Android App文件目錄

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

當你使用Android Studio生成一個Android Application工程后,文件目錄結構如圖1.25所示。

圖1.25 Android Application目錄

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

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

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

主站蜘蛛池模板: 额济纳旗| 敦煌市| 岳普湖县| 遵化市| 冕宁县| 壤塘县| 武强县| 武陟县| 炉霍县| 定安县| 佛冈县| 乡城县| 确山县| 蓝山县| 禹州市| 鄂尔多斯市| 韶关市| 凤城市| 灵石县| 清原| 襄汾县| 本溪| 潜江市| 射阳县| 军事| 饶平县| 河津市| 饶平县| 秦安县| 鱼台县| 湖口县| 吉安县| 合阳县| 金门县| 昂仁县| 玉门市| 铜山县| 周口市| 江口县| 阿克陶县| 宁国市|