Android系統架構,方方面面都在這

image.png
關于Android系統

Android,本義指“機器人”,是Google于2007年11月5日宣布的基于Linux平臺的操作系統。

Android系統優缺點
開放性

在優勢方面,Android平臺首先就是其開發性,開發的平臺允許任何移動終端廠商加入到Android聯盟中來。顯著的開放性可以使其擁有更多的開發者,隨著用戶和應用的日益豐富,一個嶄新的平臺也將很快走向成熟。
開發性對于Android的發展而言,有利于積累人氣,這里的人氣包括消費者和廠商,而對于消費者來講,最大的受益正是豐富的軟件資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機。

豐富的硬件

這一點還是與Android平臺的開放性相關,由于Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產品。功能上的差異和特色,卻不會影響到數據同步、甚至軟件的兼容,如同從諾基亞Symbian風格手機一下改用蘋果iPhone,同時還可將Symbian中優秀的軟件帶iPhone上使用、聯系人等資料更是可以方便地轉移。

跨平臺

由于使用Java進行開發,Android繼承了Java跨平臺的優點。任何Android應用幾乎無需任何修改就能運行于所有的Android設備。包括但不限于手機,平板,手環,車載系統,智能家居。

方便開發

Android平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別致的軟件會誕生。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如何控制正是留給Android難題之一。

Google應用

在互聯網的Google已經走過10年度歷史,從搜索巨人到全面的互聯網滲透,Google服務如地圖、郵件、搜索等已經成為連接用戶和互聯網的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。

太碎片化

紛繁復雜的屏幕尺寸,分辨率,不同版本且訂制開發的Android系統,各個廠家硬件,虛擬菜單等,給開發者帶來一定的復雜性。

截至目前發行歷史版本:

每個版本都是按照英文字母順序取的字母,然把它作為單詞第一個字母,去拼一個甜點的單詞,可是到了M,N,O,P,到了Q的時候就變了,改為就叫Android 10了。

  • 1.5 Cupcake(紙杯蛋糕)
  • 1.6 Donut(甜甜圈)
  • 2.2 Froyo(凍酸奶)
  • 2.3 Gingerbread(姜餅)
  • 3.x Honeycomb(蜂巢)
  • 4.0 Ice Cream Sandwich(冰激凌三明治)
  • 4.1 Jelly Bean(果凍豆)
  • 4.4 KitKat(奇巧巧克力)
  • 5.0 Lollipop(棒棒糖)
  • 6.0 Marshmallow(棉花糖)
  • 7.0 Nougat(牛軋糖)
  • 8.0 Oreo(奧利奧)
  • 9.0 Pie (派)
  • 10.0 Android 10
系統架構圖:
image.png

基于Android 8.0的系統根目錄結構圖:


Android從下往上層主要分為4層,如同網絡的七層協議,這樣做的好處是屏蔽本層與下層的差異。

  • linux內核層(Linux Kernel)
  • 系統運行時庫層 (Libraries and Android Runtime)
  • 應用程序框架層(Application Framework)
  • 應用程序層 (Applications)
linux內核層(Linux Kernel)
驅動名稱 簡介
Android電源管理(Power Management) 針對嵌入式設備的,基于標準Linux電源管理系統的,輕量級的電源管理驅動
低內存管理器 (Low Memory Keller) 選擇性殺死進程來釋放需要的內存
匿名共享內存 (Ashmem) 為進程之間提供共享內存資源,同時為內核提供回收和管理內存的機制
日志(Android Logger) 一個輕量級的日志設備
定時器(Android Alarm) 提供一個定時器把設備從睡眠狀態喚醒
物理內存映射管理 (Android PMEM) DSP及其他設備只能工作在連續的物理內存上,PMEM用于向用戶空間提供 連續的物理內存區域映射
Android定時設備(Android Timed device) 執行對設備的定時控制功能
Yaffs2文件系統 Android采用大容量的NAND閃存作為存儲設備,使用Yaffs2作為文件系統管理大容量MTD NAND Flash;Yaffs2占用內存小,垃圾回收簡潔迅速
硬件抽象層

在linux內核層和系統運行時庫層之間還有一層硬件抽象層(Hardware Abstract Layer,HAL),它是對硬件設備的具體實現加以抽象。鑒于許多硬件設備廠商不希望公開其設備驅動的源代碼,如果能將android的應用框架層與linux系統內核的設備驅動隔離,使應用程序框架的開發盡量獨立于具體的驅動程序,則android將減少對Linux內核的依賴。HAL由此而生,它是對Linux內核驅動程序進行的封裝,將硬件抽象化,屏蔽掉了底層的實現細節。

系統運行庫層

由系統類庫和Android運行時組成。

  • 系統類庫(Libraries)

系統類庫大部分由C/C++編寫,提供的功能通過Android應用程序框架來調用。

名稱 簡介
Surface Manager 管理應用顯示,另外也對2D和3D圖形提供支持
Media Framework 基于PacketVideo的OpenCORE的多媒體庫,支持多種常見音視頻格式的錄制和播放
SQLite 本地小型關系數據庫,如平時用數據庫用到
OpenGL 基于OpenGL ES 1.0API標準實現的3D跨平臺圖形庫
FreeType 用于顯示位圖和矢量字體
WebKit Web瀏覽器的軟件引擎
SGL 基于2D圖形引擎
Libc(bionic ibc) C函數庫bionic libc,更適合基于嵌入式Linux的移動設備
SSL 安全套接層,為網絡通信提供安全及數據完整性的一種安全協議,如https請求需認證

幾個常用且比較重要的C/C++程序庫所在的目錄如圖:


  • Android運行時(Android Runtime)

由核心庫和Dalvik虛擬機組成。
核心庫:核心庫提供了Java5 se API的多數功能,并提供Android的核心API,如android.os,android.net,android.media等。

Dalvik虛擬機:Dalvik虛擬機是基于apache的java虛擬機,并被改進以適應低內存,低處理器速度的移動設備環境。Dalvik虛擬機依賴于Linux內核,實現進程隔離與線程調試管理,安全和異常管理,垃圾回收等重要功能。

Jvm、Dalvik和Art

java虛擬機 Dalvik虛擬機
java虛擬機基于棧,基于棧的機器必須使用指令來載入和操作棧上數據 Dalvik虛擬機基于寄存器
java虛擬機運行的是java字節碼。(java類會被編譯成一個或多個字節碼.class文件,打包到.jar文件中,java虛擬機從相應的.class文件和.jar獲取相應的字節碼) Dalvik運行的是自己專屬的.dex字節碼格式。(java類被編譯成.class文件后,會通過一個dx工具將所有的.class文件轉換成一個.dex文件,然后dalvik虛擬機會從其中讀取指令和數據)
- 一個應用對應一個Diavik虛擬機實例,獨立運行

Android應用編譯及運行流程:


image.png
aapt:

即Android Asset Packaging Tool(Android 打包工具),在SDK的build-tools目錄下,也行平時沒有用到過,但是開發工具生成Apk時會自動使用aapt將代碼和資源文件打包在其中。

Apk打包流程:


image
SDK和NDK的關系:
image

ndk可以通過native code跨過使用dalvik runtime,直接調用到android內核資源,而sdk則需要在dalvik runtime環境下才能調用到內核資源。然而兩者并不是各司其職,各不相關。android提供了JNI(java native interface)使兩者可以進行相互調用和通信。

應用框架層(Application Framework)

應用程序框架層提供開發Android應用程序所需的一系列類庫,高度封裝直接調用。

應用框架層的主要實現代碼在frameworks/base和frameworks/av目錄下,其中frameworks/base目錄結構如圖:


類庫名稱 簡介
視圖系統(View System) 創建應用所需的組件
活動管理器(ActivityManager) 管理各個應用程序生命周期,為所有程序的窗口提供交互的接口
窗口管理器(Window Manager) 對窗口程序進行管理
內容提供者(Content Provider) 提供一個應用程序訪問另一個應用程序數據的功能,實現應用間共享數據
通知管理器(Notification Manager) 使應用可以在系統狀態欄中顯示通知消息
包管理器(Package Manager) 管理應用安裝、卸載,應用版本號、版本名,查詢相關權限等功能
資源管理器(Resource Manager) 提供各種非代碼資源供應用程序使用,如字符串,顏色,圖片,音頻等
位置管理器(Location Manager) 提供位置服務
電話管理器(Telephony Manager) 提供設備電話相關功能
XMPP服務 Google在線即時交流軟件中一個通用的進程,提供后臺推送服務
系統應用

根據Google給出的官方架構圖,Android系統應用開發處于Android架構的System Apps層,像桌面,撥號盤,日歷,相機,郵件,設置等,但這些app屬于系統app,系統app本質上跟第三方app沒什么區別,只是最終存放在Android系統中的位置不同,系統app存放在/system/priv-app/和/system/app/中,第三方app存放在/data/app/當中,這三個目錄的權限不一樣,按照權限大小排序分別為,/system/priv-app/ > /system/app/ > /data/app/。

應用層(Applications)

系統內置的應用程序以及非系統級的應用程序都屬于應用層,負責與用戶進行直接交互,通常都是用Java進行開發的。包括設備系統自帶的工具,日歷,音樂,瀏覽器,圖片查看等應用,還有開發者開發應用程序。

源碼根目錄中的packages目錄對應著系統應用層,目錄結構圖:


在線閱讀Android源碼

在Android系統源碼官網,各個Android版本的源碼任君挑選。
Android在線閱讀源碼地址

屏幕快照 2020-08-30 10.13.45.png

雖然我們平時開發應用主要行走在Applications層上,但是并不限制我們往下走,雖然這條路是艱難漫長的,堅持下去總有撥云見霧的一天。該篇文章保持更新。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。