android系統體系結構

Android 是google公司針對手機開發的一個平臺,並公佈了其中大部分代碼,其大部分應用程序都是用JAVA開發的,畢竟它是商業性的產品嘛,有所保留也是理所 固然的。對於搞嵌入式linux開發的人來講咱們能夠從中學習其長處,也算得上是將來的一個發展方向和趨勢吧。java

咱們先來看看Android它的體系結構吧。下面是一張公開的Android體系結構圖。linux

Android系統結構

android的系統架構和其操做系統同樣,採用了分層的架構。從架構圖看,android分爲四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和linux核心層。藍色的表明java程序,黃色的代碼爲運行JAVA程序而實現的虛擬機,綠色部分爲C/C++語言編寫的程序庫,紅色的代碼內核(linux內核+drvier)android

1.應用程序c++

Android會同一系列核心應用程序包一塊兒發佈,該應用程序包包括email客戶端,SMS短消息程序,日曆,地圖,瀏覽器,聯繫人管理程序等。全部的應用程序都是使用JAVA語言編寫的。web

2.應用程序框架sql

開發人員也能夠徹底訪問核心應用程序所使用的API 框架。該應用程序的架構設計簡化了組件的重用;任何一個應用程序均可以發佈它的功能塊而且任何其 它的應用程序均可以使用其所發佈的功能塊(不過得遵循框架的安全性限制)。一樣,該應用程序重用機制也使用戶能夠方便的替換程序組件。數據庫

隱藏在每一個應用後面的是一系列的服務和系統, 其中包括;apache

    * 豐富而又可擴展的視圖(Views),能夠用來構建應用程序, 它包括列表(lists),網格(grids),文本框(text boxes),按鈕(buttons), 甚至可嵌入的web瀏覽器。
    * 內容提供器(Content Providers)使得應用程序能夠訪問另外一個應用程序的數據(如聯繫人數據庫), 或者共享它們本身的數據
    * 資源管理器(Resource Manager)提供 非代碼資源的訪問,如本地字符串,圖形,和佈局文件( layout files )。
    * 通知管理器 (Notification Manager) 使得應用程序能夠在狀態欄中顯示自定義的提示信息。
    * 活動管理器( Activity Manager) 用來管理應用程序生命週期並提供經常使用的導航回退功能。編程

有關更多的細節和怎樣從頭寫一個應用程序,請參考 如何編寫一個 Android 應用程序.windows

3.系統運行庫

1)程序庫

Android 包含一些C/C++庫,這些庫能被Android系統中不一樣的組件使用。它們經過 Android 應用程序框架爲開發者提供服務。如下是一些核心庫:

    * Bionic系統 C 庫 - 一個從 BSD 繼承來的標準 C 系統函數庫( libc ), 它是專門爲基於 embedded linux 的設備定製的。
    * 媒體庫 - 基於 PacketVideo OpenCORE;該庫支持多種經常使用的音頻、視頻格式回放和錄製,同時支持靜態圖像文件。編碼格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
    * Surface Manager - 對顯示子系統的管理,而且爲多個應用程序提 供了2D和3D圖層的無縫融合。這部分代碼
    * Webkit,LibWebCore - 一個最新的web瀏覽器引擎用,支持Android瀏覽器和一個可嵌入的web視圖。鼎鼎大名的 Apple Safari背後的引擎就是Webkit
    * SGL - 底層的2D圖形引擎
    * 3D libraries - 基於OpenGL ES 1.0 APIs實現;該庫可使用硬件 3D加速(若是可用)或者使用高度優化的3D軟加速。
    * FreeType -位圖(bitmap)和矢量(vector)字體顯示。
    * SQLite - 一個對於全部應用程序可用,功能強勁的輕型關係型數據庫引擎。

    *還有部分上面沒有顯示出來的就是硬件抽象層。其 實Android並不是將全部的設備驅動都放在linux內核裏面,而是實如今userspace空間,這麼作的主要緣由是GPL協議,Linux是遵循該 協議來發布的,也就意味着對 linux內核的任何修改,都必須發佈其源代碼。而如今這麼作就能夠避開而無需發佈其源代碼,畢竟它是用來賺錢的。而 在linux內核中爲這些userspace驅動代碼開一個後門,就可讓原本userspace驅動不能夠直接控制的硬件能夠被訪問。而只須要公佈這個 後門代碼便可。通常狀況下若是要將Android移植到其餘硬件去運行,只須要實現這部分代碼便可。包括:顯示器驅動,聲音,相機,GPS,GSM等等

