1. 程式人生 > >Android學習筆記——Android系統整體架構與原始碼目錄

Android學習筆記——Android系統整體架構與原始碼目錄

首先要感謝**@劉望舒**大神的部落格,讓我們這些渣渣有途徑更快速地接觸到Android系統層的內容。

本篇部落格主要介紹了Android系統的整體架構及原始碼的目錄結構。

Android系統架構

Android的系統架構可以分為五層,分別是 應用層、應用框架層、系統執行庫層、硬體抽象層、Linux核心層。

img

應用層

系統內建應用及非系統應用均屬於應用層的級別,它們負責直接與使用者進行互動,一般用Java開發。我們一般開發出來的應用都是屬於應用層。

應用框架層(Framework層)

應用框架層又稱Framework層,為應用的開發人員提供了開發所需的API,我們日常開發基本都是呼叫應用框架層的API,這一層一般也是由Java編寫。

下表列出了這一層主要的元件及簡單描述:

名稱 功能描述
Activity Manager 管理各個應用程式生命週期以及通常的導航回退功能
Location Manager 地理位置以及定位功能服務
Package Manager 管理所有安裝在Android系統中的應用程式
Notification Manager 使得應用程式可以在狀態列中顯示自定義的提示資訊
Resource Manager 應用程式使用的各種非程式碼資源,如本地化字串、圖片、佈局檔案、顏色檔案等
Telephony Manager 管理所有的移動裝置功能
Window Manager 管理所有開啟的視窗程式
Content Providers 使得不同應用程式之間可以共享資料
View System 構建應用程式的基本元件

系統執行庫層(Native層)

系統執行庫層又稱Native層,一般分為兩部分

  • C++程式庫
  • Android執行時庫

C++程式庫

C++程式庫可以被Android系統的不同元件使用,並且通過Framework層為開發者服務。

下表為常見的C++程式庫及其對應功能:

名稱 功能描述
OpenGL ES 3D繪圖函式庫
Libc 從BSD繼承來的標準C系統函式庫,專門為基於嵌入式Linux的裝置定製
Media Framework 多媒體庫,支援多種常用的音訊、視訊格式錄製和回放。
SQLite 輕型的關係型資料庫引擎
SGL 底層的2D圖形渲染引擎
SSL 安全套接層,是為網路通訊提供安全及資料完整性的一種安全協議
FreeType 可移植的字型引擎,它提供統一的介面來訪問多種字型格式檔案

可以看到,我們的常用的很多Framework層的庫都是由Native層的這些C++程式庫封裝而成(如 MediaPlayer、SQLite)

Android執行時庫

Android的執行時庫又分為了核心庫和ART(Android5.0後,Dalvik虛擬機器被ART取代)

核心庫提供了Java語言核心庫的大部分功能,使得開發者可以使用Java語言來開發應用。

相比JVM,Dalvik虛擬機器是專門為移動裝置定製,可以在有限的記憶體中同時執行多個虛擬機器例項。並且每一個Dalvik應用都作為一個獨立的Linux程序來執行。獨立的程序可以防止虛擬機器崩潰時所有程式都被關閉。

而ART的機制則與Dalvik不同。Dalvik中的應用執行時,位元組碼都需要通過即時的編譯轉為機器碼,拖慢應用的效率。而ART中,應用在第一次安裝時便會轉換為機器碼,提高執行時的效率。

硬體抽象層(HAL層)

硬體抽象層位於作業系統核心與硬體電路之間的介面層,目的在於把硬體抽象化,保護硬體廠商的智慧財產權。它隱藏了特定平臺的硬體介面的細節,給作業系統提供了虛擬的硬體平臺,使得其具有了硬體無關性。一般將控制硬體的部分放在硬體抽象層中。

Linux核心層

眾所周知,Android是基於Linux的核心,在此基礎上添加了Android專用的驅動。系統的安全性、記憶體管理、程序管理、網路協議棧和驅動模型等都依賴於這個核心。

Android系統原始碼目錄

