Android的架構圖如下,圖中按照功能結構及面向人群進行划分,可以看出Android分成三個部分:
- 應用部分:包含在Android設備上運行的所有應用,它們是Android系統中直接面向用戶的部分。
- 核心部分: Android系統中核心的功能實現,包括應用框架、核心類庫等,每個Android應用的開發者,都是在此基礎上進行應用開發的。
- 底層部分:主要指Android寄宿的Linux操作系統及相關驅動。通常來說,只有硬件廠商和從事Android移植的開發者,才會基於此來進行開發。
除了上述划分方式以外,從系統實際的架構模型來看,Android則可以分成以下幾個層次:
- 應用層
- 框架層
- 運行時
- 核心類庫
- 硬件抽象層
- Linux內核
本文的后續內容將針對以上各層逐一進行分析。
1.1.1 應用層
對於普通的用戶而言,只能通過具體的應用來判斷移動平台的優劣。即便一個移動平台具有最華麗的技術,但是如果不能給用戶提供最得心應手的應用,頂多也只能贏得無冕之王的名頭,而無法抓住用戶的心,贏得市場的認可。
Android應用層由運行在Android設備上的所有應用共同構成,它不僅包括通話、短信、聯系人等系統應用(隨Android系統一起預裝在移動設備上),還包括其他后續安裝到設備中的第三方應用。
第 三方應用都是基於Android提供的SDK(Software Development Kit)進行開發的,並受到SDK接口的約束。而預裝在設備中的系統應用,則可以調用整個框架層的接口和模塊,其中的很多接口在SDK中是隱藏的,因此, 系統應用具有比第三方應用更多的權利。
Android的應用都是基於Java語言來開發的,但在很多應用(尤其是游戲)中,需要進行大規模 的運算和圖形處理,以及使用開源C/C++類庫。通過Java來實現,可能會有執行效率過低和移植成本過高等問題。因此在Android開發中,開發者可 以使用C/C++來實現底層模塊,並添加JNI(Java Native Interface)接口與上層Java實現進行交互,然后利用Android提供的交叉編譯工具生成類庫並添加到應用中。
為了讓應用開發者能夠繞過框架層,直接使用Android系統的特定類庫,Android還提供了NDK(Native Development Kit),它由C/C++的一些接口構成,開發者可以通過它更高效地調用特定的系統功能。
但在Android上,開發者通常只能使用C/C++編寫功能類庫,而不是整個應用。這是因為,諸如界面繪制、進程調度等核心機制是部署在框架層並通過Java來實現的,應用只有按照它們規定的模式去編寫特定的Java模塊和配置信息,才能夠被識別、加載和執行。
小 貼士 從Android 2.3(API 9)開始,新增了android.app.NativeActivity類,它是通過調用預定義的JNI接口來實現的。開發者可以基於NDK,通過 C/C++語言來實現具體功能。這就意味着,開發者僅通過C/C++語言就能實現整個應用。這對於游戲開發者而言是一大喜訊,但由於控件在Android 中並沒有Native的實現,普通的應用開發者通常還是需要通過Java來實現上層界面。
1.1.2 框架層
框架層是Android系統中最核心的部分,它集中體現了Android系統的設計思想。在Android之前,有很多基於Linux內核打造的移動平台。作為超越前輩的成功范例,框架層的設計正是Android脫穎而出的關鍵所在。
框 架層由多個系統服務(System Service)共同組成,包括組件管理服務、窗口管理服務、地理信息服務、電源管理服務、通話管理服務,等等。所有服務都寄宿在系統核心進程 (System Core Process)中,在運行時,每個服務都占據一個獨立的線程,彼此通過進程間的通信機制(Inter-Process Communication,IPC)發送消息和傳輸數據。
應用層中的應用,時刻都在與這些系統服務打交道。每一次構造窗口、處理用戶交互事件、繪制界面、獲得當前地理信息、了解設備信息等操作,都是在各個系統服務的支持下實現的。
而 對於開發者而言,框架層最直觀的體現就是SDK,它通過一系列的Java功能模塊,來實現應用所需的功能。SDK的設計決定了上層應用的開發模式、開發效 率及能夠實現的功能范疇。因此,對於開發者而言,關注SDK的變遷是一件很有必要的事情,SDK每個新版本的誕生,都意味着一些老的接口會被調整或拋棄, 另一些新的接口和功能火熱出爐。開發者不但要查看和關注那些被修改的接口,來檢查應用的兼容性,並采取相應的策略去適應這些變化,更重要的是,開發者還要 追蹤新提供的接口,尋找改進應用的機會,甚至是尋求開發新應用的可能。
從系統設計的角度來看,Android期望框架層是所有應用運行的核 心,參與到應用層的每一次操作中,並進行全局統籌。Android應用的最大特征是基於組件的設計方式。每個應用都由若干個組件構成,組件和組件之間並不 會建立通信信道,而是通過框架層的系統服務,集中地調度和傳遞消息。這樣的設計方式相當於增加了一個中間層,該層了解所有組件的狀況,可以更智能地進行協 調,從而提升了整個系統的靈活性。
1.1.3 運行時
和所有的Java程序運行平台一樣,為了實現Java程序在運行階段的二次編譯, Android為它們提供了運行時(Runtime)的支撐。
Android的運行時由Java核心類庫和Java虛擬機Dalvik共同構成。Java核心類庫涵蓋了Android框架層和應用層所要用到的基礎Java庫,包括Java對象庫、文件管理庫、網絡通信庫,等等。
Dalvik 是為Android量身打造的Java虛擬機,負責動態解析執行應用、分配空間、管理對象生命周期等工作。如果說框架層是整個Android的大腦,決定 了Android應用的設計特征,那么,Dalvik就是Android的心臟,為Android的應用提供動力,決定它們的執行效率。
與 為低端移動設備而設計的J2ME虛擬機不同,Dalvik是專門為高端設備而優化設計的。它沒有采用基於棧的虛擬機架構,而是采取了基於寄存器的虛擬機架 構設計。通常來說,基於棧的虛擬機對硬件的依賴程度小、生成的應用更節約空間,可以適配更多的低端設備;而基於寄存器的虛擬機,對硬件的門檻會更高一些, 編譯出的應用可能會耗費稍多的存儲空間,但它的執行效率更高,更能夠發揮高端硬件(主要指處理器)的能力。
Dalvik沒有沿用傳統的 Java二進制碼(JavaBytecode)作為其一次編譯的中間文件,而是應用了新的二進制碼格式文件.dex。在Android應用的編譯過程中, 它會先生成若干個.class文件,然后統一轉換成一個.dex文件。在轉換過程中,Android會對部分.class文件中的指令做轉義,使用 Dalvik特有的指令集OpCodes來替換,以提高執行效率。同時,.dex會整合多個.class文件中的重復信息,並對冗余部分做全局的優化和調 整,合並重復的常量定義,以節約常量池耗費的空間。這使得最終得到的.dex文件通常會比將.class文件壓縮打包得出的.jar文件更精簡。
為 了提升Android應用的執行效率,從垃圾回收器(Garbage Collection,GC)到編譯器,Dalvik一直在各個方面進行優化。經常可以聽到這樣的消息:“新版本的Android系統,比上一個版本的效 率高了x倍。”這大都是改善Dalvik的效果。在Android 2.2中,Dalvik引入了對JIT(Just-in-time)編譯的支持,將上層應用的執行效率提升了2~4倍,開啟了Android發展的新篇 章。
由於對於大部分應用開發者而言,無須了解Android運行時的具體細節,因此,本書后續將不會詳細介紹Android運行時的相關內容,有興趣的讀者,可以另行查閱相關資料和源代碼。
1.1.4 核心類庫
對於框架層而言,核心類庫就是它的“賢內助”。每一次Android系統升級,能看到的都是框架層SDK的變遷,增加了新的功能,提供了新的接口。而在這些新功能的背后,核心類庫都是居功至偉。
核心類庫由一系列的二進制動態庫共同構成,通常使用C/C++進行開發。與框架層的系統服務相比,核心類庫不能夠獨立運行於線程中,而需要被系統服務加載到其進程空間里,通過類庫提供的JNI接口進行調用。
核 心類庫的來源主要有兩種,一種是系統原生類庫,Android為了提高框架層的執行效率,使用C/C++來實現它的一些性能關鍵模塊,如:資源文件管理模 塊、基礎算法庫,等等。而另一種則是第三方類庫,大部分都是對優秀開源項目的移植,它們是Android能夠提供豐富功能的重要保障,如:Android 的多媒體處理,依賴於開源項目OpenCORE的支持;瀏覽器控件的核心實現,是從Webkit移植而來;而數據庫功能,則是得益於Sqlite。 Android會為所有移植而來第三方類庫封裝一層JNI接口,以供框架層調用。
為了幫助游戲和圖形圖像處理等領域的開發者搭建更高效的應 用,Android將數學函數庫、OpenGL庫等核心類庫以NDK的形式提供給開發者,開發者可以基於NDK更高效地構建算法,進行圖形圖像繪制。從實 踐的角度看,只要能獲取到底層類庫的頭文件信息,開發者就可以逾越NDK的界限,用其他核心類庫的接口進行開發。但這樣做的危險之處在於兼容性 差,Android在版本變遷時,可能會替換或修改一些類庫接口或實現,這就會導致依賴於這些類庫的應用無法運行。而NDK提供的都是穩定的類庫實現,不 會再做修改,以保證使用NDK的應用具有向上的兼容性。
1.1.5 硬件抽象層和Linux內核
Android 系統並不是從零開始設計的,而是搭建在Linux內核之上。狹義的Android系統,主要指的是Linux內核以上的各層,從運行的角度來看,它們只是 運行在Linux系統上的一些進程,並不是完整的系統,離開了Linux的支撐,就像魚兒離開了水一樣,無法運行。
Linux之於 Android最大的價值,便是其強大的可移植性。Linux可以運行在各式各樣的芯片架構和硬件環境下,而依托於它的Android系統,也便有了強大 的可移植性。同時,Linux像一座橋梁,將Android的上層實現與底層硬件連接起來,使它們可以不必直接耦合,因此,降低了移植的難度。
而硬件抽象層(Hardware Abstract Layer,HAL),是Android為廠商定義的一套接口標准,它為框架層提供接口支持,廠商需要根據定義的接口實現相應功能。
------------------------------
本文節選自《Android開發精要》一書,范懷宇著,由機械工業出版社出版。
【內容簡介】
如 何才能寫出貼近Android設計理念、能夠更加高效和可靠運行的Android應用?通過Android的源代碼去了解其底層實現細節是最重要的方法之 一!然而,Android系統太過於龐大,源代碼實現復雜,學習的技術門檻和時間成本都很高。 有沒有一種方法既能幫助開發者深入理解Android應用開發,又能不被底層大量的實現細節所羈絆,迅速掌握編寫高質量Android應用所需的知識?本 書針對這個問題給出了完美的答案!它從Android繁雜的源代碼中抽取出了Android開發的“精華”和“要點”,剝離了大量瑣碎的底層實現細節,進 行了高度概括和總結,不僅能幫助開發者迅速地從宏觀上理解整個Android系統的設計理念,而且能幫助開發者迅速地從微觀上掌握核心知識點的原理,從而 編寫出高質量的Android應用。
本書共13章,在邏輯上分為4個部分。第一部分(1~2章):第1章系統介紹了Android的系統架 構、核心模塊和設計思想,旨在讓讀者真正理解它的設計理念;第2章講解了Android源代碼的獲取、編譯、閱讀和編輯的方法。第二部分(3~6章):第 3章深入闡述了Android組件機制的設計理念和重要特征,並詳細介紹了4大組件的方法和原理;第4章講解了Intent對象和Android的意圖機 制,闡明了Android是如何將來自不同應用、不同進程的組件整合在一起的;第5章解析了Android中各個組件的生命周期,包括組件的進程模型和線 程模型;第6章從開發的角度詳細闡述了組件間數據傳輸的解決方案,以及它們的優缺點和適用場景。第三部分(7~8章):第7章深入講解了Android的 控件框架,結合實際項目對重要控件的實現和使用逐一進行了分析,還包含Android 4.0界面開發的實踐“精華”;第8章分析了Android的資源體系,剖析了Android底層對資源的處理。第四部分(9~13章):第9章講解了 Android的數據存儲結構,以及不同數據存儲模式的使用要點;第10章分析了Android的各種網絡連接方式,涵蓋NFC和基於WiFi的P2P連 接等內容;第11章講解了Android的定位服務、地址服務和地圖服務的框架實現;第12章仔細分析了Android各種多媒體功能的實現機制;第13 章對Android中比較有特色的一些模塊的實現細節進行了分析。
【作者簡介】
范懷宇,資深Android開發工程師,畢業於清華大學,從事移動開發多年,對Android系統有頗為深入的研究,開發經驗十分豐富。曾就職於網易有道,負責完成了有道詞典Android版、網易 掌上郵Android版、網易八方Android版等項目的開發工作,現就職於豌豆實驗室,負責豌豆莢2.0版本的設計和開發。
作者微博:@duguguiyu 個人站點:http://flyvenus.net
