今天看筆試題的時(shí)候,遇到了關(guān)于Android架構(gòu)的問(wèn)題漓概,之前看筆試題的時(shí)候也去了解過(guò)漾月,只是沒(méi)有做更詳細(xì)的筆記,于是現(xiàn)在準(zhǔn)備在簡(jiǎn)書上做一下遇到的筆試題目的筆記胃珍,以方便以后的復(fù)習(xí)梁肿。
老版:4層架構(gòu)
Android的系統(tǒng)構(gòu)架層一共有4層,由下而上分別是:Linux內(nèi)核層堂鲜,Android系統(tǒng)運(yùn)行層栈雳,Android應(yīng)用框架層,Android應(yīng)用層缔莲。
之前在牛客網(wǎng)刷筆試題目的時(shí)候霉旗,也遇到了這樣的一道題痴奏,結(jié)果答案是5層,于是去網(wǎng)上找厌秒,發(fā)現(xiàn)4層架構(gòu)是老版本的了读拆,新的版本添加了一個(gè),硬件抽象層 鸵闪,原因是由于制作手機(jī)的工廠不愿意分享源碼導(dǎo)致
新版:5層架構(gòu)
由下而上分別是:Linux內(nèi)核層檐晕,硬件抽象層,Android系統(tǒng)運(yùn)行層蚌讼,Android應(yīng)用框架層辟灰,Android應(yīng)用層
以下是官方公布的標(biāo)準(zhǔn)架構(gòu)圖:
Linux內(nèi)核層: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è)開源項(xiàng)目開始有了互通武通。Linux3.3內(nèi)核中正式包括一些Android代碼,可以直接引導(dǎo)進(jìn)入Android珊搀。Linux3.4將會(huì)增添電源管理等更多功能冶忱,以增加與Android的硬件兼容性,使Android在更多設(shè)備上得到支持
硬件抽象層:它是對(duì)硬件設(shè)備的具體實(shí)現(xiàn)加以抽象食棕。HAL沒(méi)有在Android官方系統(tǒng)架構(gòu)圖中標(biāo)明朗和。鑒于許多硬件設(shè)備廠商不希望公開其設(shè)備驅(qū)動(dòng)的源代碼错沽,如果能將android的應(yīng)用框架層與linux系統(tǒng)內(nèi)核的設(shè)備驅(qū)動(dòng)隔離,使應(yīng)用程序框架的開發(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ì)硬件層讀寫和配置的統(tǒng)一接口朝刊,本質(zhì)上就是將硬件的驅(qū)動(dòng)分為用戶空間和內(nèi)核空間兩個(gè)層面耀里;Linux內(nèi)核驅(qū)動(dòng)程序運(yùn)行于內(nèi)核空間,硬件抽象層運(yùn)行于用戶空間拾氓。
Android系統(tǒng)運(yùn)行層:它位于Linux內(nèi)核層之上的系統(tǒng)運(yùn)行庫(kù)層是應(yīng)用程序框架的支撐冯挎,為Android系統(tǒng)中的各個(gè)組件提供服務(wù)。Android系統(tǒng)運(yùn)行層由系統(tǒng)類庫(kù)和Android運(yùn)行時(shí)構(gòu)成咙鞍。
1.系統(tǒng)類庫(kù)
系統(tǒng)類庫(kù)大部分由C/C++編寫房官,所提供的功能通過(guò)Android應(yīng)用程序框架為開發(fā)者所使用,主要的系統(tǒng)類庫(kù)及說(shuō)明如下表:
除上表列舉的主要系統(tǒng)類庫(kù)之外续滋,Android NDK(Native Development Kit)翰守,即Android原生庫(kù),也十分重要疲酌。NDK為開發(fā)者提供了直接使用Android系統(tǒng)資源蜡峰,并采用C或C++語(yǔ)言編寫程序的接口。因此朗恳,第三方應(yīng)用程序可以不依賴于Dalvik虛擬機(jī)進(jìn)行開發(fā)湿颅。實(shí)際上,NDK提供了一系列從C或C++生成原生代碼所需要的工具僻肖,為開發(fā)者快速開發(fā)C或C++的動(dòng)態(tài)庫(kù)提供方便肖爵,并能自動(dòng)將生成的動(dòng)態(tài)庫(kù)和java應(yīng)用程序一起打包成應(yīng)用程序包文件,即.apk文件臀脏。
注意劝堪,使用原生庫(kù)無(wú)法訪問(wèn)應(yīng)用框架層API,兼容性可能無(wú)法保障揉稚。而且從安全性角度考慮秒啦,Android原生庫(kù)用非類型安全的程序語(yǔ)言C,C++編寫,更容易產(chǎn)生安全漏洞搀玖,原生庫(kù)的缺陷(bug)也可能更容易直接影響應(yīng)用程序的安全性余境。
2.Android運(yùn)行時(shí)
核心庫(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)試管理肥惭,安全和異常管理,垃圾回收等重要功能紊搪。
本質(zhì)而言蜜葱,Dalvik虛擬機(jī)并非傳統(tǒng)意義上的java虛擬機(jī)(JVM)。Dalvik虛擬機(jī)不僅不按照J(rèn)ava虛擬機(jī)的規(guī)范來(lái)實(shí)現(xiàn)耀石,而且兩者不兼容牵囤。
(從android4.4開始就出現(xiàn)了ART(android runtime),但是這個(gè)ART并不是指這一節(jié)的主題娶牌,而是一種用來(lái)代替Dalvik的新型運(yùn)行環(huán)境奔浅。當(dāng)然在4.4的正式環(huán)境中用的還是Dalvik,真正開始用ART取代Dalvik是從android5.0開始的诗良。)
另外補(bǔ)充一點(diǎn)sdk和ndk的關(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)用和通信径荔。
Android應(yīng)用程序框架層:
用程序框架層提供開發(fā)Android應(yīng)用程序所需的一系列類庫(kù),使開發(fā)人員可以進(jìn)行快速的應(yīng)用程序開發(fā)脆霎,方便重用組件总处,也可以通過(guò)繼承實(shí)現(xiàn)個(gè)性化的擴(kuò)展。具體包括的模塊如表:
Android應(yīng)用層:
Android平臺(tái)的應(yīng)用層上包括各類與用戶直接交互的應(yīng)用程序睛蛛,或由java語(yǔ)言編寫的運(yùn)行于后臺(tái)的服務(wù)程序鹦马。例如,智能手機(jī)上實(shí)現(xiàn)的常見(jiàn)基本功能 程序忆肾,諸如SMS短信荸频,電話撥號(hào),圖片瀏覽器客冈,日歷旭从,游戲,地圖,web瀏覽器等程序和悦,以及開發(fā)人員開發(fā)的其他應(yīng)用程序退疫。