Android系統(tǒng)架構(gòu),方方面面都在這

image.png
關(guān)于Android系統(tǒng)

Android,本義指“機(jī)器人”,是Google于2007年11月5日宣布的基于Linux平臺(tái)的操作系統(tǒng)。

Android系統(tǒng)優(yōu)缺點(diǎn)
開(kāi)放性

在優(yōu)勢(shì)方面,Android平臺(tái)首先就是其開(kāi)發(fā)性,開(kāi)發(fā)的平臺(tái)允許任何移動(dòng)終端廠商加入到Android聯(lián)盟中來(lái)。顯著的開(kāi)放性可以使其擁有更多的開(kāi)發(fā)者,隨著用戶和應(yīng)用的日益豐富,一個(gè)嶄新的平臺(tái)也將很快走向成熟。
開(kāi)發(fā)性對(duì)于Android的發(fā)展而言,有利于積累人氣,這里的人氣包括消費(fèi)者和廠商,而對(duì)于消費(fèi)者來(lái)講,最大的受益正是豐富的軟件資源。開(kāi)放的平臺(tái)也會(huì)帶來(lái)更大競(jìng)爭(zhēng),如此一來(lái),消費(fèi)者將可以用更低的價(jià)位購(gòu)得心儀的手機(jī)。

豐富的硬件

這一點(diǎn)還是與Android平臺(tái)的開(kāi)放性相關(guān),由于Android的開(kāi)放性,眾多的廠商會(huì)推出千奇百怪,功能特色各具的多種產(chǎn)品。功能上的差異和特色,卻不會(huì)影響到數(shù)據(jù)同步、甚至軟件的兼容,如同從諾基亞Symbian風(fēng)格手機(jī)一下改用蘋果iPhone,同時(shí)還可將Symbian中優(yōu)秀的軟件帶iPhone上使用、聯(lián)系人等資料更是可以方便地轉(zhuǎn)移。

跨平臺(tái)

由于使用Java進(jìn)行開(kāi)發(fā),Android繼承了Java跨平臺(tái)的優(yōu)點(diǎn)。任何Android應(yīng)用幾乎無(wú)需任何修改就能運(yùn)行于所有的Android設(shè)備。包括但不限于手機(jī),平板,手環(huán),車載系統(tǒng),智能家居。

方便開(kāi)發(fā)

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

Google應(yīng)用

在互聯(lián)網(wǎng)的Google已經(jīng)走過(guò)10年度歷史,從搜索巨人到全面的互聯(lián)網(wǎng)滲透,Google服務(wù)如地圖、郵件、搜索等已經(jīng)成為連接用戶和互聯(lián)網(wǎng)的重要紐帶,而Android平臺(tái)手機(jī)將無(wú)縫結(jié)合這些優(yōu)秀的Google服務(wù)。

太碎片化

紛繁復(fù)雜的屏幕尺寸,分辨率,不同版本且訂制開(kāi)發(fā)的Android系統(tǒng),各個(gè)廠家硬件,虛擬菜單等,給開(kāi)發(fā)者帶來(lái)一定的復(fù)雜性。

截至目前發(fā)行歷史版本:

每個(gè)版本都是按照英文字母順序取的字母,然把它作為單詞第一個(gè)字母,去拼一個(gè)甜點(diǎn)的單詞,可是到了M,N,O,P,到了Q的時(shí)候就變了,改為就叫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(牛軋?zhí)牵?/li>
  • 8.0 Oreo(奧利奧)
  • 9.0 Pie (派)
  • 10.0 Android 10
系統(tǒng)架構(gòu)圖:
image.png

基于Android 8.0的系統(tǒng)根目錄結(jié)構(gòu)圖:


Android從下往上層主要分為4層,如同網(wǎng)絡(luò)的七層協(xié)議,這樣做的好處是屏蔽本層與下層的差異。

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

在linux內(nèi)核層和系統(tǒng)運(yùn)行時(shí)庫(kù)層之間還有一層硬件抽象層(Hardware Abstract Layer,HAL),它是對(duì)硬件設(shè)備的具體實(shí)現(xiàn)加以抽象。鑒于許多硬件設(shè)備廠商不希望公開(kāi)其設(shè)備驅(qū)動(dòng)的源代碼,如果能將android的應(yīng)用框架層與linux系統(tǒng)內(nèi)核的設(shè)備驅(qū)動(dòng)隔離,使應(yīng)用程序框架的開(kāi)發(fā)盡量獨(dú)立于具體的驅(qū)動(dòng)程序,則android將減少對(duì)Linux內(nèi)核的依賴。HAL由此而生,它是對(duì)Linux內(nèi)核驅(qū)動(dòng)程序進(jìn)行的封裝,將硬件抽象化,屏蔽掉了底層的實(shí)現(xiàn)細(xì)節(jié)。

系統(tǒng)運(yùn)行庫(kù)層

由系統(tǒng)類庫(kù)和Android運(yùn)行時(shí)組成。

  • 系統(tǒng)類庫(kù)(Libraries)

系統(tǒng)類庫(kù)大部分由C/C++編寫,提供的功能通過(guò)Android應(yīng)用程序框架來(lái)調(diào)用。

