您好,登錄后才能下訂單哦!
Android系統(tǒng)架構(gòu)的演變歷程是怎樣的,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
Android是一種以Linux與JAVA為基礎(chǔ)的開放源代碼操作系統(tǒng)。Android分為應(yīng)用層、應(yīng)用框架層、系統(tǒng)運(yùn)行庫層和Linux內(nèi)核層。今天大家一起來大致回顧一下Android 系統(tǒng)架構(gòu)的演變歷程。
一、android和linux內(nèi)核
Android是基于Linux內(nèi)核的操作系統(tǒng),但是它與Linux之間還是有很大的差別,比如Android在Linux內(nèi)核的基礎(chǔ)上添加了自己所特有的驅(qū)動(dòng)程序。Android為什么會(huì)選擇Linux?
1、強(qiáng)大的內(nèi)存管理和進(jìn)程管理方案
2、基于權(quán)限的安全模式
3、支持共享庫
4、經(jīng)過認(rèn)證的驅(qū)動(dòng)模型
5、Linux本身就是開源項(xiàng)目
Android對(duì)linux系統(tǒng)的改動(dòng)主要有
(1)它沒有glibc支持
由于Android最初用于一些便攜的移動(dòng)設(shè)備上,所以,可能出于效率等方面的考慮,Android并沒有采用glibc作為C庫,而是Google自己開發(fā)了一套Bionic Libc來代替glibc。
(2)它并不包括一整套標(biāo)準(zhǔn)的Linux使用程序
Android并沒有完全照搬Liunx系統(tǒng)的內(nèi)核,除了修正部分Liunx的Bug之外,還增加了不少內(nèi)容,比如:它基于ARM構(gòu)架增加的Gold-Fish平臺(tái),以及yaffs2 FLASH文件系統(tǒng)(如果學(xué)習(xí)了嵌入式的話就會(huì)知道yaffs2 FLASH文件系統(tǒng)已經(jīng)在基于linux的很多嵌入式設(shè)備上采用了,技術(shù)已經(jīng)非常成熟)等。它沒有本地基于X服務(wù)的窗口系統(tǒng)。什么是本地窗口系統(tǒng)呢?本地窗口系統(tǒng)是指GNU/Linux上的X窗口系統(tǒng),或者Mac OX X的Quartz等。不同的操作系統(tǒng)的窗口系統(tǒng)可能不一樣,Android并沒有使用(也不需要使用)Linux的X窗口系統(tǒng)。
(3)Android專有的驅(qū)動(dòng)程序
除了上面這些不同點(diǎn)之外,最重要的是,為了突出android特性,支持android設(shè)備,Android還對(duì)Linux設(shè)備驅(qū)動(dòng)進(jìn)行了增強(qiáng),主要如下所示。
a、Android Binder 基于OpenBinder框架的一個(gè)驅(qū)動(dòng),用于提供 Android平臺(tái)的進(jìn)程間通信(InterProcessCommunication,IPC)功能。源代碼位于drivers/staging/android/binder.c。
b、Android電源管理(PM) 一個(gè)基于標(biāo)準(zhǔn)Linux電源管理系統(tǒng)的輕量級(jí)Android電源管理驅(qū)動(dòng),針對(duì)嵌入式設(shè)備做了很多優(yōu)化。源代碼位于:
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
c、低內(nèi)存管理器(Low Memory Killer) 比Linux的標(biāo)準(zhǔn)的OOM(Out Of Memory)機(jī)制更加靈活,它可以根據(jù)需要?dú)⑺肋M(jìn)程以釋放需要的內(nèi)存。源代碼位于 drivers/staging/ android/lowmemorykiller.c。
d、匿名共享內(nèi)存(Ashmem) 為進(jìn)程間提供大塊共享內(nèi)存,同時(shí)為內(nèi)核提供回收和管理這個(gè)內(nèi)存的機(jī)制。源代碼位于mm/ashmem.c。
e、Android PMEM(Physical) PMEM用于向用戶空間提供連續(xù)的物理內(nèi)存區(qū)域,DSP和某些設(shè)備只能工作在連續(xù)的物理內(nèi)存上。源代碼位于drivers/misc/pmem.c。
f、Android Logger 一個(gè)輕量級(jí)的日志設(shè)備,用于抓取Android系統(tǒng)的各種日志。源代碼位于drivers/staging/android/logger.c。
g、Android Alarm 提供了一個(gè)定時(shí)器,用于把設(shè)備從睡眠狀態(tài)喚醒,同時(shí)它還提供了一個(gè)即使在設(shè)備睡眠時(shí)也會(huì)運(yùn)行的時(shí)鐘基準(zhǔn)。源代碼位于drivers/rtc/alarm.c。
h、USB Gadget驅(qū)動(dòng) 一個(gè)基于標(biāo)準(zhǔn) Linux USB gadget驅(qū)動(dòng)框架的設(shè)備驅(qū)動(dòng),Android的USB驅(qū)動(dòng)是基于gaeget框架的。源代碼位于drivers/usb/gadget/。
i、Android Ram Console 為了提供調(diào)試功能,Android允許將調(diào)試日志信息寫入一個(gè)被稱為RAM Console的設(shè)備里,它是一個(gè)基于RAM的Buffer。源代碼位于drivers/staging/android / ram_console.c。
j、Android timed device 提供了對(duì)設(shè)備進(jìn)行定時(shí)控制的功能,目前支持vibrator和LED設(shè)備。源代碼位于drivers/staging/android /timed_output.c(timed_gpio.c)。
k、Yaffs2 文件系統(tǒng) Android采用Yaffs2作為MTD nand flash文件系統(tǒng),源代碼位于fs/yaffs2/目錄下。Yaffs2是一個(gè)快速穩(wěn)定的應(yīng)用于NAND和NOR Flash的跨平臺(tái)的嵌入式設(shè)備文件系統(tǒng),同其他Flash文件系統(tǒng)相比,Yaffs2能使用更小的內(nèi)存來保存其運(yùn)行狀態(tài),因此它占用內(nèi)存小。Yaffs2的垃圾回收非常簡單而且快速,因此能表現(xiàn)出更好的性能。Yaffs2在大容量的NAND Flash上的性能表現(xiàn)尤為突出,非常適合大容量的Flash存儲(chǔ)。
二、最新的Android系統(tǒng)分為五層六區(qū)(域)
1、Linux內(nèi)核層(Linux Kernel):Android系統(tǒng)基于Linux2.6內(nèi)核,這一層為Android設(shè)備各種硬件提供了底層驅(qū)動(dòng),如顯示驅(qū)動(dòng)、音頻驅(qū)動(dòng)、照相機(jī)驅(qū)動(dòng)、藍(lán)牙驅(qū)動(dòng)、Wi-Fi驅(qū)動(dòng)、電源管理等;
2、硬件抽象層(android hardware abstraction layer):安卓驅(qū)動(dòng)硬件的方式與Linux不盡相同。傳統(tǒng)Linux的驅(qū)動(dòng)完全存活于內(nèi)核空間。Android則在內(nèi)核外部增加了硬件抽象層(HAL, Hardware Abstraction Layer) ,把一部分驅(qū)動(dòng)功能放到HAL層中。安卓為什么費(fèi)盡麻煩增加一個(gè)HAL呢?為了保護(hù)源代碼。Linux內(nèi)核采用了GPL協(xié)議,所以硬件生產(chǎn)商想要支持Linux系統(tǒng),必須遵照GPL協(xié)議公開硬件驅(qū)動(dòng)的源代碼。但這些源代碼中包含有許多硬件的設(shè)計(jì)信息,牽涉到硬件生產(chǎn)商的核心利益。而增加了HAL層之后,硬件廠商就不需要開放所有的驅(qū)動(dòng)代碼了。
3、系統(tǒng)運(yùn)行庫層(libraries):這一層通過一些C/C++庫(so庫)來為Android系統(tǒng)提供了主要的特性支持。如SQLite庫提供了數(shù)據(jù)庫支持,OpenGL ES庫提供了3D繪圖支持,Webkit庫提供了瀏覽器內(nèi)核支持等;
4、應(yīng)用框架層(application framework):這一層主要提供構(gòu)建應(yīng)用程序時(shí)可能用到的各種API,Android自帶的一些核心應(yīng)用就是使用這些API完成的,開發(fā)者也可通過使用API來構(gòu)建自己的應(yīng)用程序;應(yīng)用層(applications):這一層主要用于手機(jī)應(yīng)用的安裝,如系統(tǒng)自帶聯(lián)系人、短信等程序,或是第三方應(yīng)用程序。
以上為五層五區(qū),還有一個(gè)區(qū)域是存在于libraries層的Android運(yùn)行時(shí)庫(Android Runtime),它主要提供一些核心庫,能夠允許開發(fā)者使用Java語言來編寫Android應(yīng)用。另外Android運(yùn)行時(shí)庫中還包含了Dalvik虛擬機(jī),它使得每一個(gè)Android應(yīng)用都能運(yùn)行在獨(dú)立的進(jìn)程中,且擁有一個(gè)自己的Dalvik虛擬機(jī)實(shí)例。相較于Java虛擬機(jī),Dalvik是專門為移動(dòng)設(shè)備定制的,它針對(duì)手機(jī)內(nèi)存、CPU性能有限等情況作了優(yōu)化處理。 每個(gè)Android應(yīng)用都運(yùn)行在自己的進(jìn)程上,享有Dalvik虛擬機(jī)為它分配的專有實(shí)例。為了支持多個(gè)虛擬機(jī)在同一設(shè)備上高效運(yùn)行,dalvik被改寫過。Dalvik虛擬機(jī)執(zhí)行的是Dalvik格式的可執(zhí)行文件(.dex)-該格式經(jīng)過優(yōu)化,以將內(nèi)存好用降到最低。
三、Dalvik虛擬機(jī) 和代碼編譯
安卓的應(yīng)用是由Java編寫的,而包括HAL在內(nèi)的Linux的庫都是由C/C++編寫的,這個(gè)落差由Dalvik虛擬機(jī)銜接的。當(dāng)一個(gè)應(yīng)用運(yùn)行時(shí),進(jìn)程空間內(nèi)將包含一個(gè)Dalvik虛擬機(jī)。Java程序編譯為字節(jié)碼文件,運(yùn)行在Dalvik虛擬機(jī)中。根據(jù)Java代碼中的要求,Dalvik通過JNI(Java Native Interface)調(diào)用底層的C/C++編寫的功能。JNI是從Java中調(diào)用C/C++模塊的接口。由于上層接口的標(biāo)準(zhǔn)化,字節(jié)碼可以暢通無阻的跨平臺(tái)運(yùn)行。
Dalvik虛擬機(jī)內(nèi)部是一個(gè)“虛擬”進(jìn)程空間,有自己的棧和堆,管理代碼的運(yùn)行流程。如果這以“虛擬”進(jìn)程空間不足,Dalvik內(nèi)建的垃圾回收(garbage collection)機(jī)制會(huì)自動(dòng)清空堆上不再使用的對(duì)象。自動(dòng)的垃圾回收簡化了程序員的工作,但速度較慢。手動(dòng)內(nèi)存管理效率高,但需要更多的編程,且容易犯錯(cuò)。
Android的4種文件類型Java,class,dex,apk
Class文件------Java編譯后的目標(biāo)文件不像J2se,java編譯成class就可以直接運(yùn)行,android平臺(tái)上class文件不能直接在android上運(yùn)行。 由于Google使用了自己的Dalvik來運(yùn)行應(yīng)用, 所以這里的class也肯定不能在AndroidDalvik的java環(huán)境中運(yùn)行, android的class文件實(shí)際上只是編譯過程中的中間目標(biāo)文件,需要鏈接成dex文件后才能在dalvik上運(yùn)行
Dex文件-----Android平臺(tái)上的可執(zhí)行文件Android虛擬機(jī)Dalvik支持的字節(jié)碼文件格式Google在新發(fā)布的Android平臺(tái)上使用了自己的Dalvik虛擬機(jī)來定義, 這種虛擬機(jī)執(zhí)行的并非Java字節(jié)碼, 而是另一種字節(jié)碼: dex格式的字節(jié)碼。在編譯Java代碼之后,通過Android平臺(tái)上的工具可以將Java字節(jié)碼轉(zhuǎn)換成Dex字節(jié)碼。雖然Google稱Dalvik是為了移動(dòng)設(shè)備定做的,但是業(yè)界很多人認(rèn)為這是為了規(guī)避向sun申請(qǐng)Javalicense。這個(gè)DalvikVM針對(duì)手機(jī)程式/CPU做過最佳化,可以同時(shí)執(zhí)行許多VM而不會(huì)占用太多Resource。
Apk文件-------Android上的安裝文件Apk是Android安裝包的擴(kuò)展名,一個(gè)Android安裝包包含了與某個(gè)Android應(yīng)用程序相關(guān)的所有文件。apk文件將AndroidManifest.xml文件、應(yīng)用程序代碼(.dex文件)、資源文件和其他文件打成一個(gè)壓縮包。一個(gè)工程只能打進(jìn)一個(gè).apk文件。
看完上述內(nèi)容,你們掌握Android系統(tǒng)架構(gòu)的演變歷程是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。