Android系統框架

首先看系統架構框架圖如下:


android的系統架構和其操作系統一樣,採用了分層的架構。從架構圖看,android分爲四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層(包含系統庫和Android運行庫)和linux核心層。
  • Applications
  • Application Framework
  • Libraries
  • Android Runtime
  • Linux Kernel
Android本身是一套軟件堆疊(Software Stack),主要分爲三層:操作系統、中間件、應用程序。
Android的中間件可以再細分出兩層,底層是函數庫(Library)和虛擬機(Virtual Machine; VM),上層爲應用程序框架(Application Framework)。上面架構圖中藍色部分爲Java語言開發,綠色部分爲C/C++開發,紅色的Kernel層爲C開發,黃色部分爲Dalvik VM部分。
以下分別介紹每一層的作用
  • 應用程序層(Applications)
Android會同一系列核心應用程序包一起發佈,該應用程序包包括email客戶端,SMS短消息程序,日曆,地圖,瀏覽器,聯繫人管理程序等。所有的應用程序都是使用JAVA語言編寫的。
  • 應用程序框架層(Application Framework)
開發人員也可以完全訪問核心應用程序所使用的API框架。該應用程序的架構設計簡化了組件的重用;任何一個應用程序都可以發佈它的功能塊並且任何其 它的應用程序都可以使用其所發佈的功能塊(不過得遵循框架的安全性限制)。同樣,該應用程序重用機制也使用戶可以方便的替換程序組件。
隱藏在每個應用後面的是一系列的服務和系統, 其中包括;
Views System:豐富而又可擴展的視圖(Views),可以用來構建應用程序, 它包括列表(lists),網格(grids),文本框(text boxes),按鈕(buttons), 甚至可嵌入的web瀏覽器。
Content Providers(內容提供器):使得應用程序可以訪問另一個應用程序的數據(如聯繫人數據庫), 或者共享它們自己的數據。
Resource Manager(資源管理器):提供非代碼資源的訪問,如本地字符串,圖形,和佈局文件( layout files )
Notification Manager(通知管理器):使得應用程序可以在狀態欄中顯示自定義的提示信息。。通知列設定在手機的頂部,像短信(short Message),Voice mail都會在此進行提示。
Activity Manager(Activity管理):用來管理應用程序生命週期並提供常用的導航回退功能。
  • 函數庫層(Libraries)
Android 包含一些C/C++庫,這些庫能被Android系統中不同的組件使用。它們通過 Android 應用程序框架爲開發者提供服務。以下是一些核心庫:
System C library – 一個從 BSD 繼承來的標準 C 系統函數庫( libc ), 它是專門爲基於 embedded linux 的設備定製的。
Media Libraries – 基於 PacketVideo OpenCORE;該庫支持多種常用的音頻、視頻格式回放和錄製,同時支持靜態圖像文件。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
Surface Manager – 對顯示子系統的管理,並且爲多個應用程序提 供了2D和3D圖層的無縫融合。
LibWebCore – 一個最新的web瀏覽器引擎用,支持Android瀏覽器和一個可嵌入的web視圖。
SGL -底層的2D圖形引擎。
3D Libraries -基於OpenGL ES 1.0 APIs實現;該庫可以使用硬件 3D加速(如果可用)或者使用高度優化的3D軟加速。
Free Type - 位圖(bitmap)和矢量(vector)字體顯示。
SQLite – SQLite是一套開放源碼的關係數據庫,一個對於所有應用程序可用,功能強勁的輕型關係型數據庫引擎。
SSL – Secure Socket Layer用於保護網頁通訊的協議。
  • Android運行時庫層(Android Runtime)
Android雖然使用Java程序語言來開發應用程序,但是卻不使用一般大家目前在用的J2ME版本來執行Java程序,而是採用Android自有的Android Runtime來執行。
Android Runtime包含下面兩個核心。
Core Libraries
Android 包括了一個核心庫,該核心庫提供了JAVA編程語言核心庫的大多數功能。
Dalvik Virtual Machine
每一個Android應用程序都在它自己的進程中運行,都擁有一個獨立的Dalvik虛擬機實例。Dalvik被設計成一個設備可以同時高效地運行 多個虛擬系統。 Dalvik虛擬機執行(.dex)的Dalvik可執行文件,該格式文件針對小內存使用做了優化。同時虛擬機是基於寄存器的,所有的類都經由JAVA編 譯器編譯,然後通過SDK中 的 “dx” 工具轉化成.dex格式由虛擬機執行。
Dalvik虛擬機有許多地方是參考Java虛擬機的設計,Dalvik虛擬機所執行的中間代碼並非是Java虛擬機所執行的Java Bytecode,同時也不直接執行Java類(Java Class File),而是依靠轉換工具將Java bytecode轉爲Dalvik VM執行時特有的dex(Dalvik Executable) 格式,成爲.dex。Dalvik VM與Java VM最大的不同在於Java VM是Stack-based,而Dalvik VM是(register-based)。以技術層面來看Register-based VM的特性有個很大的好處,那就是對於目前主流的硬件架構,很容易與現有系統整合且達到最優化,而所需要的資源也相對較少。甚至在硬件實現VM上會比較容 易實現。最重要的是Dalvik並不是由J2ME實現,而不存在J2ME授權相關的問題。
通常來說,Java比較慢不單單只是因爲Virtual Machine的關係,Java的程序編譯成Bytecode也是關鍵因素之一,因爲Java VM採用了Stack-based的方式來產生指令,所以所有的變量都需要push, pop操作,所以就會多出不少指令,而Dalvik VM則採用Register-based方式,變量都存儲在寄存器中,相比較而言,Dalvik VM的指令就會少一點,速度也就會更加快一點。
  • 操作系統層(Linux Kernel)
