瞭解安卓架構(linux核心層、系統執行庫層、應用框架層、應用層)

風靈使發表於2018-11-06

首先為了理解安卓系統是怎麼工作的,就先來看一下android的系統架構,其架構大至可以分為四層:linux核心層、系統執行庫層、應用框架層和應用層,那就先說說這幾層。

1.linux核心層:

Android系統是基於Linux核心的,這一層為Android裝置的各種硬體提供了底層的驅動(如顯示,音訊,照相機,藍芽,WI-FI,電源管理等等),那麼Android為什麼會選擇採用linux呢?原因與Linux的特性有關,核心作為一個抽象層存在硬體和軟體之間,強大的記憶體管理和程式管理,基於許可權的安全模式,支援共享庫,經過認證的驅動模式,Linux本身就是開源專案等等。
但同時Android對於Linux進行了改動,比如它沒有glibc,最初用於一些便攜的移動裝置並沒有採用glibc作為c庫,而是goolge自己開發的Bionic Libc來作為代替品,也並沒有完全照搬Linux系統的核心還增加了Gold-Fish平臺以及yaffs2 Flash檔案系統,而且它沒有了本地基於x服務的視窗系統即Android並沒有使用Linux的x視窗,同時還對驅動程式進行了增強顯示驅動、鍵盤驅動、Flash記憶體驅動、照相機驅動、音訊驅動、藍芽驅動、WiFi驅動、Binder IPC驅動、Power Management(電源管理),包括硬體時鐘,記憶體分配和共享,低記憶體管理,kernel除錯,日誌裝置,android IPC機制,電源管理等。

  1. Binder IPC驅動:基於OpenBinder框架的一個驅動,用於提供 Android平臺的程式間通訊功能。原始碼位於drivers/staging/android/binder.c

  2. 電源管理(PM) :一個基於標準Linux電源管理系統的輕量級Android電源管理驅動,針對嵌入式裝置做了很多優化,比如電池電量。原始碼位於:kernel/power/earlysuspend.c、kernel/power/consoleearlysuspend.c、kernel/power/fbearlysuspend.c、kernel/power/wakelock.c、kernel/power/userwakelock.c

  3. 低記憶體管理器:比Linux的標準的OOM機制更加靈活,它可以根據需要殺死程式以釋放需要的記憶體。原始碼位於 drivers/staging/ android/lowmemorykiller.c

  4. 匿名共享記憶體: 為程式間提供大塊共享記憶體,同時為核心提供回收和管理這個記憶體的機制。原始碼位於mm/ashmem.c

  5. PMEM :用於向使用者空間提供連續的實體記憶體區域,DSP和某些裝置只能工作在連續的實體記憶體上。原始碼位於drivers/misc/pmem.c。

  6. Logger :一個輕量級的日誌裝置,用於抓取Android系統的各種日誌。原始碼位於drivers/staging/android/logger.c。

  7. Alarm :提供了一個定時器,用於把裝置從睡眠狀態喚醒,同時它還提供了一個即使在裝置睡眠時也會 執行的時鐘基準。原始碼位於drivers/rtc/alarm.c

  8. USB Gadget:驅動 一個基於標準 Linux USB gadget驅動框架的裝置驅動,Android的USB驅動是基於gaeget框 架的。原始碼位於drivers/usb/gadget/

  9. Ram Console: 為了提供除錯功能,Android允許將除錯日誌資訊寫入一個被稱為RAM Console的裝置裡,它是一個基於RAM的Buffer。原始碼位於drivers/staging/android / ram_console.c

  10. timed device: 提供了對裝置進行定時控制的功能,目前支援vibrator和LED裝置。原始碼位於drivers/staging/android /timed_output.c(timed_gpio.c)。

  11. Yaffs2 :是檔案系統 Android採用Yaffs2作為MTD nand flash檔案系統,原始碼位於fs/yaffs2/目錄下。Yaffs2是一個快速穩定的應用於NAND和NOR Flash的跨平臺的嵌入式裝置檔案系統,同其他Flash檔案系統相比,Yaffs2能使用更小的記憶體來儲存其執行狀態,因此它佔用記憶體小。Yaffs2的垃圾回收非常簡單而且快速,因此能表現出更好的效能。Yaffs2在大容量的NAND Flash上的效能表現尤為突出,非常適合大容量的Flash儲存。

