了解Android系統(tǒng)架構(gòu)

版權(quán)聲明:本文為作者原創(chuàng)瞒御,轉(zhuǎn)載必須注明出處书妻。
轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/c2fffcd5caf2

博主本人以前是做app開(kāi)發(fā)的啼县,之后轉(zhuǎn)做framework開(kāi)發(fā)衰絮,因?yàn)閍ndroid系統(tǒng)非常龐大繁雜凝赛,以前積累的知識(shí)都比較零散注暗,沒(méi)有一個(gè)整體的認(rèn)識(shí),所以這篇文章希望先對(duì)整個(gè)android系統(tǒng)架構(gòu)有個(gè)比較完整的了解墓猎,之后再細(xì)分模塊來(lái)逐一學(xué)習(xí)捆昏。
那么先來(lái)看看整個(gè)Android系統(tǒng)的架構(gòu):

從圖上可以看到,Android使用的是層級(jí)式架構(gòu)毙沾,好處就是高內(nèi)聚骗卜、低耦合。各層相對(duì)獨(dú)立左胞,我不需要知道其他層的具體業(yè)務(wù)和邏輯寇仓,我單純地只需要從下層拿到對(duì)應(yīng)的內(nèi)容,把它包裝好烤宙,提供給上層使用遍烦,就類似于工廠流水線。
下面對(duì)每層做個(gè)簡(jiǎn)單的介紹:

一躺枕、應(yīng)用層:
Android平臺(tái)的應(yīng)用層上包括各類與用戶直接交互的應(yīng)用程序服猪,或由java語(yǔ)言編寫(xiě)的運(yùn)行于后臺(tái)的服務(wù)程序,這里分為系統(tǒng)應(yīng)用和第三方應(yīng)用拐云。其中系統(tǒng)應(yīng)用可用作用戶的應(yīng)用罢猪,以及提供開(kāi)發(fā)者可從其自己的應(yīng)用訪問(wèn)的主要功能。例如叉瘩,如果您的應(yīng)用要發(fā)短信坡脐,您無(wú)需自己構(gòu)建該功能,可以改為調(diào)用已安裝的短信應(yīng)用向您指定的接收者發(fā)送消息房揭。

二、framework層:該層的實(shí)現(xiàn)是Java
提供開(kāi)發(fā)Android應(yīng)用程序所需的一系列基礎(chǔ)API支持晌端,包括了開(kāi)發(fā)所需的一系列組件和系統(tǒng)服務(wù)等捅暴。
包括:
1)應(yīng)用程序框架:這一層可以理解為 Android SDK,提供四大組件咧纠,視圖系統(tǒng)(View System)蓬痒、各種Manager等等平時(shí)開(kāi)發(fā)中用到的基礎(chǔ)部件。以下列舉一部分:

應(yīng)用程序框架層類庫(kù)名稱 功能
活動(dòng)管理器(Activity Mananger) 管理各個(gè)應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能漆羔,為所有程序的窗口提供交互的接口
窗口管理器(Window Manager) 對(duì)所有開(kāi)啟的窗口程序進(jìn)行管理
內(nèi)容提供器(Content Provider) 提供一個(gè)應(yīng)用程序訪問(wèn)另一個(gè)應(yīng)用程序數(shù)據(jù)的功能梧奢,或者實(shí)現(xiàn)應(yīng)用程序之間的數(shù)據(jù)共享
視圖系統(tǒng)(View System) 創(chuàng)建應(yīng)用程序的基本組件狱掂,包括列表(lists),網(wǎng)格(grids)亲轨,文本框(text boxes)趋惨,按鈕(buttons),還有可嵌入的web瀏覽器惦蚊。
通知管理器(Notification Manager) 使應(yīng)用程序可以在狀態(tài)欄中顯示自定義的客戶提示信息
包管理器(Package Manager) 對(duì)應(yīng)用程序進(jìn)行管理器虾,提供的功能諸如安裝應(yīng)用程序,卸載應(yīng)用程序蹦锋,查詢相關(guān)權(quán)限信息等兆沙。
資源管理器(Resource Manager) 提供各種非代碼資源供應(yīng)用程序使用,如本地化字符串莉掂,圖片葛圃,音頻等
位置管理器(Location Manager) 提供位置服務(wù)
電話管理器(Telephony Manager) 管理所有的移動(dòng)設(shè)備功能
XMPP服務(wù) 是Google在線即時(shí)交流軟件中一個(gè)通用的進(jìn)程,提供后臺(tái)推送服務(wù)

