Android系統到底是什麼樣子的?app爲什麼能夠在Android系統中運行,怎樣運行的。
下圖是官方標準的Android系統架構圖:
(藍色:java程序,java代碼編寫;黃色:運行JAVA程序而實現的虛擬機;綠色:C/C++語言編寫的程序庫;紅色:linux內核+driver)
由上圖我們知道Android系統分爲四層:
1、Applications(應用程序層):就是我們的app層,各種app。
2、Framework(應用程序架構層):提供開發Android應用程序所需的一系列類庫,使開發人員可以進行快速的應用程序開發。Activity、Service、Notification等等都是framework提供給我們的。
應用程序框架層類庫名稱 | 功能 |
活動管理器(Activity Mananger) | 管理各個應用程序生命週期並提供常用的導航回退功能,爲所有程序的窗口提供交互的接口 |
窗口管理器(Window Manager) | 對所有開啓的窗口程序進行管理 |
內容提供器(Content Provider) | 提供一個應用程序訪問另一個應用程序數據的功能,或者實現應用程序之間的數據共享 |
視圖系統(View System) | 創建應用程序的基本組件,包括列表(lists),網格(grids),文本框(text boxes),按鈕(buttons),還有可嵌入的web瀏覽器。 |
通知管理器(Notification Manager) | 使應用程序可以在狀態欄中顯示自定義的客戶提示信息 |
包管理器(Package Manager) | 對應用程序進行管理,提供的功能諸如安裝應用程序,卸載應用程序,查詢相關權限信息等。 |
資源管理器(Resource Manager) | 提供各種非代碼資源供應用程序使用,如本地化字符串,圖片,音頻等 |
位置管理器(Location Manager) | 提供位置服務 |
電話管理器(Telephony Manager) | 管理所有的移動設備功能 |
XMPP服務 | 是Google在線即時交流軟件中一個通用的進程,提供後臺推送服務 |
我們可以稱Framework層才真正是Java語言實現的層,在這層裏定義的API都是用Java語言編寫。但是又因爲它包含了JNI的方法,JNI用C/C++編寫接口,根據函數表查詢調用核心庫層裏的底層方法,最終訪問到Linux內核。那麼Framework層的作用就有2個。
1.用Java語言編寫一些規範化的模塊封裝成框架,供APP層開發者調用開發出具有特殊業務的手機應用。
2.用Java Native Interface調用core lib層的本地方法,JNI的庫是在Dalvik虛擬機啓動時加載進去的,Dalvik會直接去尋址這個JNI方法,然後去調用。
3、Libraries(系統運行時庫層):從系統結構圖,這層有兩個部分。
3.1、Librares:核心庫提供了Java5 se API的多數功能,並提供Android的核心API,如android.os,android.net,android.media等。C/C++庫的集合,供Android系統的各個組件使用。這些功能通過Android的應用程序框架(application framework)暴露給開發者。各類庫說明如下:
系統類庫名稱 | 說明 |
Surface Manager | 執行多個應用程序時,管理子系統的顯示,另外也對2D和3D圖形提供支持 |
Media Framework | 基於PacketVideoOpenCore的多媒體庫,支持多種常用的音頻和視頻格式的錄製和回放,所支持的編碼格式包括MPEG4,MP3,H264,AAC,ARM |
SQLite | 本地小型關係數據庫,Android提供了一些新的SQLite數據庫API,以替代傳統的耗費資源的JDBC API |
OpenGL|ES | 基於OpenGL ES 1.0API標準實現的3D跨平臺圖形庫 |
FreeType | 用於顯示位圖和矢量字體 |
WebKit | Web瀏覽器的軟件引擎 |
SGL | 底層的2D圖形引擎 |
Libc(bionic l ibc) | 繼承自BSD的C函數庫bionic libc,更適合基於嵌入式Linux的移動設備 |
SSL | 安全套接層,是爲網絡通信提供安全及數據完整性的一種安全協議 |
3.2、Android runtime(Core Librares + Dalvik虛擬機):
Dalvik虛擬機:Dalvik虛擬機是基於apache的java虛擬機(JVM),並被改進以適應低內存,低處理器速度的移動設備環境。Dalvik虛擬機依賴於Linux內核,實現進程隔離與線程調試管理,安全和異常管理,垃圾回收等重要功能。(這裏提到java虛擬機,簡單敘述一下與Dalvik虛擬機區別:a、java虛擬機運行的是.class,Dalvik虛擬機運行的是.dex;b、java虛擬機基於棧架構。程序在運行時虛擬機需要頻繁的從棧上讀取或寫入數據。Dalvik虛擬機基於寄存器架構,數據的訪問通過寄存器間直接傳遞,這樣的訪問方式比基於棧方式快的多)
關於Dalvik虛擬機這是比較低版本4.4以下的了,從android4.4開始就出現了ART(android runtime),用來代替Dalvik的新型運行環境。當然在4.4的正式環境中用的還是Dalvik,真正開始用ART取代Dalvik是從android5.0開始的。在啓用ART模式後,系統在安裝應用的時候會進行一次預編譯,在安裝應用程序時會先將代碼轉換爲機器語言存儲在本地,這樣在運行程序時就不會每次都進行一次編譯了,執行效率也大大提升(這裏不進行詳細討論)。
這裏還有個重點,在上一層(Framework層:java代碼)與這一層(系統運行時庫層:C\C++代碼)他們又是怎麼能調用的呢?這裏就涉及到了一個JNI:
JNI:Java本地接口(Java Native Interface),它是一個協議。用來溝通Java代碼和外部的本地C/C++代碼, 通過該協議 Java代碼可以調用外部的本地代碼, 外部的C/C++ 代碼可以調用Java代碼。
涉及到JNI的開發,又要說NDK了。
NDK:Google開發的一套開發和編譯工具集, 主要用於Android的JNI開發,是一個用於開發JNI的工具。
這裏涉及到的JNI與DNK不進行詳細,只是簡單敘述一下感念。
4、Linux Kernel(linux內核層):提供核心系統服務,例如:安全、內存管理、進程管理、網絡堆棧、驅動模型。作爲一個應用層開發者,這一層可以不太深入研究。
本文參考 《Android開發之旅:android架構》(http://www.cnblogs.com/skynet/archive/2010/04/15/1712924.html).......,方便自己學習: