自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

安卓第二夜:有趣的架構(gòu)

移動(dòng)開發(fā) Android
學(xué)習(xí)安卓的架構(gòu),是從操作系統(tǒng)的角度理解安卓。安卓使用Linux內(nèi)核,但安卓的架構(gòu)又與常見的Linux系統(tǒng)有很大的區(qū)別。我們先來回顧一下傳統(tǒng)的Linux架構(gòu),再來看安卓的變化。

Linux系統(tǒng)架構(gòu)

先來看常見的Linux系統(tǒng)架構(gòu),你可以參考Linux的架構(gòu)

內(nèi)核是系統(tǒng)的底層。Linux開機(jī)后,內(nèi)核即啟動(dòng),并存活于屬于自己的內(nèi)存空間,即內(nèi)核空間(kernel space)。內(nèi)核的一大功能是和硬件通信。內(nèi)核中包含各種驅(qū)動(dòng)程序,這些驅(qū)動(dòng)程序既能實(shí)現(xiàn)底層的硬件讀寫操作,又包含硬件使用邏輯。比如一臺(tái)打印機(jī)的驅(qū) 動(dòng),會(huì)把打印指令放在內(nèi)存中的A位置,把打印數(shù)據(jù)放在內(nèi)存中的B位置。打印機(jī)讀取指令后,會(huì)從B位置取得數(shù)據(jù)打印。在內(nèi)核上層,驅(qū)動(dòng)程序的功能被抽象為函 數(shù)調(diào)用,比如printx(data)。這個(gè)函數(shù)調(diào)用隱藏了許多細(xì)節(jié),比如如何執(zhí)行讀寫,以及A和B的具體位置。

除了抽象硬件外,內(nèi)核還維護(hù)著Linux的許多重要運(yùn)行機(jī)制,比如虛擬內(nèi)存、調(diào)度器、信號(hào)以及進(jìn)程間通信(IPC)。內(nèi)核的功能接口是系統(tǒng)調(diào)用(system call)函數(shù)。

用戶使用C或者C++編寫的程序,將編譯成機(jī)器碼,運(yùn)行成為一個(gè)進(jìn)程(process)。 每個(gè)進(jìn)程都會(huì)有一個(gè)自己的進(jìn)程空間。進(jìn)程空間存活于內(nèi)核空間之外的用戶空間(user space)。進(jìn)程空間中包含程序的代碼和數(shù)據(jù)。不同進(jìn)程的進(jìn)程空間相互獨(dú)立。進(jìn)程間如果想要相互交流,需要借用特殊的進(jìn)程間通信(IPC)機(jī)制。進(jìn)程空 間中有棧(stack)和堆(heap)。當(dāng)執(zhí)行到新的函數(shù)調(diào)用時(shí),棧頂會(huì)增加一幀(stack frame),用于記錄該函數(shù)的數(shù)據(jù)和返回地址。當(dāng)函數(shù)執(zhí)行完成時(shí),該幀會(huì)彈出,并根據(jù)返回地址接著執(zhí)行母程序的指令。堆中的空間由程序自由分配。你可以 進(jìn)一步參考Linux從程序到進(jìn)程。

Linux的程序大多是C和C++編寫。代碼被編譯為機(jī)器碼,以便計(jì)算機(jī)理解。常用的代碼被編譯成(library)。程序員可以從自己的程序中調(diào)用庫函數(shù),來重復(fù)利用已有代碼。程序中調(diào)用庫函數(shù)時(shí),庫中包含的機(jī)器代碼會(huì)加載入程序?qū)?yīng)的進(jìn)程空間。

Android架構(gòu)

我們現(xiàn)在來看看安卓的架構(gòu)。Android的底層使用的是Linux內(nèi)核。在用戶空間中,每個(gè)應(yīng)用也會(huì)運(yùn)行為一個(gè)進(jìn)程。但安卓細(xì)節(jié)方面和傳統(tǒng)Linux差別很大。

HAL

安卓驅(qū)動(dòng)硬件的方式與Linux不盡相同。傳統(tǒng)Linux的驅(qū)動(dòng)完全存活于內(nèi)核空間。Android則在內(nèi)核外部增加了硬件抽象層(HAL, Hardware Abstraction Layer),把一部分驅(qū)動(dòng)功能放到HAL層中。你或許會(huì)奇怪,安卓為什么費(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)代碼了。

我們來看看HAL的具體工作方式。安卓的HAL存活在用戶空間,它與內(nèi)核驅(qū)動(dòng)通信。但HAL是個(gè)“空殼”,安卓會(huì)根據(jù)需要,加載不同的動(dòng)態(tài)庫,比如調(diào)用計(jì)算機(jī)時(shí),載入libprinter.so。這個(gè)動(dòng)態(tài)庫是由硬件廠商提供的。比 如上面的打印機(jī),硬件廠商可以把讀寫功能做成驅(qū)動(dòng)。而“指令寫入位置A、數(shù)據(jù)寫入位置B”這樣的高層邏輯,則編譯成庫文件(.so)。當(dāng)我們使用打印機(jī)打 印時(shí),我們將打印需求和數(shù)據(jù)發(fā)送給HAL。HAL加載對(duì)應(yīng)的動(dòng)態(tài)庫,通過內(nèi)核驅(qū)動(dòng)的讀寫功能,將指令寫入打印機(jī)的內(nèi)存位置A,數(shù)據(jù)寫入位置B。打印機(jī)預(yù)裝 的程序從位置A讀到打印指令,就會(huì)從位置B讀取數(shù)據(jù),實(shí)現(xiàn)打印。這樣,HAL實(shí)際上把部分驅(qū)動(dòng)功能放入到動(dòng)態(tài)庫中,內(nèi)核中的驅(qū)動(dòng)只保留最基本的讀寫操作功能。部分驅(qū)動(dòng)功能從內(nèi)核空間轉(zhuǎn)移到了用戶空間。由于高層邏輯是編譯好的.so文件,打印機(jī)廠商不用擔(dān)心如指令位置A、數(shù)據(jù)位置B這樣的信息泄露。

