Android系統架構與系統原始碼目錄

風靈使發表於2018-11-12

前言

技術部落格終於可以恢復正常的更新速度了,原因是我編寫的進階書籍的初稿已經完成,竊以為它將會是Android應用書籍中比較有深度的一本,可以說是《Android開發藝術探索》的姊妹篇(祈禱下不會遭雷劈)。在這本書的最後一章我會分析Android底層原始碼,但是畢竟是一本Android應用開發的書,對於底層原始碼閱讀也只能帶大家入個門。因此,在我的部落格中我會新開一個“系統原始碼解析”的系列,該系列的開篇就是本篇文章。

1.Android系統架構

Android系統架構分為五層,從上到下依次是應用層、應用框架層、系統執行庫層、硬體抽象層和Linux核心層。

應用層
系統內建的應用程式以及非系統級的應用程式都是屬於應用層。負責與使用者進行直接互動,通常都是用Java進行開發的。

應用框架層(Java Framework)
應用框架層為開發人員提供了可以開發應用程式所需要的API,我們平常開發應用程式都是呼叫的這一層所提供的API,當然也包括系統的應用。這一層的是由Java程式碼編寫的,可以稱為Java Framework。下面來看這一層所提供的主要的元件。

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

系統執行庫層(Native)
系統執行庫層分為兩部分,分別是C/C++程式庫和Android執行時庫。下面分別來介紹它們。
1.C/C++程式庫
C/C++程式庫能被Android系統中的不同元件所使用,並通過應用程式框架為開發者提供服務,主要的C/C++程式庫如下表2所示。

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

2.Android執行時庫
執行時庫又分為核心庫和ART(5.0系統之後,Dalvik虛擬機器被ART取代)。核心庫提供了Java語言核心庫的大多數功能,這樣開發者可以使用Java語言來編寫Android應用。相較於JVM,Dalvik虛擬機器是專門為移動裝置定製的,允許在有限的記憶體中同時執行多個虛擬機器的例項,並且每一個Dalvik 應用作為一個獨立的Linux 程式執行。獨立的程式可以防止在虛擬機器崩潰的時候所有程式都被關閉。而替代Dalvik虛擬機器的ART 的機制與Dalvik 不同。在Dalvik下,應用每次執行的時候,位元組碼都需要通過即時編譯器轉換為機器碼,這會拖慢應用的執行效率,而在ART 環境中,應用在第一次安裝的時候,位元組碼就會預先編譯成機器碼,使其成為真正的本地應用。


硬體抽象層(HAL)
硬體抽象層是位於作業系統核心與硬體電路之間的介面層,其目的在於將硬體抽象化,為了保護硬體廠商的智慧財產權,它隱藏了特定平臺的硬體介面細節,為作業系統提供虛擬硬體平臺,使其具有硬體無關性,可在多種平臺上進行移植。 從軟硬體測試的角度來看,軟硬體的測試工作都可分別基於硬體抽象層來完成,使得軟硬體測試工作的並行進行成為可能。通俗來講,就是將控制硬體的動作放在硬體抽象層中。

Linux核心層
Android 的核心繫統服務基於Linux 核心,在此基礎上新增了部分Android專用的驅動。系統的安全性、記憶體管理、程式管理、網路協議棧和驅動模型等都依賴於該核心。
Android系統的五層架構就講到這,瞭解以上的知識對以後分析系統原始碼有很大的幫助。

2.Android系統原始碼目錄
我們要先了解Android系統原始碼目錄,為後期原始碼學習打下基礎。關於原始碼的閱讀,你可以訪問androidxref.com/來閱讀系統原始碼。當然,… 映象:mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 。如果覺得麻煩也可以查詢國內的網盤進行下載,推薦使用該百度網盤地址下載:pan.baidu.com/s/1ngsZs, 它提供了多個Android版本的的原始碼下載。


整體結構
各個版本的原始碼目錄基本是類似,如果是編譯後的原始碼目錄會多增加一個out資料夾,用來儲存編譯產生的檔案。Android7.0的根目錄結構說明如下表所示。


| Android原始碼根目錄 | 描述 |
| :--------: | :--------:|
| 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| 應用程式包 |
| packages| sdk和模擬器 |
| system| 底層檔案系統庫、應用和元件 |
| toolchain| 工具鏈檔案 |
| tools| 工具檔案|
| Makefile| 全域性Makefile檔案,用來定義編譯規則 |

表3

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

應用層部分
應用層位於整個Android系統的最上層,開發者開發的應用程式以及系統內建的應用程式都是在應用層。原始碼根目錄中的packages目錄對應著系統應用層。它的目錄結構如表4所示。

| packages目錄 | 描述 |
| :--------: | :--------:|
| apps| 核心應用程式 |
| experimental| 第三方應用程式 |
|inputmethods| 輸入法目錄 |
| providers| 內容提供者目錄 |
| screensavers | 螢幕保護 |
| services| 通訊服務 |
| wallpapers| 牆紙|



從目錄結構可以發現,packages目錄存放著系統核心應用程式、第三方的應用程式和輸入法等等,這些應用都是執行在系統應用層的,因此packages目錄對應著系統的應用層。


應用框架層部分
應用框架層是系統的核心部分,一方面向上提供介面給應用層呼叫,另一方面向下與C/C++程式庫以及硬體抽象層等進行銜接。 應用框架層的主要實現程式碼在/frameworks/base和/frameworks/av目錄下,其中/frameworks/base目錄結構如表5所示。


| /frameworks/base目錄 | 描述 | /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| 工具|
| wifi | wifi無線網路 |

表5

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++實現
表6

講完 C/C++程式庫部分,剩下的部分我們在表3已經給出:Android執行時庫的程式碼放在art/目錄中。硬體抽象層的程式碼在hardware/目錄中,這一部分是手機廠商改動最大的一部分,根據手機終端所採用的硬體平臺會有不同的實現。

---
歡迎關注我的微信公眾號,第一時間獲得部落格更新提醒,以及更多成體系的Android相關原創技術乾貨。
掃一掃下方二維碼或者長按識別二維碼,即可關注。

相關文章