2)Java系統(tǒng)服務(wù): 這部分系統(tǒng)服務(wù)又可以分為兩種:Java核心系統(tǒng)服務(wù)和Java硬件系統(tǒng)服務(wù)憎妙。
(1)Java核心系統(tǒng)服務(wù)是Android系統(tǒng)正常運(yùn)轉(zhuǎn)的基礎(chǔ)库正,包括大家所熟知的AMS、WMS尚氛、PMS等诀诊。例如:

(2)Java硬件服務(wù)是為應(yīng)用提供硬件控制服務(wù),如電話服務(wù)阅嘶、wifi服務(wù)属瓣、PowerManagerService等。例如:

該兩層之前讯柔,通過(guò)Binder實(shí)現(xiàn)進(jìn)程間通信抡蛙。允許framework來(lái)跨進(jìn)程邊界,來(lái)調(diào)用Android的系統(tǒng)服務(wù)的代碼魂迄,這使得框架API與Android系統(tǒng)服務(wù)能夠進(jìn)行交互粗截。

總結(jié):應(yīng)用程序---SDK---->系統(tǒng)框架層---Binder IPC--->系統(tǒng)服務(wù)層。

以app 獲取GPS信息為例:

三捣炬、native層:該層的實(shí)現(xiàn)是C/C++
開(kāi)篇首張圖中熊昌,用紅線框住的均屬于該層:包括C/C++ libs 、android runtime湿酸、HAL
1)C/C++ libs:C/C++編寫(xiě)的系統(tǒng)類庫(kù)
(1) 本地守護(hù)進(jìn)程
init進(jìn)程根據(jù)init.rc文件中的定義婿屹,啟動(dòng)本地守護(hù)進(jìn)程。這些進(jìn)程會(huì)常駐在系統(tǒng)中推溃,有的只會(huì)啟動(dòng)一次昂利,有的如果退出了,還會(huì)被init啟動(dòng)。具體的啟動(dòng)方式就在init.rc中定義蜂奸。
下面大體列舉幾個(gè)守護(hù)進(jìn)程及其功能犁苏。

守護(hù)進(jìn)程 功能
vold 管理存儲(chǔ)設(shè)備,自動(dòng)安裝存儲(chǔ)設(shè)備扩所,將設(shè)備分區(qū)格式化
netd 管理藍(lán)牙围详、wifi、usb等各種網(wǎng)絡(luò)連接
installd 負(fù)責(zé)安裝及卸載軟件包碌奉,確認(rèn)軟件包的完整性
rild 接收來(lái)自于phone應(yīng)用程序或其他客戶端程序發(fā)出的調(diào)制解調(diào)控制請(qǐng)求短曾,并傳遞給調(diào)制解調(diào)器
adbd 提供可以調(diào)試Android的環(huán)境
servicemanager binder通信大管家
surfaceflinger 負(fù)責(zé)android系統(tǒng)的UI圖形顯示
mediaserver 負(fù)責(zé)播放音頻、視頻赐劣,camera拍照錄像

(2) Native系統(tǒng)服務(wù)
由c++語(yǔ)言編寫(xiě)嫉拐,運(yùn)行在本地守護(hù)進(jìn)程中。比如mediaserver守護(hù)進(jìn)程中就包含AudioFlinger魁兼、MediaPlayerService婉徘、CameraService、AudioPolicyService和SoundTriggerHwService等服務(wù)咐汞。在所屬進(jìn)程初始化的時(shí)候會(huì)將Native系統(tǒng)服務(wù)注冊(cè)到ServiceManager中盖呼。這樣,其他的應(yīng)用或服務(wù)就可以通過(guò)binder機(jī)制調(diào)用Native系統(tǒng)服務(wù)了化撕。 當(dāng)然几晤,我們也可以自己開(kāi)發(fā)一個(gè)Native系統(tǒng)服務(wù),實(shí)現(xiàn)其Binder接口植阴,這樣Native層的其他應(yīng)用或服務(wù)就可以調(diào)用該服務(wù)了蟹瘾。 如果我們開(kāi)發(fā)的Native系統(tǒng)服務(wù)想提供給Java層應(yīng)用使用,就需要實(shí)現(xiàn)一個(gè)Java接口掠手,然后通過(guò)JNI調(diào)用Native系統(tǒng)服務(wù)憾朴。

(3) 功能性的Native類庫(kù)支持
比如:Webkit 、OpenGL ES 喷鸽、SQlite等众雷。