那麼為什麼不自己開發一個核心而是使用Linux核心,這個牽扯到很多儘量描述一下,首先當時有了開源的Linux為什麼還要在自己去開發核心,android的本質是一個基於Linux上執行的java虛擬機器,Google只用了kernel所以只有系統的底層結構是一樣的其他的東西在Android裡都是不一樣的尤其是程式設計介面,所以Android距離Linux比MAC OS距離Linux還要遠。android是被google收購的,原來的小團隊沒有時間和精力去研發所以使用了上面說的開源的Linux(免費還免維護費),同時因為google是一個網際網路公司,google是靠服務來盈利不像Apple是裝置商依靠軟體給裝置服務,所以google是一個純粹的軟體提供者,為了讓硬體廠商能夠合作需要從硬體的角度思考問題(硬體廠商更願意再有一定把握的平臺進行開發),同時google也有比較好的對應措施去彌補Linux作業系統的一些缺點,從技術上失去了一些動力。

關於核心的作用簡單說就是提供了程式管理、檔案網路管理、系統安全許可權管理、以及系統與硬體裝置通訊基礎。而在無論Android還是iOS這類高度依賴框架的多層次作業系統上,核心對上層開發者來說是幾乎不可見的,只能通過開放給你的框架介面進行相關操作。因此可以說核心對整個系統來說是基礎性的,而非功能性。就整個Android工程來說主體互動、功能框架才是重中之重。再說說開發核心到底有多大好處,或者說價效比有多高的問題。作為整套系統的基礎,核心的高效穩定可以說是重重之重,而任何一款軟體的開發都要經歷迭代過程,微軟開發NT核心耗費大量資金與時間,而且至今還在不斷改進與維護正是對此種迭代的最佳例證。而即使如此,經過將近十年的開發與維護,NT核心之效率與功能性仍弱於Linux。由於Linux的開源特性,大量個人與企業對其進行持續不斷的維護與改進是Linux始終保持領先的重要原因,而微軟以其一己之力自不能與其媲美。這實際上是告訴大家在已有開源Linux的前提下,自己開發系統核心實際上是一件吃力不討好的事。因此使用來源Linux自然是省時省力省錢又保險的選擇。另外值得一提的是蘋果自主研發核心實際上是不準確的iOS與OSX其實都是基於UNIX核心。

2.系統執行庫層:

通過一些c/c++庫來為Android提供主要的特性支援,如SQLite提供了資料庫的支援,OpenGL|ES庫提供了3D繪圖的支援,WebKit庫提供了瀏覽器核心的支援等等。同時在這一層的還有Android執行時庫提供了一些核心庫,能夠允許開發者使用JAVA語言來編寫Android應用。還包含了虛擬機器Dalvik但之後改為了ART執行環境,使每一個Android應用都有自己的程式,並且都有一個自己的Dalvik虛擬機器例項,相較於JAVA的虛擬機器Dalvik是專門為移動裝置定製的,針對記憶體和CPU效能都有了優化。
所以Android的系統執行庫包含兩部分,一個是系統庫,另一個是執行時,Android系統的各個元件都在使用c/c++庫,這些功能是通過Android應用框架暴露給開發人員的,系統庫是應用程式框架的支撐,是連線應用程式框架層與Linux核心層的重要紐帶,在程式執行時中執行其執行時分為核心庫和Dalvik虛擬機器兩部分。

系統庫(九個):
1、Libc:系統c庫,是從BSD繼承來的標準C系統函式庫,專門為基於EmbeddedLinux的裝置定製。
2、Media Framework(多媒體庫):Android系統多媒體庫,基於PacketVideoOpenCORE。該庫支援錄放.並且可以錄製許多流行的音訊視訊格式.還有靜態映像檔案,包括MPEG4、H.264、MP3、AAC、JPG、PNG等。
3、Surface Manager:主要負責管理針對顯示系統的訪問,並且為多個應用程式提供2D和3D圖層的無縫融合。
4、Webkit:瀏覽器。一個最新的web瀏覽器引擎,用來支援Android瀏覽器和一個可嵌入的Web檢視。
5、SGL:一個內建的2D圖形引擎。
6、SSL:位於TCP/IP與各種應用層協議之間為資料通訊提供支援。
7、OpenGL ES:3D效果的支援。基於OpenGLES 1.0 APIs實現;該庫可以使用硬體3D加速或者使用高度優化的3D軟加速。
8、greeType:提供點陣圖bitmap和向量vector的字型描述與顯示。
9、SQLite:一個對於所有應用程式可用、功能強勁的輕型關係型資料庫引擎

除了之上的主要系統類庫之外,還有Android NDK,即Android原生庫。NDK為開發者提供了直接使用Android系統資源,並採用C 或C++語言編寫程式的介面。因此,第三方應用程式可以不依賴於Dalvik虛擬機器進行開發。NDK提供了一系列從C或C++生成原生程式碼所需要的工具,為開發者快速開發 C 或 C++的動態庫提供方便,並能自動將生成的動態庫和Java 應用程式一起打包成應用程式包檔案,即.apk檔案。
注意,使用原生庫無法訪問應用框架層API,相容性可能無法保障。而且從安全性角度考慮,Android原生庫用非型別安全的程式語言C/C++編寫,更容易產生安全漏洞,原生庫的缺陷也可能更容易直接影響應用程式的安全性。

Android執行時:

1、核心庫:提供了Java語言API中的大多數功能,同時也包含Android的一些核心API.如android.OSandroid.netandroid.media等。

2、Dalvik虛擬機器:Android程式不同於J2ME程式(是java的一種執行環境),每個Android應用都執行在自己的程式上,享有Dalvik虛擬機器為它分配的專有例項,並在該例項中執行。Dalvik虛擬機器是一種基於暫存器的Java虛擬機器,而不是傳統的基於棧的虛擬機器,並進行了記憶體資源使用的優化以及支援多個虛擬機器的特點。設計成在一個裝置可以高效地執行多個虛擬機器。Dalvik虛擬機器可執行檔案格式是(.dex),dex格式是專為Dalvik設計的一種壓縮格式,適合記憶體和處理器速度有限的系統。 大多數虛擬機器包括JVM都是基於棧的,而Dalvik虛擬機器則是基於暫存器的,所有的類都經由JAVA編譯器編譯,然後通過SDK中 的 “dx” 工具轉化成.dex格式由虛擬機器執行。Java編譯器將Java原始檔轉為class檔案,class檔案又被內建的dx(具有轉化為dex格式檔案,該格式檔案針對最小記憶體使用做了優化,這種檔案在Dalvik虛擬機器上註冊並執行)。在一些底層功能方面,例如執行緒和低記憶體管理等.Dalvik虛擬機器是依賴Linux核心的。
Dalvik虛擬機器是基於Apache的Java虛擬機器,並被改進以適應低記憶體、低處理器速度的移動裝置環境。Dalvik虛擬機器依賴於Linux核心,實現程式隔離與執行緒排程管理、安全和異常管理、垃圾回收等重要功能。但Dalvik虛擬機器並非傳統意義上的Java虛擬機器(JVM)。Dalvik虛擬機器不僅不按照Java虛擬機器的規範來實現而且兩者不相容。

Dalvik和標準Java虛擬機器有以下主要區別:
(1)Dalvik基於暫存器,而JVM基於棧。一般認為,基於暫存器的實現雖然更多依賴於具體的CPU結構,硬體通用性稍差,但其使用等長指令,在效率速度上較傳統JVM更有優勢。
(2)Dalvik經過優化,允許在有限的記憶體中同時高效地執行多個虛擬機器的例項,並且每一個Dalvik應用作為一個獨立的Linux程式執行,都擁有一個獨立的Dalvik虛擬機器例項。Android這種基於Linux的程式“沙箱”機制,是整個安全設計的基礎之一。
(3)Dalvik虛擬機器從DEXDalvik Executable)格式的檔案中讀取指令與資料,進行解釋執行。DEX檔案由傳統的、編譯產生的CLASS檔案,經dx工具軟體處理後生成。
(4 )Dalvik的DEX檔案還可以進一步優化提高執行效能。OEM的應用程式可以在系統編譯後,直接生成優化檔案(.ODEX檔案),第三方的應用程式則可在執行時在快取中優化與儲存,優化後的格式為DEY(.dey檔案)。