Android平臺的操作系統用的是Linux,內核版本爲2.6版,包含的主要功能有安全(Security)、內存管理(Memory Management)、進程管理(Process Managemen)、網絡協議棧(Network Stack)、硬件驅動(Driver Model)等,Linux內核也同時作爲硬件和軟件棧之間的抽象層。
關於 Android kernel 的修改,Google 的簡報還提供了兩個重點:
       Binder (IPC):提供有效率的程序間溝通管道(Inter-Process Communication)Android 系統中有很多服務,而上層的應用程序經常要取用這些服務,一般的 Linux 系統已經提供了不少 IPC 的方式,不過 Android 還是搞了套自己的。雖說文件中解釋原因爲「一般 IPC 會造成額外資源花費,以及安全問題」,但其實這些都是可以基於原有架構在 kernel 外頭解決的,爲何要改在 kernel 裏頭,筆者對此存疑,也只能等找時間去研究程序代碼才知了。
       Power Management
:與桌上型計算機或筆記型計算機不同,手持裝置的電源一向相當有限,必須無所不用其極的去想辦法省電,但又不損及順暢的使用經驗。Android 在此採取了頗爲積極的作法:「沒有人說要用,就關掉」。例如某程序在放 MP3 音樂,於是此程序會需要 CPU 的計算能力,那就得開口要。如果與此同時沒其它程序在執行,那麼 LCD 顯示器就可能被關掉,藉以省電。另一特別處,是在於 Linux kernel 一般考慮的都是在計算機上的作法,所以多半隻有進入暫停、休眠等等的選擇,而不會如此細緻的去控制到各個小裝置的電源供應。
系統函式庫

這裏說的系統函式庫是指 native libraries”,是跑在系統裏頭的函式庫,採用的語言不是 Java,提供一些基礎建設。裏頭有幾個值得一提的組件:

       Bionic
:這是 Android 版的 libclibc GNU/Linux 以及其它類似 Unix 系統上最基礎的函式庫,一般最常用的是 glibc,就是 GNU 做的 libc。不然在比較小型的裝置上也可以用 uclibc。不論是 glibc or uclibc,版權都是LGPL (GPL 的略爲弱化版)。看到這大概可以猜到了吧,又是 Copyleft 問題。官方的說法是,除了版權問題以外,還考慮必須輕量以及快速,所以才做了自己的 libc。不過輕量、快速,本來就是小型裝置用的 uclibc 一開始的目標,因此,最主要的恐怕還是版權問題。
       Webkit
:鼎鼎大名的 Apple Safari 瀏覽器背後的引擎就是 WebkitAndroid 也包含進去了。離線使用的 html 配上 html 5 的一些新發展,產生了各種有趣的可能,這部分值得另文介紹,這裏就不再贅述。
Surface Flinger
:提供把各種”surface”組合在一起的能力。在這裏 surface 解釋爲程序想要顯示在屏幕的東西,可能同一屏幕上有來自不同程序的內容,而這些內容有可能是 2D 顯示或是 3D 顯示等等之類。Surface flinger 就是把這些東西結合起來,一起送到屏幕上。目前程序代碼還沒公佈,不過 2D 3D 的混合顯示一直都是問題,根本原因是我們通常告訴 3D 顯示卡的東西都是一些「我要在哪里哪里畫上什麼形狀,貼上某某材質然後旋轉多少度」之類的事情,也就是說,我們並不知道最後顯示出來會長什麼樣子,那是顯示卡上頭的 GPU 去算出來的。一般這些東西是顯示在一個有裝飾的窗口裏頭,這裝飾通常是 2D 效果。接下來假定我們想要旋轉這整個窗口,而且裏頭的東西還要繼續動,那等於要隨時把握 3D 窗口裏的東西長什麼樣子,然後把它跟 2D 的窗口框框結合,然後再開始轉動。目前在一般 GNU/Linux 上這件事情還沒有處理的非常好,Android 怎麼做,值得在程序代碼公佈之後注意。
      硬件抽象層 (Hardware Abstraction Libraries):這就是前文所述的 userspace 驅動程序,如果想要將 Android 在某硬件平臺上執行,基本上完成這些驅動程序就行了。其內定義了 Android 對各硬件裝置例如顯示芯片、聲音、數字相機、GPSGSM 等等的需求。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章