名稱 簡(jiǎn)介
Surface Manager 管理應(yīng)用顯示,另外也對(duì)2D和3D圖形提供支持
Media Framework 基于PacketVideo的OpenCORE的多媒體庫(kù),支持多種常見(jiàn)音視頻格式的錄制和播放
SQLite 本地小型關(guān)系數(shù)據(jù)庫(kù),如平時(shí)用數(shù)據(jù)庫(kù)用到
OpenGL 基于OpenGL ES 1.0API標(biāo)準(zhǔn)實(shí)現(xiàn)的3D跨平臺(tái)圖形庫(kù)
FreeType 用于顯示位圖和矢量字體
WebKit Web瀏覽器的軟件引擎
SGL 基于2D圖形引擎
Libc(bionic ibc) C函數(shù)庫(kù)bionic libc,更適合基于嵌入式Linux的移動(dòng)設(shè)備
SSL 安全套接層,為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議,如https請(qǐng)求需認(rèn)證

幾個(gè)常用且比較重要的C/C++程序庫(kù)所在的目錄如圖:


  • Android運(yùn)行時(shí)(Android Runtime)

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

Dalvik虛擬機(jī):Dalvik虛擬機(jī)是基于apache的java虛擬機(jī),并被改進(jìn)以適應(yīng)低內(nèi)存,低處理器速度的移動(dòng)設(shè)備環(huán)境。Dalvik虛擬機(jī)依賴于Linux內(nèi)核,實(shí)現(xiàn)進(jìn)程隔離與線程調(diào)試管理,安全和異常管理,垃圾回收等重要功能。

Jvm、Dalvik和Art

java虛擬機(jī) Dalvik虛擬機(jī)
java虛擬機(jī)基于棧,基于棧的機(jī)器必須使用指令來(lái)載入和操作棧上數(shù)據(jù) Dalvik虛擬機(jī)基于寄存器
java虛擬機(jī)運(yùn)行的是java字節(jié)碼。(java類會(huì)被編譯成一個(gè)或多個(gè)字節(jié)碼.class文件,打包到.jar文件中,java虛擬機(jī)從相應(yīng)的.class文件和.jar獲取相應(yīng)的字節(jié)碼) Dalvik運(yùn)行的是自己專屬的.dex字節(jié)碼格式。(java類被編譯成.class文件后,會(huì)通過(guò)一個(gè)dx工具將所有的.class文件轉(zhuǎn)換成一個(gè).dex文件,然后dalvik虛擬機(jī)會(huì)從其中讀取指令和數(shù)據(jù))
- 一個(gè)應(yīng)用對(duì)應(yīng)一個(gè)Diavik虛擬機(jī)實(shí)例,獨(dú)立運(yùn)行

Android應(yīng)用編譯及運(yùn)行流程:


image.png
aapt:

即Android Asset Packaging Tool(Android 打包工具),在SDK的build-tools目錄下,也行平時(shí)沒(méi)有用到過(guò),但是開(kāi)發(fā)工具生成Apk時(shí)會(huì)自動(dòng)使用aapt將代碼和資源文件打包在其中。

Apk打包流程:


image
SDK和NDK的關(guān)系:
image

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

應(yīng)用框架層(Application Framework)

應(yīng)用程序框架層提供開(kāi)發(fā)Android應(yīng)用程序所需的一系列類庫(kù),高度封裝直接調(diào)用。

應(yīng)用框架層的主要實(shí)現(xiàn)代碼在frameworks/base和frameworks/av目錄下,其中frameworks/base目錄結(jié)構(gòu)如圖:


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

根據(jù)Google給出的官方架構(gòu)圖,Android系統(tǒng)應(yīng)用開(kāi)發(fā)處于Android架構(gòu)的System Apps層,像桌面,撥號(hào)盤,日歷,相機(jī),郵件,設(shè)置等,但這些app屬于系統(tǒng)app,系統(tǒng)app本質(zhì)上跟第三方app沒(méi)什么區(qū)別,只是最終存放在Android系統(tǒng)中的位置不同,系統(tǒng)app存放在/system/priv-app/和/system/app/中,第三方app存放在/data/app/當(dāng)中,這三個(gè)目錄的權(quán)限不一樣,按照權(quán)限大小排序分別為,/system/priv-app/ > /system/app/ > /data/app/。

應(yīng)用層(Applications)

系統(tǒng)內(nèi)置的應(yīng)用程序以及非系統(tǒng)級(jí)的應(yīng)用程序都屬于應(yīng)用層,負(fù)責(zé)與用戶進(jìn)行直接交互,通常都是用Java進(jìn)行開(kāi)發(fā)的。包括設(shè)備系統(tǒng)自帶的工具,日歷,音樂(lè),瀏覽器,圖片查看等應(yīng)用,還有開(kāi)發(fā)者開(kāi)發(fā)應(yīng)用程序。

源碼根目錄中的packages目錄對(duì)應(yīng)著系統(tǒng)應(yīng)用層,目錄結(jié)構(gòu)圖:


在線閱讀Android源碼

在Android系統(tǒng)源碼官網(wǎng),各個(gè)Android版本的源碼任君挑選。
Android在線閱讀源碼地址

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

雖然我們平時(shí)開(kāi)發(fā)應(yīng)用主要行走在Applications層上,但是并不限制我們往下走,雖然這條路是艱難漫長(zhǎng)的,堅(jiān)持下去總有撥云見(jiàn)霧的一天。該篇文章保持更新。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容