3.應用框架層:

這一層主要提供了構建應用程式時可能用到的各種API,Android自帶的一些核心應用就是使用這些API完成的。那什麼是應用程式框架層,可以說是一個應用程式的核心,是一個共同使用和遵守的約定然後在這個約定上共同擴充套件,但程式保持主體結構的一致,其作用的是讓程式保持清晰在滿足不同需求的同時又不互相影響。而對於Android來提供給應用開發者的本身就是一個框架,所有的應用開發都必須遵守這個框架的原則,同時在這個基礎上進行擴充套件可以訪問核心應用程式所使用的API框架(即要實現某個功能就呼叫安卓系統自己提供的功能,如果不想呼叫就可以通過繼承實現個性化擴充套件),安卓的應用框架提供開發Android應用程式所需的一系列類庫採用重用機制,開發人員可以進行快速的應用程式開發方便高效的使用安桌平臺本身的元件或者替換平臺本身的各種應用程式元件。

該框架包含:活動管理器、視窗管理器、內容提供者、檢視系統、包管理器、電話管理器、資源管理器、位置管理器、通知管理器、XMPP服務。

活動管理器:管理各個應用程式的生命週期以及通常的導航回退功能。作用:負責一新ActivityThread程式建立,Activity生命週期的維護。其自身也存在一個框架,本文就不再討論,有興趣的可以看一看。

視窗管理器:管理所有的視窗程式,在安卓應用框架中視窗主要分為兩種:
(一)是應用視窗(一個activity有一個主視窗,彈出的對話方塊也有一個視窗,Menu選單也是一個視窗。在同一個activity中,主視窗、對話方塊、Menu視窗之間通過該activity關聯起來)。
(二)是公共介面的視窗(系統級別的視窗如:最近執行對話方塊、關機對話方塊、狀態列下拉欄、鎖屏介面等)視窗管理系統是基於C/S模式的。整個視窗系統分為服務端和客戶端兩大部分,客戶端負責請求建立視窗和使用視窗,服務端完成視窗的維護,視窗顯示等。

內容提供器:使得不同應用程式之間存取或者分享資料。就是可以配置自己的Content Provider去存取其他的應用程式或者通過其他應用程式暴露的Content Provider去存取它們的資料,總的來說就是提供了一個資料共享機制。

檢視系統:構建應用程式的基本組就是文字框、按鈕等。

通告管理器:使得應用程式可以在狀態列顯示自定義的提示資訊,通過NotificationManager 、 Notification這兩個類可以完成在狀態列顯示提示的資訊。

包管理器:安卓系統內的程式管理,Package Manger是一個實際上管理應用程式安裝、解除安裝和升級的API。當我們安裝APK檔案時,Package Manager會解析APK包檔案和顯示確認資訊。

電話管理器:管理所有的移動裝置 用於管理手機通話狀態、獲取電話資訊(裝置、sim卡、網路資訊),監聽電話狀態以及呼叫電話撥號器撥打電話。

資源管理器:提供應用程式使用的各種非程式碼資源。提供應用程式使用的各種非程式碼資源,如本地化字串、圖片、佈局檔案、顏色檔案等

位置管理器:提供位置服務,LocationManager系統服務是位置服務的核心元件,它提供了一系列方法來處理與位置相關的問題,包括查詢上一個已知位置、註冊和登出來自某個。LocationProvider的週期性的位置更新、註冊和登出接近某個座標時對一個已定義的Intent的觸發等。總的來說就是提供有關位置的操作。

XMPP服務:例如提供Google Talk 服務,XMPP(Extensible Messageing and Presence Protocol:可擴充套件訊息與存在協議):是一種即時訊息協議用於資訊的傳輸。是一種基於XML的開放式實時通訊協議,XMPP是基於伺服器的也是分散式的

4.應用層

所有安裝在手機上的應用程式都是這個層,比如手機自帶的程式或者下載的遊戲等等。

相關文章