安卓进阶之android系统架构
安卓進階之android架構
安卓進階躲不開閱讀源碼和深入了解安卓的底層,這是一篇入門級別的文章,可以對安卓架構有個大體的認識。
AOSP與Android系統架構
首先要理解andriod和AOSP的關系,我們日常開發的安卓跟市面上的安卓不是一個意思,我們開發的是安卓app,市面上的安卓其實是安卓系統。
維基百科:Android是基于Linux 內核和其他開源軟件的修改版本的移動操作系統,主要為智能手機和平板電腦等觸摸屏移動設備設計。
官方文檔:**Android 開放系統平臺 (Android open source project AOSP)**是公開可用且可修改的 Android 源代碼。任何人都可以為他們的設備下載和修改 AOSP。 AOSP 提供完整且功能齊全的 Android 移動平臺實現。
五層的安卓架構(下圖左邊),一些書籍或者博客上常見的這張圖;最新版可看官方文檔(回頭看這篇文章的時候可能也會過時)。以下介紹會結合兩個圖進行說明。
最新的AOSP軟件堆棧架構如下圖右邊,即我們說的android系統架構:
詳細介紹如下:
應用層(System apps)
包括Android app、Privileged app、Device manufacture app等應用程序,system apps的意思就是手機系統中的apps,兩個版本在這一層是一樣的。
- 安卓應用(Android app):僅使用 Android SDK 中的 Android API 創建的應用程序。
- 特權應用程序(Privileged app):結合使用 Android 和系統 API 創建的應用程序。這些應用程序必須作為特權應用程序預安裝在設備上。
- 設備制造應用程序(Device manufacture app):使用 Android API、系統 API 和直接訪問 Android 框架實現的組合創建的應用程序。
應用框架層(Java API Framework)
我們平時開發都是用到這一層提供的API,而這一層是java編寫的,所以稱為Java API。Android 4大組件,6大布局,view等系統定義的原生組件都在這層。
由于Framkwork層和Android SDK 是有交集的(或者是包含關系),舊版本中其實是把Framework層和Android SDK合并作為一層去介紹了。
-
Framework層
又稱安卓框架。一組 Java 類、接口和其他構建應用程序的預編譯代碼。該框架的某些部分可通過使用 Android SDK 的 Android API 公開訪問。Android 框架代碼在應用進程中運行。
-
Android SDK = Android API + System API
又稱安卓開發工具包。一個軟件開發工具包,用于創建與 Android 框架交互的應用程序。 Android SDK 由適用于所有應用程序的 Android API 和僅適用于特權應用程序的系統 API 組成。
后續的源碼閱讀會經常看到ActivityManagerService(AMS)、WindowManagerService(WMS)這些,這些都是FrameWork層的源碼。
| Activity Manager(活動管理器) | 管理各個應用程序生命周期,以及常用的導航回退功能 |
| Location Manager(位置管理器) | 提供地理位置及定位功能服務 |
| Package Manager(包管理器) | 管理所有安裝在Android系統中的應用程序 |
| Notification Manager(通知管理器) | 使得應用程序可以在狀態欄中顯示自定義的提示信息 |
| Resource Manager(資源管理器) | 提供應用程序使用的各種非代碼資源,如本地化字符串、圖片、布局文件、顏色文件等 |
| Telephony Manager(電話管理器) | 管理所有的移動設備功能 |
| Window Manager(窗口管理器) | 管理所有開啟的窗口程序 |
| Content Provider(內容提供者) | 使得不同應用程序之間可以共享數據 |
| View System(視圖系統) | 構建應用程序的基本組件 |
系統服務(System services)
這個是五層架構中沒有提及的部分,是在新版中單獨分離出來的一層。
系統服務是模塊化的、集中的組件,例如system_server 、SurfaceFlinger 和 MediaService。
**Android 框架 API 公開的功能與系統服務通信以訪問底層硬件。**所以它夾在應用框架層和運行庫層之間。
系統運行庫層
舊版中系統運行庫包括native庫和ART庫。
新版中兩者是分開的,而且并不在同一層,舊版中的本機C/C++庫,在新版中擴展為本機的進程和庫。
-
ART庫:Android run time是 AOSP提供的Java應用運行環境。所以我們的程序采用java語言編寫, 程序在Android運行時中執行。ART 將應用程序的字節碼轉換為特定于處理器的指令,這些指令由設備的運行時環境執行。
運行時庫包括核心庫和ART(Android5.0后,Dalvik被ART取代),其中核心庫提供了Java語言核心庫的大多數功能,這樣開發者可以使用Java語言來編寫Android應用。
-
Native daemons and libraries:本機守護進程和庫。
- 該層中的本機守護進程包括init 、 healthd 、 logd和storaged 。這些守護進程直接與內核或其他接口交互,不依賴于基于用戶空間的 HAL 實現。
- 該層中的本機庫包括libc 、 liblog 、 libutils 、 libbinder和libselinux 。這些本機庫直接與內核或其他接口交互,不依賴于基于用戶空間的 HAL 實現。
硬件抽象層(HAL)
HAL 是一個抽象層,具有供硬件供應商實現的標準接口。 HAL 允許 Android 不了解較低級別的驅動程序實現。使用 HAL 允許在不影響或修改更高級別系統的情況下實現功能。
Linux 內核層(Linux Kernel)
作為任何操作系統的核心部分,內核與設備上的底層硬件進行對話。在可能的情況下,AOSP 內核被拆分為與硬件無關的模塊和特定于供應商的模塊。
andriod內核是基于Linux內核的,在此基礎上添加了關于安卓的驅動。
系統的安全性、內存管理、進程管理、網絡協議棧和驅動模型等都依賴于該內核。
其中的驅動包括:音頻(Audio)、android IPC機制(Binder機制)跨進程通訊、顯示 (Display)主要是屏幕顯示、按鍵(Keypad) 處理按鍵的分發等、藍牙(BlueTooth)、相機(Camera)、內存分配與共享(Shared Memory)、USB、WIFI、電源管理(power management)
Andriod系統源碼目錄
官方網站:https://cs.android.com/android/platform/superproject
國內網站:https://www.androidos.net.cn/android/10.0.0_r6/xref
整體架構
| 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文件,用來定義編譯規則 |
應用層部分
應用層位于整個Android系統的最上層,源碼根目錄中的packages目錄對應著系統應用層。它的目錄結構如下:
| apps | 核心應用程序 |
| experimental | 第三方應用程序 |
| inputmethods | 輸入法目錄 |
| providers | 內容提供者目錄 |
| screensavers | 屏幕保護 |
| services | 通信服務 |
| wallpapers | 墻紙 |
應用框架層
應用框架層一方面向上提供接口給應用層調用,另一方面向下與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 | 工具 |
| wifi | wifi無線網絡 |
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++實現 |
Android運行時庫的代碼放在art/目錄中。硬件抽象層的代碼在hardware/目錄中,這一部分是手機廠商改動最大的一部分,根據手機終端所采用的硬件平臺會有不同的實現。
參考文章
安卓操作系統(維基百科)
Android進階解密第一章
Android系統基礎架構
總結
以上是生活随笔為你收集整理的安卓进阶之android系统架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pc端不同浏览器兼容性问题及解决方案
- 下一篇: 微商如何玩?微客巴巴告诉你10条超级干货