我們首先需要了解Android系統原始碼的目錄結構,這樣便於我們後期進行原始碼的分析。我們可以到http://androidxref.com這個網站下載Android系統的原始碼。不過最好將原始碼下載下來。

整體結構

各個版本Android的原始碼根目錄基本類似,如果編譯後會多一個out資料夾儲存編譯產生的檔案。

根目錄結構如下:

  • abi 應用程式二進位制介面
  • art 全新的ART執行環境
  • bionic 系統C庫
  • bootable 啟動引導相關程式碼
  • build 存放系統編譯規則及generic等基礎開發包配置
  • cts Android相容性測試套件標準
  • dalvik dalvik虛擬機器
  • developers 開發者目錄
  • development 應用程式開發相關
  • device 裝置相關配置
  • docs 參考文件目錄
  • external 開源模組相關檔案
  • frameworks 應用程式框架,Android系統核心部分,由Java和C++編寫
  • hardware 主要是硬體抽象層的程式碼
  • libcore 核心庫相關檔案
  • libnativehelper 動態庫,實現JNI庫的基礎
  • ndk NDK相關程式碼,幫助開發人員在應用程式中嵌入C/C++程式碼
  • out 編譯完成後程式碼輸出在此目錄
  • packages 應用程式包
  • pdk Plug Development Kit 的縮寫,本地開發套件
  • platform_testing 平臺測試
  • prebuilts x86和arm架構下預編譯的一些資源
  • sdk sdk和模擬器
  • system 底層檔案系統庫、應用和元件
  • toolchain 工具鏈檔案
  • tools 工具檔案
  • Makefile 全域性Makefile檔案,用來定義編譯規則

可以看到系統原始碼分類清晰,內容龐大且複雜。我們接下來分析應用層部分,也就是packages中的內容。

應用層

應用層位於整個Android系統的最上層,開發者開發的應用程式以及系統內建的應用程式都是在應用層。原始碼根目錄中的packages目錄對應著系統應用層。

應用層的目錄結構如下:

  • apps 核心應用程式
  • experimental 第三方應用程式
  • inputmethods 輸入法目錄
  • providers 內容提供者目錄
  • screensavers 螢幕保護
  • services 通訊服務

可以發現,它存放了核心應用程式、第三方應用、輸入法等等與使用者直接互動的內容,這些都是執行在應用層的。

應用框架層

應用框架層是系統的核心部分,一方面向上提供介面給應用層呼叫,另一方面向下與C/C++程式庫以及硬體抽象層等進行銜接。

應用框架層的主要實現程式碼位於/frameworks/base//frameworks/av目錄,其中/frameworks/base/的目錄結構如下:

  • api 定義API
  • cmds 重要命令:am、app_proce等
  • core 核心庫
  • data 字型和聲音等資料檔案
  • docs 文件
  • graphics 圖形影象相關
  • include 標頭檔案
  • keystore 和資料簽名證書相關
  • libs 庫
  • location 地理位置相關庫
  • media 多媒體相關庫
  • native 本地庫
  • nfc-extras NFC相關
  • obex 藍芽傳輸
  • opengl 2D/3D 圖形API
  • packages 設定、TTS、VPN程式
  • sax XML解析器
  • services 系統服務
  • telephony 電話通訊管理
  • test-runner 測試工具相關
  • tests 測試相關
  • tools 工具

系統執行庫層C/C++部分

系統執行庫層(Native)中的 C/C++程式庫的型別繁多,功能強大,C/C++程式庫並不完全在一個目錄中,

下面是幾個常用且比較重要的C/C++程式庫所在的目錄位置。

  • bionic/ Google開發的系統C庫,以BSD許可形式開源。
  • /frameworks/av/media 系統媒體庫
  • /frameworks/native/opengl 第三方圖形渲染庫
  • /frameworks/native/services/surfaceflinger 圖形顯示庫,主要負責圖形的渲染、疊加和繪製等功能
  • external/sqlite 輕量型關係資料庫SQLite的C++實現