安卓的HAL模塊是從Linux內(nèi)核導(dǎo) 出的,所以源代碼公開。HAL是Apache協(xié)議,并不要求它的配套程序,如硬件驅(qū)動(dòng)的源碼公開。由于這些庫函數(shù)沒有直接調(diào)用內(nèi)核,所以不需要釋放源代 碼。通過HAL層,安卓保護(hù)了硬件廠商的商業(yè)利益,鼓勵(lì)了硬件廠商對(duì)安卓系統(tǒng)的支持。

當(dāng)然,Linux開發(fā)小組對(duì)此很不高興,把安卓的開發(fā)分支從Linux內(nèi)核中刪除。

安卓的HAL模塊是從Linux內(nèi)核導(dǎo) 出的,所以源代碼公開。HAL是Apache協(xié)議,并不要求它的配套程序,如硬件驅(qū)動(dòng)的源碼公開。由于這些庫函數(shù)沒有直接調(diào)用內(nèi)核,所以不需要釋放源代 碼。通過HAL層,安卓保護(hù)了硬件廠商的商業(yè)利益,鼓勵(lì)了硬件廠商對(duì)安卓系統(tǒng)的支持。

當(dāng)然,Linux開發(fā)小組對(duì)此很不高興,把安卓的開發(fā)分支從Linux內(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)

Dalvik虛擬機(jī)內(nèi)部是一個(gè)“虛擬”進(jìn)程空間,有自己的棧和堆,管理代碼的運(yùn)行流程。如果這以“虛擬”進(jìn)程空間不足,Dalvik內(nèi)建的垃圾回收(garbage collection)機(jī)制會(huì)自動(dòng)清空堆上不再使用的對(duì)象。自動(dòng)的垃圾回收簡(jiǎn)化了程序員的工作,但速度較慢。手動(dòng)內(nèi)存管理效率高,但需要更多的編程,且容易犯錯(cuò)。垃圾回收的具體原理可參考Java內(nèi)存管理與垃圾回收。 

當(dāng)然,Oracle不高興,認(rèn)為Dalvik是對(duì)JVM赤裸裸的抄襲。

Core Library和Android Framework

Android程序員的主要工作是編寫Dalvik上運(yùn)行的Java程序。Google提供了核心類庫(Java core library),它包括Java的常用類庫,如:

java.lang

java.util

java.math

java.net

...

這些類庫的API,與Oracle的官方API相同,所以你可以按照同樣的方法調(diào)用。

核心類庫中還包括Dalvik虛擬機(jī)的調(diào)用接口:

dalvik.annotation

dalvik.bytecode

dalvik.system

安卓程序員還可以調(diào)用一些針對(duì)安卓的類庫,即安卓框架(Android Framework)。這些類庫對(duì)應(yīng)安卓的特定功能。通過它們,我們可以操縱安卓上的各個(gè)功能模塊,從觸屏到GPS,從視圖元素到數(shù)據(jù)庫。如:

android.database

android.bluetooth

android.gesture

...

安卓相關(guān)的類庫列表

核心類庫和安卓框架是安卓程序員的左膀右臂。再加上Java語言本身的邏輯,這就是安卓程序員戰(zhàn)斗著的世界了。我會(huì)在以后的文章中,繼續(xù)深入這個(gè)戰(zhàn)場(chǎng)。

多謝微博 @文藝復(fù)興記 指導(dǎo)我Dalvik的相關(guān)內(nèi)容。下面資料也幫助了我理解:

http://sujaiantony.wordpress.com/2012/06/25/an-android-101-hardware-and-hal

總結(jié)

HAL

Dalvik

Core Library

Android Framework

本文鏈接:http://www.cnblogs.com/vamei/p/3769067.html

責(zé)任編輯:chenqingxiang 來源: cnblogs
相關(guān)推薦

2014-08-04 13:56:42

安卓概念

2012-02-06 10:10:40

安卓iOS美國(guó)市場(chǎng)

2013-12-12 16:51:43

安卓進(jìn)化AndroidGoogle

2021-07-26 10:09:43

鴻蒙HarmonyOS應(yīng)用

2018-11-07 17:00:06

2014-05-07 09:36:56

Android安卓架構(gòu)設(shè)計(jì)

2014-11-14 15:59:07

英特爾架構(gòu)安卓平臺(tái)創(chuàng)新

2014-11-14 17:15:42

英特爾

2014-08-15 14:00:11

IT基礎(chǔ)架構(gòu)

2013-12-12 16:23:53

安卓進(jìn)化AndroidGoogle

2020-10-14 07:27:08

MacBook

2019-06-20 16:07:12

鴻蒙安卓操作系統(tǒng)

2015-09-23 10:23:08

2021-10-26 06:59:40

Windows 11操作系統(tǒng)微軟

2012-09-26 09:59:04

項(xiàng)目項(xiàng)目回顧手機(jī)隱私保護(hù)

2013-07-22 17:09:07

安卓架構(gòu)師

2021-09-10 22:25:37

iOS蘋果安卓

2018-02-09 08:59:47

安卓FuchsiaiOS

2013-11-04 14:49:34

安卓

2020-09-11 17:42:48

戴爾
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)