通過(guò)一張圖對(duì)系統(tǒng)服務(wù)有個(gè)大致了解:

2)Android Runtime: Android運(yùn)行環(huán)境,對(duì)java提供支持
(1) 虛擬機(jī):Dalvik and Art(android 4.4之后)
作用:面向Linux做祝、為嵌入式操作系統(tǒng)設(shè)計(jì)的虛擬機(jī)砾省,主要負(fù)責(zé)完成對(duì)象生命周期管理、堆棧管理混槐、線程管理纯蛾、安全和異常管理,以及垃圾回收等纵隔。
android為每個(gè)程序提供一個(gè)vm,可以使每個(gè)app都運(yùn)行在獨(dú)立的運(yùn)行環(huán)境,使穩(wěn)定性提高捌刮,并且一個(gè)vm能運(yùn)行多個(gè)進(jìn)程碰煌。
android apk都被編譯成字節(jié)碼(bytecode),在運(yùn)行的時(shí)候绅作,vm是先將字節(jié)碼編譯真正可執(zhí)行的代碼芦圾,否則不同硬件設(shè)備的兼容是很大的麻煩。
(2) core libs: 核心庫(kù)提供了Java se API的多數(shù)功能,包括JNI俄认,并提供Android的核心API个少,如android.os,android.net眯杏,android.media等夜焦。

  1. HAL 硬件抽象層 基于商業(yè)隱私考慮,對(duì)Kernel層進(jìn)行二次封裝岂贩,屏蔽數(shù)據(jù)處理細(xì)節(jié),運(yùn)行于用戶空間茫经。
    鑒于商業(yè)隱私考慮,許多硬件設(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é)遂黍。HAL規(guī)定了一套應(yīng)用層對(duì)硬件層讀寫(xiě)和配置的統(tǒng)一接口,本質(zhì)上就是將硬件的驅(qū)動(dòng)分為用戶空間和內(nèi)核空間兩個(gè)層面儡炼;Linux內(nèi)核驅(qū)動(dòng)程序運(yùn)行于內(nèi)核空間妓湘,硬件抽象層運(yùn)行于用戶空間乌询。也正是由于這個(gè)分層的原因,Android被踢出了Linux內(nèi)核主線代碼樹(shù)中妹田。大家想想,Android放在內(nèi)核空間的驅(qū)動(dòng)程序?qū)τ布闹С质遣煌暾墓碛叮袻inux內(nèi)核移植到別的機(jī)器上去時(shí),由于缺乏硬件抽象層的支持晶衷,硬件就完全不能用了阴孟,這也是為什么說(shuō)Android是開(kāi)放系統(tǒng)而不是開(kāi)源系統(tǒng)的原因。

另外談到該層永丝,還需要了解兩個(gè)東西:
JNI:Java Native Interface,即 Java本地接口慕嚷。使得Java 與 本地其他類型語(yǔ)言(如C、C++)交互喝检。JNI 是屬于 Java 的,與 Android 無(wú)直接關(guān)系撼泛。
NDK:Native Development Kit,是 Android的一個(gè)工具開(kāi)發(fā)包 坎弯。快速開(kāi)發(fā)C抠忘、 C++的動(dòng)態(tài)庫(kù)撩炊,并自動(dòng)將so和應(yīng)用一起打包成 APK 即可通過(guò) NDK在 Android中 使用 JNI與本地代碼(如C、C++)交互崎脉。NDK是屬于 Android 的拧咳,與Java并無(wú)直接關(guān)系。

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)用和通信阅签。