2)Android 運行庫

Android 包括了一個核心庫,該核心庫提供了JAVA編程語言核心庫的大多數功能。

每個Android應用程序都在它本身的進程中運 行,都擁有一個獨立的Dalvik虛擬 機實例。Dalvik被設計成一個設備能夠同時高效地運行多個虛擬系統。 Dalvik虛擬機執行(.dex)的Dalvik可執行文件,該格式文件針對小內存使用作了 優化。同時虛擬機是基於寄存器的,全部的類都經由JAVA編譯器編譯,而後經過SDK中 的 "dx" 工具轉化成.dex格式由虛擬機執行。

Dalvik虛擬機依賴於linux內核的一些功能,好比線程機制和底層內存管理機制。

4.Linux 內核

Android 的核心繫統服務依賴於 Linux 2.6 內核 ,如安全性,內存管理,進程管理, 網絡協議棧和驅動模型。 Linux 內核也同時做爲硬件和軟件棧之間的抽象層。其外還對其作了部分修改,主要涉及兩部分修改:

1).Binder (IPC):提供有效的進程間通訊,雖然linux內核自己已經提供了這些功能,但Android系統不少服務都須要用到該功能,爲了某種緣由其實現了本身的一套。

2).電源管理:主要是爲了省電,畢竟是手持設備嘛,低耗電纔是咱們的追求。

最後在談談Android所採用的語言,其應用開發採用java語言,咱們所說的java通常包含三個部分:

1)java語言:即其語法,其寫代碼的程式

2).java虛擬機:爲了實現一次編譯處處能夠運行的原則,java在編譯鏈接之後並無產生目標機器語言,而是採用了Java bytecode這種Java共用指令,這時就須要一個虛擬機來執行改指令。

3).庫:跟咱們經常使用的C語言同樣提供一些經常使用的庫

後二者結合就是Java Runtime Environment。

Android使用的虛擬機叫 Dalvik,最初並是不爲Java設計的,它並不能運行Java bytecode指令,而是運行叫Dalvik executable,簡稱dx。爲此Android提供了dx工具,用來將Java bytecode轉換爲dx。

Android源代碼結構:

