本文主要介紹Android的系統架構,Android使用linux內核(Marco kernel),但是Android的架構又與Linux系統有所不同,因此在介紹Android系統架構之前,我們先一起來了解一下Linux系統的架構。
Linux系統架構
Linux架構如下圖所示:
Linux系統架構
- Computer Resources:硬件資源
- Kernel:內核
- Shell:shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令并把它送入內核去執行,是一個命令解釋器
- Programs/Utilities/Tools:庫函數、工具等
- File systems:文件系統是文件存放在磁盤等存儲設備上的組織方法。Linux系統能支持多種目前流行的文件系統,如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。
- User Application: Linux應用,標準的Linux系統一般都有一套被稱為應用程序的程序集,它包括文本編輯器、編程語言、X Window、辦公套件、Internet工具和數據庫等
Linux系統一般由4個組成部分:內核Kernel、shell、文件系統和應用程序。內核、shell和文件系統一起組成了基本的操作系統結構,它們讓用戶可以管理文件、運行程序并使用系統。
Linux開機后,內核啟動,激活內核空間,抽象硬件、初始化硬件參數等,運行并維護虛擬內存、調度器、信號及進程間通信(IPC)。
內核啟動后,再加載Shell和用戶應用程序,用戶應用程序使用CC++編寫,被編譯成機器碼,形成一個進程,通過系統調用(Syscall)與內核系統進行聯通。進程間交流需要使用特殊的進程間通信(IPC)機制。
Android系統架構
看完了Linux架構,我們再來一起看看Android系統架構。Android的系統非常復雜和龐大,底層以Linux內核為基礎,上層采用帶有虛擬機的JAVA層,通過JNI技術,將上下層打通。
先來看一張google提供經典Android架構圖,從上往下依次為應用層(System Apps)、應用框架層(Java API Framework)、運行層(系統Native庫和Android運行時環境)、硬件抽象層(HAL)、Liunx 內核(Marco Kernel)。每一層都有對應的進程、系統庫。
Android系統架構
- 應用層(System Apps)
該層中包含所有的Android應用程序,包括電話、相機、日歷等,我們自己開發的Android應用程序也被安裝在這層;大部分的應用使用JAVA開發,現在Google也開始力推kotlin進行開發
- 應用框架層(Java API Framework)
這一層主要提供構建應用程序是可能用到的各種API,Android自帶的一些核心應用就是使用這些API完成的,開發者也可以通過使用API來構建自己的應用程序。
- 運行層
1)系統Native庫
Android包含一些C/C++庫,這些庫能被Android系統中不同的組件使用
2)Android運行時環境
Android包括了一個核心庫,該核心庫提供了Java編程語言核心庫的大多數功能。虛擬機也在該層啟動。
每個Android應用都有一個專有的進程,這些進程每個都有一個Dalivik虛擬機實例,并在該實例中運行。
- 硬件抽象層(HAL)
Android的硬件驅動與Linux不同,傳統的Liunx內核驅動完全存在于內核空間中。但是Android在內核外部增加了一個硬件抽象層(HAL-Hardware Abstraction Layer),把一部分硬件驅動放到了HAL層。
為什么Android要這么做呢?
Linux內核采用了GPL協議,如果硬件廠商需要支持Linux系統,就需要遵照GPL協議公開硬件驅動的源代碼,這勢必會影響到硬件廠家的核心利益。
Android的HAL層運行在用戶空間,HAL是一個“空殼”,Android會根據不同的需要,加載不同的動態庫。這些動態庫由硬件廠家提供。硬件廠家把相關硬件功能寫入動態庫,內核中只開放一些基本的讀寫接口操作。這樣一些硬件廠家的驅動功能就由內核空間移動到了用戶空間。
Android的HAL層遵循Apache協議,并不要求它的配套程序,因此廠家提供的驅動庫不需要進行開放,保護了硬件廠家的核心利益。
- Liunx 內核(Marco Kernel)
Android平臺的基礎是Linux內核,比如ART虛擬機最終調用底層Linux內核來執行功能。Linux內核的安全機制為Android提供相應的保障,也允許設備制造商為內核開發硬件驅動程序。