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