四、Kernel層:
Android以Linux操作系統(tǒng)內(nèi)核為基礎(chǔ)蝎抽,借助Linux內(nèi)核服務(wù)實(shí)現(xiàn)硬件設(shè)備驅(qū)動(dòng)政钟,進(jìn)程和內(nèi)存管理,網(wǎng)絡(luò)協(xié)議棧樟结,電源管理养交,無(wú)線通信等核心功能。Android4.0版本之前基于Linux2.6系列內(nèi)核瓢宦,4.0及之后的版本使用更新的Linux3.X內(nèi)核碎连,并且兩個(gè)開(kāi)源項(xiàng)目開(kāi)始有了互通。Linux3.3內(nèi)核中正式包括一些Android代碼驮履,可以直接引導(dǎo)進(jìn)入Android鱼辙。Linux3.4增添了電源管理等更多功能廉嚼,以增加與Android的硬件兼容性,使Android在更多設(shè)備上得到支持座每。直到現(xiàn)在最新的android6.0仍然繼續(xù)延用著linux3.4.0前鹅,而linux最新的版本已經(jīng)到了4.3系列,那么為什么android沒(méi)有繼續(xù)去更新Linux kernel的版本也是一個(gè)值得探討的課題峭梳。
Android內(nèi)核 對(duì)Linux內(nèi)核進(jìn)行了增強(qiáng),增加了一些面向移動(dòng)計(jì)算的特有功能蹂喻。例如葱椭,低內(nèi)存管理器LMK(Low Memory Keller),匿名共享內(nèi)存(Ashmem),以及輕量級(jí)的進(jìn)程間通信Binder機(jī)制等口四。這些內(nèi)核的增強(qiáng)使Android在繼承Linux內(nèi)核安全機(jī)制的同時(shí)孵运,進(jìn)一步提升了內(nèi)存管理,進(jìn)程間通信等方面的安全性蔓彩。下表列舉了Android內(nèi)核的主要驅(qū)動(dòng)模塊:

驅(qū)動(dòng)名稱 說(shuō)明
Android電源管理(Power Management) 針對(duì)嵌入式設(shè)備的治笨,基于標(biāo)準(zhǔn)Linux電源管理系統(tǒng)的赤嚼,輕量級(jí)的電源管理驅(qū)動(dòng)
低內(nèi)存管理器(Low Memory Keller) 低內(nèi)存管理器(Low Memory Keller) 可以根據(jù)需要?dú)⑺肋M(jìn)程來(lái)釋放需要的內(nèi)存。擴(kuò)展了Linux的OOM機(jī)制等孵,形成獨(dú)特的LMK機(jī)制
匿名共享內(nèi)存(Ashmem) 為進(jìn)程之間提供共享內(nèi)存資源蹂空,同時(shí)為內(nèi)核提供回收和管理內(nèi)存的機(jī)制
日志(Android Logger) 一個(gè)輕量級(jí)的日志設(shè)備
定時(shí)器(Anroid 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)潔迅速嘲玫。
Android Paranoid網(wǎng)絡(luò) 對(duì)Linux內(nèi)核的網(wǎng)絡(luò)代碼進(jìn)行了改動(dòng),增加了網(wǎng)絡(luò)認(rèn)證機(jī)制抡诞。可在IPV4肴熏,IPV6和藍(lán)牙中設(shè)置顷窒,由ANDROID_PARANOID_NETWORK宏來(lái)啟用此特性。

參考文章:
http://gityuan.com/2015/08/01/android-arvchitecture/
http://gityuan.com/android/
http://blog.csdn.net/sp6645597/article/details/50472740
http://blog.csdn.net/u010753159/article/details/52193061
http://blog.csdn.net/lpjishu/article/details/50781415
http://blog.csdn.net/luoshengyang/article/details/6567257

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載鸦做,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者泼诱。
  • 序言:七十年代末治筒,一起剝皮案震驚了整個(gè)濱河市舷蒲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌句灌,老刑警劉巖胰锌,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件资昧,死亡現(xiàn)場(chǎng)離奇詭異荆忍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)叽唱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)棺亭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蟋软,“玉大人嗽桩,你說(shuō)我怎么就攤上這事碌冶±苑欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵嫩挤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我以现,道長(zhǎng),這世上最難降的妖魔是什么佣赖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任憎蛤,我火速辦了婚禮纪吮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棚辽。我一直安慰自己冰肴,他們只是感情好熙尉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布检痰。 她就那樣靜靜地躺著,像睡著了一般箫踩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上境钟,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天慨削,我揣著相機(jī)與錄音,去河邊找鬼缚态。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浆熔,可吹牛的內(nèi)容都是我干的医增。 我是一名探鬼主播老虫,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼祈匙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了跪帝?” 一聲冷哼從身側(cè)響起洁闰,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扑眉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后聘裁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弓千,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年谴餐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岂嗓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹊碍。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖公罕,靈堂內(nèi)的尸體忽然破棺而出耀销,到底是詐尸還是另有隱情,我是刑警寧澤摩桶,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站辅斟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏查邢。R本人自食惡果不足惜酵幕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一芳撒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芥备,春花似錦舌菜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至勒庄,卻和暖如春瘫里,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谨读。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工劳殖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宣增。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓爹脾,卻偏偏與公主長(zhǎng)得像箕昭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泌霍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容