Google提供的Android包含了原始Android的目標機代碼,主機編譯工具、仿真環境,代碼包通過解壓縮後,第一級別的目錄和文件以下所示:.|-- Makefile        (全局的Makefile)|-- bionic          (Bionic含義爲仿生,這裏面是一些基礎的庫的源代碼)|-- bootloader      (引導加載器)|-- build           (build目錄中的內容不是目標所用的代碼,而是編譯和配置所須要的腳本和工具)|-- dalvik          (JAVA虛擬機)|-- development     (程序開發所須要的模板和工具)|-- external        (目標機器使用的一些庫)|-- frameworks      (應用程序的框架層)|-- hardware        (與硬件相關的庫)|-- kernel          (Linux2.6的源代碼)|-- packages        (Android的各類應用程序)|-- prebuilt        (Android在各類平臺下編譯的預置腳本)|-- recovery        (與目標的恢復功能相關)`-- system          (Android的底層的一些庫)bionic目錄展開一個級別的目錄以下所示:bionic/|-- Android.mk|-- libc|-- libdl|-- libm|-- libstdc++|-- libthread_db`-- linkerbootloader目錄展開的兩個級別目錄:bootloader/`-- legacy    |-- Android.mk    |-- README    |-- arch_armv6    |-- arch_msm7k    |-- fastboot_protocol.txt    |-- include    |-- libboot    |-- libc    |-- nandwrite    `-- usbloaderbuild目錄展開的一個級別的目錄以下所示:build/|-- buildspec.mk.default|-- cleanspec.mk|-- core                       (各類以mk爲結尾的文件,它門是編譯所須要的Makefile)|-- envsetup.sh|-- libs|-- target                     (包含board和product兩個目錄,爲目標所須要文件)`-- tools                      (編譯過程當中主機所須要的工具,一些須要通過編譯生成)其中,core中的Makefile是整個Android編譯所須要的真正的Makefile,它被頂層目錄的Makefile引用。envsetup.sh是一個在使用仿真器運行的時候,用於設置環境的腳本。dalvik目錄用於提供Android JAVA應用程序運行的基礎————JAVA虛擬機。development目錄展開的一個級別的目錄以下所示:development|-- apps                       (Android應用程序的模板)|-- build                      (編譯腳本模板)|-- cmds|-- data|-- docs|-- emulator                   (仿真相關)|-- host                       (包含windows平臺的一些工具)|-- ide|-- pdk|-- samples                    (一些示例程序)|-- simulator                  (大可能是目標機器的一些工具)`-- tools在emulator目錄中qemud是使用QEMU仿真時目標機器運行的後臺程序,skins是仿真時手機的界面。samples中包含了不少Android簡單工程,這些工程爲開發者學習開發Android程序提供了很大便利,能夠做爲模板使用。external目錄展開的一個級別的目錄以下所示:external/|-- aes|-- apache-http|-- bluez|-- clearsilver|-- dbus|-- dhcpcd|-- dropbear|-- elfcopy|-- elfutils|-- emma|-- esd|-- expat|-- fdlibm|-- freetype|-- gdata|-- giflib|-- googleclient|-- icu4c|-- iptables|-- jdiff|-- jhead|-- jpeg|-- libffi|-- libpcap|-- libpng|-- libxml2|-- netcat|-- netperf|-- neven|-- opencore|-- openssl|-- oprofile|-- ping|-- ppp|-- protobuf|-- qemu|-- safe-iop|-- skia|-- sonivox|-- sqlite|-- srec|-- strace|-- tagsoup|-- tcpdump|-- tinyxml|-- tremor|-- webkit|-- wpa_supplicant|-- yaffs2`-- zlib在external中,每一個目錄表示Android目標系統中的一個模塊,可能有一個或者若干個庫構成。其中:opencore爲PV(PacketVideo),它是Android多媒體框架的核心。webkit是Android網絡瀏覽器的核心。sqlite是Android數據庫系統的核心。openssl是Secure Socket Layer,一個網絡協議層,用於爲數據通信提供安全支持。frameworks目錄展開的一個級別的目錄以下所示:frameworks/|-- base|-- opt`-- policiesframeworks是Android應用程序的框架。hardware是一些與硬件相關的庫kernel是Linux2.6的源代碼packages目錄展開的兩個級別的目錄以下所示:packages/|-- apps|   |-- AlarmClock|   |-- Browser|   |-- Calculator|   |-- Calendar|   |-- Camera|   |-- Contacts|   |-- Email|   |-- GoogleSearch|   |-- HTMLViewer|   |-- IM|   |-- Launcher|   |-- Mms|   |-- Music|   |-- PackageInstaller|   |-- Phone|   |-- Settings|   |-- SoundRecorder|   |-- Stk|   |-- Sync|   |-- Updater|   `-- VoiceDialer`-- providers    |-- CalendarProvider    |-- ContactsProvider    |-- DownloadProvider    |-- DrmProvider    |-- GoogleContactsProvider    |-- GoogleSubscribedFeedsProvider    |-- ImProvider    |-- MediaProvider    `-- TelephonyProviderpackages中包含兩個目錄,其中apps中是Android中的各類應用程序,providers是一些內容提供者(在Android中的一個數據源)。packages中兩個目錄的內容大都是使用JAVA編寫的程序,各個文件夾的層次結構是相似的。prebuilt目錄展開的一個級別的目錄以下所示:prebuilt/|-- Android.mk|-- android-arm|-- common|-- darwin-x86|-- linux-x86`-- windowssystem目錄展開的兩個級別的目錄以下所示:system/|-- bluetooth|   |-- bluedroid|   `-- brfpatch|-- core|   |-- Android.mk|   |-- README|   |-- adb|   |-- cpio|   |-- debuggerd|   |-- fastboot|   |-- include            (各個庫接口的頭文件)|   |-- init|   |-- libctest|   |-- libcutils|   |-- liblog|   |-- libmincrypt|   |-- libnetutils|   |-- libpixelflinger|   |-- libzipfile|   |-- logcat|   |-- logwrapper|   |-- mkbootimg|   |-- mountd|   |-- netcfg|   |-- rootdir|   |-- sh|   `-- toolbox|-- extras|   |-- Android.mk|   |-- latencytop|   |-- libpagemap|   |-- librank|   |-- procmem|   |-- procrank|   |-- showmap|   |-- showslab|   |-- sound|   |-- su|   |-- tests|   `-- timeinfo`-- wlan    `-- ti

相關文章
相關標籤/搜索