專家專欄:Android層次化安全架構(gòu)及核心組件概覽
原創(chuàng)【51CTO獨(dú)家特稿】本文為51CTO專欄作家李洋的最新一篇文章《Android層次化安全架構(gòu)及核心組件概覽》,本文將詳細(xì)介紹Android層次化安全架構(gòu)及其核心組件。
Android層次化安全架構(gòu)
Android作為一個(gè)移動(dòng)設(shè)備的平臺(tái),其軟件層次結(jié)構(gòu)包括了一個(gè)操作系統(tǒng)(OS),中間件(MiddleWare)和應(yīng)用程序(Application)。根據(jù)Android的軟件框圖,其軟件層次結(jié)構(gòu)自下而上分為以下幾個(gè)層次:
- 操作系統(tǒng)層(OS)
- 各種庫(Libraries)和Android 運(yùn)行環(huán)境(RunTime)
- 應(yīng)用程序框架(ApplicationFramework)
- 應(yīng)用程序(Application)
以下分別介紹Android各個(gè)層次的軟件的重點(diǎn)及其相關(guān)技術(shù):
(1)操作系統(tǒng)層(OS)
Android使用Linux 2.6作為操作系統(tǒng),Linux 2.6是一種標(biāo)準(zhǔn)的技術(shù),Linux也是一個(gè)開放的操作系統(tǒng)。Android對(duì)操作系統(tǒng)的使用包括核心和驅(qū)動(dòng)程序兩部分,Android的Linux核心為標(biāo)準(zhǔn)的Linux 2.6內(nèi)核,Android更多的是需要一些與移動(dòng)設(shè)備相關(guān)的驅(qū)動(dòng)程序。主要的驅(qū)動(dòng)如下所示:
- 顯示驅(qū)動(dòng)(DisplayDriver):常用基于Linux的幀緩沖(Frame Buffer)驅(qū)動(dòng)
- Flash內(nèi)存驅(qū)動(dòng)(FlashMemory Driver)
- 照相機(jī)驅(qū)動(dòng)(CameraDriver):常用基于Linux的v4l(Video for)驅(qū)動(dòng)。
- 音頻驅(qū)動(dòng)(AudioDriver):常用基于ALSA(Advanced Linux Sound Architecture,高級(jí)Linux聲音體系)驅(qū)動(dòng)
- WiFi驅(qū)動(dòng)(CameraDriver):基于IEEE 802.11標(biāo)準(zhǔn)的驅(qū)動(dòng)程序
- 鍵盤驅(qū)動(dòng)(KeyBoardDriver)
- 藍(lán)牙驅(qū)動(dòng)(BluetoothDriver)
- BinderIPC驅(qū)動(dòng):Andoid一個(gè)特殊的驅(qū)動(dòng)程序,具有單獨(dú)的設(shè)備節(jié)點(diǎn),提供進(jìn)程間通訊的功能。
- PowerManagement(能源管理)
( 2)各種庫(Libraries)和Android 運(yùn)行環(huán)境(RunTime)
本層次對(duì)應(yīng)一般嵌入式系統(tǒng),相當(dāng)于中間件層次。Android的本層次分成兩個(gè)部分一個(gè)是各種庫,另一個(gè)是Android 運(yùn)行環(huán)境。本層的內(nèi)容大多是使用C++實(shí)現(xiàn)的。 在其中,各種庫包括:
- C庫:C語言的標(biāo)準(zhǔn)庫,這也是系統(tǒng)中一個(gè)最為底層的庫,C庫是通過Linux的系統(tǒng)調(diào)用來實(shí)現(xiàn)。
- 多媒體框架(MediaFrameword):這部分內(nèi)容是Android多媒體的核心部分,基于PacketVideo(即PV)的OpenCORE,從功能上本庫一共分為兩大部分,一個(gè)部分是音頻、視頻的回放(PlayBack),另一部分是則是音視頻的紀(jì)錄(Recorder)。
- SGL:2D圖像引擎。
- SSL:即SecureSocket Layer位于TCP/IP協(xié)議與各種應(yīng)用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。
- OpenGL ES 1.0 :本部分提供了對(duì)3D的支持。
- 界面管理工具(Surface Management):本部分提供了對(duì)管理顯示子系統(tǒng)等功能。
- SQLite:一個(gè)通用的嵌入式數(shù)據(jù)庫
- WebKit:網(wǎng)絡(luò)瀏覽器的核心
- FreeType:位圖和矢量字體的功能。
Android 的各種庫一般是以系統(tǒng)中間件的形式提供的,它們均有的一個(gè)顯著特點(diǎn)就是與移動(dòng)設(shè)備的平臺(tái)的應(yīng)用密切相關(guān)。 Android 運(yùn)行環(huán)境主要指的虛擬機(jī)技術(shù)——Dalvik。Dalvik虛擬機(jī)和一般Java虛擬機(jī)(Java VM)不同,它執(zhí)行的不是Java標(biāo)準(zhǔn)的字節(jié)碼(bytecode )而是Dalvik可執(zhí)行格式(.dex)中執(zhí)行文件。在執(zhí)行的過程中,每一個(gè)應(yīng)用程序即一個(gè)進(jìn)程(Linux的一個(gè)Process)。 二者最大的區(qū)別在于Java VM是以基于棧的虛擬機(jī)(Stack-based),而Dalvik是基于寄存器的虛擬機(jī)(Register-based)。顯然,后者最大的好處在于可以根據(jù)硬件實(shí)現(xiàn)更大的優(yōu)化,這更適合移動(dòng)設(shè)備的特點(diǎn)。
(3)應(yīng)用程序框架(ApplicationFramework)
Android的應(yīng)用程序框架為應(yīng)用程序?qū)拥拈_發(fā)者提供APIs,它實(shí)際上是一個(gè)應(yīng)用程序的框架。由于上層的應(yīng)用程序是以JAVA構(gòu)建的,因此本層次提供的首先包含了UI程序中所需要的各種控件:例如: Views (視圖組件)包括 lists(列表), grids(柵格), textboxes(文本框), buttons(按鈕)等,甚至一個(gè)嵌入式的Web瀏覽器。一個(gè)Android的應(yīng)用程序可以利用應(yīng)用程序框架中的以下幾個(gè)部分: Activity(活動(dòng))、Broadcast IntentReceiver (廣播意圖接收者)、Service (服務(wù))、Content Provider (內(nèi)容提供者)。
(4)應(yīng)用程序(Application)
Android的應(yīng)用程序主要是用戶界面(UserInterface),通常以JAVA程序編寫,其中還可以包含各種資源文件(放置在res目錄中)。JAVA程序及相關(guān)資源經(jīng)過編譯后,將生成一個(gè)APK包。Android本身提供了主屏幕(Home),聯(lián)系人(Contact),電話(Phone),瀏覽器(Browsers)等眾多的核心應(yīng)用。同時(shí)應(yīng)用程序的開發(fā)者還可以使用應(yīng)用程序框架層的API實(shí)現(xiàn)自己的程序。
圖1 Android分層安全架構(gòu)圖
Android的組件模型(ComponentModel)
Android系統(tǒng)中包括如下4種組件:
(1)Activity
Activity就是一個(gè)界面,這個(gè)界面里面可以放置各種控件。例如:TaskManager的界面、Root Explorer的界面等;Activity是為用戶操作而展示的可視化用戶界面。例如說,一個(gè)activity可以展示一個(gè)菜單項(xiàng)列表供用戶選擇,或者顯示一些包含說明的照片。一個(gè)短消息應(yīng)用程序可以包括一個(gè)用于顯示做為發(fā)送對(duì)象的聯(lián)系人的列表的activity,一個(gè)給選定的聯(lián)系人寫短信的activity以及翻閱以前的短信和改變?cè)O(shè)置的activity。盡管它們一起組成了一個(gè)內(nèi)聚的用戶界面,但其中每個(gè)activity都與其它的保持獨(dú)立。每個(gè)都是以Activity類為基類的子類實(shí)現(xiàn)。
一個(gè)應(yīng)用程序可以只有一個(gè)activity,或者,如剛才提到的短信應(yīng)用程序那樣,包含很多個(gè)。而每個(gè)activity的作用以及其數(shù)目,自然取決于應(yīng)用程序及其設(shè)計(jì)。一般情況下,總有一個(gè)應(yīng)用程序被標(biāo)記為用戶在應(yīng)用程序啟動(dòng)的時(shí)候第一個(gè)看到的。從一個(gè)activity轉(zhuǎn)向另一個(gè)的方式是靠當(dāng)前的activity啟動(dòng)下一個(gè)。
每個(gè)activity都被給予一個(gè)默認(rèn)的窗口以進(jìn)行繪制。一般情況下,這個(gè)窗口是滿屏的,但它也可以是一個(gè)小的位于其它窗口之上的浮動(dòng)窗口。一個(gè)activity也可以使用超過一個(gè)的窗口。例如,在activity運(yùn)行過程中彈出的一個(gè)供用戶反應(yīng)的小對(duì)話框,或是當(dāng)用戶選擇了屏幕上特定項(xiàng)目后顯示的必要信息。
窗口顯示的可視內(nèi)容是由一系列視圖構(gòu)成的,這些視圖均繼承自View 基類。每個(gè)視圖均控制著窗口中一塊特定的矩形空間。父級(jí)視圖包含并組織它子視圖的布局。葉節(jié)點(diǎn)視圖(位于視圖層次最底端)在它們控制的矩形中進(jìn)行繪制,并對(duì)用戶對(duì)其直接操作做出響應(yīng)。所以,視圖是activity與用戶進(jìn)行交互的界面。例如說,視圖可以顯示一個(gè)小圖片,并在用戶指點(diǎn)它的時(shí)候產(chǎn)生動(dòng)作。Android有很多既定的視圖供用戶直接使用,包括按鈕、文本域、卷軸、菜單項(xiàng)、復(fù)選框等等。
(2)Service
服務(wù)是運(yùn)行在后臺(tái)的功能模塊。如文件下載、音樂播放程序等;服務(wù)沒有可視化的用戶界面,而是在一段時(shí)間內(nèi)在后臺(tái)運(yùn)行。例如說,一個(gè)服務(wù)可以在用戶做其它事情的時(shí)候在后臺(tái)播放背景音樂、從網(wǎng)絡(luò)上獲取一些數(shù)據(jù)或者計(jì)算一些東西并提供給需要這個(gè)運(yùn)算結(jié)果的activity使用。每個(gè)服務(wù)都繼承自Service基類。
一個(gè)媒體播放器播放播放列表中的曲目是一個(gè)不錯(cuò)的例子。播放器應(yīng)用程序可能有一個(gè)或多個(gè)activity來給用戶選擇歌曲并進(jìn)行播放。然而,音樂播放這個(gè)任務(wù)本身不應(yīng)該為任何activity所處理,因?yàn)橛脩羝谕谒麄冸x開播放器應(yīng)用程序而開始做別的事情時(shí),音樂仍在繼續(xù)播放。為達(dá)到這個(gè)目的,媒體播放器activity應(yīng)該啟用一個(gè)運(yùn)行于后臺(tái)的服務(wù)。而系統(tǒng)將在這個(gè)activity不再顯示于屏幕之后,仍維持音樂播放服務(wù)的運(yùn)行。
可以連接至(綁定)一個(gè)正在運(yùn)行的服務(wù)(如果服務(wù)沒有運(yùn)行,則啟動(dòng)之)。連接之后,可以通過那個(gè)服務(wù)暴露出來的接口與服務(wù)進(jìn)行通訊。對(duì)于音樂服務(wù)來說,這個(gè)接口可以允許用戶暫停、回退、停止以及重新開始播放。
(3)ContentProvider
它是Android平臺(tái)應(yīng)用程序間數(shù)據(jù)共享的一種標(biāo)準(zhǔn)接口,它以類似于URI(UniversalResources Identification)的方式來表示數(shù)據(jù),如:content://contacts/people/1101;內(nèi)容提供者將一些特定的應(yīng)用程序數(shù)據(jù)供給其它應(yīng)用程序使用。數(shù)據(jù)可以存儲(chǔ)于文件系統(tǒng)、SQLite數(shù)據(jù)庫或其它方式。內(nèi)容提供者繼承于ContentProvider 基類,為其它應(yīng)用程序取用和存儲(chǔ)它管理的數(shù)據(jù)實(shí)現(xiàn)了一套標(biāo)準(zhǔn)方法。然而,應(yīng)用程序并不直接調(diào)用這些方法,而是使用一個(gè)ContentResolver 對(duì)象,調(diào)用它的方法作為替代。ContentResolver可以與任意內(nèi)容提供者進(jìn)行會(huì)話,與其合作來對(duì)所有相關(guān)交互通訊進(jìn)行管理。
(4)BroadcastReceiver
Broadcast Receiver是一個(gè)專注于接收廣播通知信息,并做出對(duì)應(yīng)處理的組件。很多廣播是源自于系統(tǒng)代碼的。例如,通知時(shí)區(qū)改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項(xiàng)。應(yīng)用程序也可以進(jìn)行廣播,例如通知其它應(yīng)用程序一些數(shù)據(jù)下載完成并處于可用狀態(tài)。
應(yīng)用程序可以擁有任意數(shù)量的Broadcast Receiver以對(duì)所有它感興趣的通知信息予以響應(yīng)。所有的接收器均繼承自BroadcastReceiver基類。Broadcast Receiver沒有用戶界面。然而,它們可以啟動(dòng)一個(gè)activity來響應(yīng)它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動(dòng)背燈、震動(dòng)、播放聲音等等。一般來說是在狀態(tài)欄上放一個(gè)持久的圖標(biāo),用戶可以打開它并獲取消息。
與此組件相關(guān)的概念是Intent,Intent是一個(gè)對(duì)動(dòng)作和行為的抽象描述,負(fù)責(zé)組件之間程序之間進(jìn)行消息傳遞。而BroadcastReceiver組件則提供了一種把Intent作為一個(gè)消息廣播出去,由所有對(duì)其感興趣的程序?qū)ζ渥鞒龇磻?yīng)的機(jī)制。舉個(gè)簡(jiǎn)單的例子,為了實(shí)現(xiàn)一個(gè)系統(tǒng)啟動(dòng)后播放音樂的功能,則可以定義Intent為android.intent.action.BOOT_COMPLETED,由BroadcastReceiver組件將其進(jìn)行廣播,而系統(tǒng)中的Media Player接收到該信息后則進(jìn)行播放。
如上所述,4個(gè)組件之間的關(guān)系如下圖:
圖2 Android各組件關(guān)系圖