1. 瞭解Java虛擬機linux
圖1 JVM虛擬機結構api
上面這篇文章說的很好,總結來講就是爲了跨平臺(操做系統):Windows,Linux,Mac OS.安全
爲何不在執行的時候,把Java編譯成每一個系統適配的可執行代碼呢?還須要費事情安裝虛擬機?網絡
目的就是,雖然虛擬機安裝的時候費時間,可是能夠保證Java的代碼,只須要一次編譯,就能夠在任何地方執行.架構
Java編譯成了.class文件,在虛擬機執行.框架
比較C語言能夠發現,雖然C語言也能夠稱做跨平臺,但只是源代碼的跨平臺(也不必定,有時候不一樣系統的庫不同,還須要適配呢!).ionic
在Windows編譯成的可執行的文件並非能夠跨平臺執行的.ide
因此是否是能夠推測,Java之因此這麼麻煩作一個虛擬機,是由於」編譯」這件事情,是一個很麻煩的事情!學習
回想一下你們吃飯前編譯甚至下班前編譯的事情,就解釋通了.
2. Android爲何不使用JVM?
Android是一個相似Windows的操做系統, 在操做系統上運行的是虛擬機,再往上,程序就是在虛擬機上編譯運行的.
Java程序運行須要完整的虛擬機環境,而Android系統自己又是一個開源項目,
因此沒法直接使用商用的JVM(假如Android開源,而上層的JVM不開源,那麼對於開發者來講有什麼意義呢?).
另外, JVM也不支持不一樣的終端,由於JVM只是適配了Windows和Linux的硬件.
Android使用的虛擬機叫Dalvik, 以後備ART取代.
Dalvik採用的是JIT(動態編譯)機制,每次運行時都會把字節碼轉換爲機器碼,致使應用在運行時效率變慢;
ART採用的是AOT(機制),在應用安裝的時候就會把字節碼轉化爲機器碼. 他們被稱爲DVM或者AVM.
DVM和AVM不如JVM有名, 那是由於你們在Windows或者Linux上進行開發的時候, 都須要手動安裝對應版本的JVM,
而AVM只須要適配Android,因此不須要程序員手動安裝, 知名度不高.
話說回來, 既然在終端上的Java只須要在Android上運行,那麼爲何還要使用虛擬機呢?
虛擬機不就是爲了適配不一樣的操做系統的嗎?由於Java只能夠運行在虛擬機上!
爲了照顧到廣大Java程序員, 同時讓他們快速轉到Android開發, 就開發了Java虛擬機.
參考連接:安卓一開始要引入Dalvik虛擬機機制?
還有還有, 谷歌使用虛擬機這個專利產品, 全部的應用都是安裝在Android系統的虛擬機,而不是Linux上,
這樣谷歌就有了本身的核心東西,並且沒必要開源.
我是否是能夠理解, Android系統的底層就是LInux Kernel + AVM + 相關庫?
3. Java, Android, Linux Kernel的關係
如今看來,它們三者的關係應該是如圖所示:
圖2 Android 系統的架構(這個圖片在網上廣爲流傳了)
也就是說,Android借用了Linux Kernel的一些有用的東西,好比強大的內存管理和進程管理方案,基於權限的安全模式,支持共享庫等等...
可是, Android也對Linux作了改進,好比沒有采用glibc做爲C庫,本身開發了一套Bionic Libc做爲替代; 對Linux Kernel的設備驅動進行了加強, 對電源管理進行了優化,等等.
因爲改動太多, 並且廠商的設備信息都放在HAL層, 並不寫在驅動裏面,因此不符合Linux社區要求, Android一直不想Ubuntu, Debian, CentOS那樣,認爲是Linux分支/發行版.
這麼看來, Android是和Ubuntu相似,借用Linux Kernel開發出一個系統. 只不過Android開發到上層就是提供了一個虛擬機, 並且Android對Linux Kernel的修改更大.
參考連接: 安卓與Linux的區別與聯繫
4. Android應用層開發
也就是手機應用開發,調用下層framework提供的Android api,以及消息機制,來開發的應用程序, 包括APP和system APP, 具備表明性的好比QQ的開發.
5. Android 框架層(framework)開發
介紹1: 安卓開發方向分類-應用層,框架層,底層
圖5 framework的上下層
理解: 下層,是Android運行時, 包括運行時的核心庫, 就是上面提到的谷歌本身使用C/C++開發出來的庫, 和Dalvik/ART虛擬機.
這是Android的核心, 谷歌是不會讓你動的. 因此framework就是各個手機廠家的舞臺.
他們基於谷歌提供的庫和虛擬機,或者Linux Kernel封裝的核心庫(見圖2, Android和Linux Kernel封裝的庫是平行的), 開發出本身的framework, 再在System Apps層開發出一些核心Apps(好比UI, 通信錄,等),裝在手機上, 就成了本身的手機.
以上並不對! framework也是Google提供給廣大Java開發者的, Android 應用都是經過framework與Android或者Linux 封裝庫進行交互的.
framework提供了可擴展的視圖,用來構建應用程序, 好比list, buttons等, 因此說, MIUI和普通的Apps同樣,都是在framework上?
UI是的,可是MIUI還對原生Android進行了其餘深度修改, 反正大多數只須要安裝在本身的硬件上,因此多改點也不要緊.
不少OS都是基於Android的深度定製,有的修改了UI(說明原生Android也是有UI的),有的修改了內核代碼.
(只能理解到這裏了,歡迎更正)
6. C++本地庫和Android底層(也叫系統運行庫與Android實時運行)
Android底層下面就是Linux kernel嗎?Android底層指的是什麼?仍是說Linux kernel自己就是Android的最底層?
Android底層就是Android runtime + 公共庫, 其中Android runtime又包括Google本身開發的庫和DVM/AVM,
這纔是谷歌最核心的部分,並且因爲在Linux Kernel之上,因此不須要公佈源代碼.
C++ 本地庫和Android在同一層, APP應用開發者能夠直接使用C++ 本地庫的接口,來實現官方API未實現的功能???
我不肯定, 應用開發者是否能夠直接調用C++ 的本地庫?
根據大多數結構體,應該不能夠,由於C++上面還有framework封裝.
也就是說,即便是C++ 庫也被framework封裝過了.否則Android結構圖就不會像上面這樣畫了.
7. Linux 核心層
Linux Kernel
Android最終是和硬件打交道, 如何打交道?
既然Linux系統的硬件驅動比較豐富,不如直接借用Linux系統做爲Android最底層,來負責管理硬件,好比驅動,進程管理,內存管理,網絡管理等等.
爲了保證Android系統的精簡和獨特性,不能使用成熟的Linux系統,因此這裏只是借用Linux Kernel.
可是,Android內核和Linux內核並非徹底相同的.
Android內核在文件系統,進程通訊機制以及內存管理等方面作出了優化.
好比內存增長了對YAFFS2的支持,增長了進程間的通訊機制,採用了一宗不一樣於Linux內核標準的低內存管理策略...
參考: Android系統四層體系結構詳解 (寫的很詳細,值得一看)
硬件抽象層
Android的硬件抽象層,簡單來講就是對Linux內核驅動程序的封裝.向上提供接口,屏蔽底層的實現細節.
Android系統中,對硬件的支持分爲兩層:放在內核空間的硬件驅動層, 放在用戶空間的硬件抽象層(HAL).
爲何要分開放?
爲了Linux發佈開源內核的時候,廠家能夠不參與硬件驅動層, 只負責編寫硬件抽象層的部分,這樣就能夠把本身硬件信息隱藏起來.
圖7 HAL層在Android底層中?!
HAL層不可能放在Linux Kernel中,也不會放在framework中,因此應該放在Android底層中,由硬件廠商提供.好比相機的HAL層.
想要關於HAL層,還須要進一步重點學習.