Android 的 Linux kernel控制包括安全(Security),存儲器管理(Memory Management),程序管理(Process Management),網(wǎng)絡(luò)堆棧(Network Stack),驅(qū)動程序模型(Driver Model)等。下載Android源碼之前,先要安裝其構(gòu)建工具 Repo來初始化源碼。Repo 是 Android 用來輔助Git工作的一個工具。
后綴簡介
APK是安卓應(yīng)用的后綴,是AndroidPackage的縮寫,即Android安裝包(apk)。APK是類似Symbian Sis或Sisx的文件格式。通過將APK文件直接傳到Android模擬器或Android手機(jī)中執(zhí)行即可安裝。apk文件和sis一樣,把a(bǔ)ndroid sdk編譯的工程打包成一個安裝程序文件,格式為apk。 APK文件其實是zip格式,但后綴名被修改為apk,通過UnZip解壓后,可以看到Dex文件,Dex是Dalvik VM executes的全稱,即Android Dalvik執(zhí)行程序,并非Java ME的字節(jié)碼而是Dalvik字節(jié)碼。
APK文件結(jié)構(gòu)
一個APK文件結(jié)構(gòu)為:
1. META-INF\ (注:Jar文件中??梢钥吹剑?;
2. res\ (注:存放資源文件的目錄) ;
3. AndroidManifest.xml (注:程序全局配置文件) ;
4. classes.dex (注:Dalvik字節(jié)碼);
5. resources.arsc (注:編譯后的二進(jìn)制資源文件)。
總結(jié)下我們發(fā)現(xiàn)Android在運(yùn)行一個程序時首先需要UnZip,然后類似Symbian那樣直接執(zhí)行安裝,和Windows Mobile中的PE文件有區(qū)別,這樣做對于程序的保密性和可靠性不是很高,通過dexdump命令可以反編譯,但這樣做符合發(fā)展規(guī)律,微軟的 Windows Gadgets或者說WPF也采用了這種構(gòu)架方式。
在Android平臺中dalvik vm的執(zhí)行文件被打包為apk格式,最終運(yùn)行時加載器會解壓然后獲取編譯后androidmanifest.xml文件中的permission分支相關(guān)的安全訪問,但仍然存在很多安全限制,如果你將apk文件傳到/system/app文件夾下會發(fā)現(xiàn)執(zhí)行是不受限制的。
最終我們平時安裝的文件可能不是這個文件夾,而在android rom中系統(tǒng)的apk文件默認(rèn)會放入這個文件夾,它們擁有著root權(quán)限。
硬件抽像層
Android 的HAL(硬件抽像層)是能以封閉源碼形式提供硬件驅(qū)動模塊。HAL 的目的是為了把 Android framework 與 Linux kernel 隔開,讓 Android 不至過度依賴 Linux kernel,以達(dá)成 Kernel independent 的概念,也讓 Android framework 的開發(fā)能在不考量驅(qū)動程序?qū)崿F(xiàn)的前提下進(jìn)行發(fā)展。
HAL stub 是一種代理人(Proxy)的概念,Stub 是以 *.so 檔的形式存在。Stub 向 HAL“提供”操作函數(shù)(Operations),并由 Android runtime 向 HAL 取得 Stub 的Operations,再 Callback 這些操作函數(shù)。HAL 里包含了許多的 Stub(代理人)。Runtime 只要說明“類型”,即 Module ID,就可以取得操作函數(shù)。
中介軟件
操作系統(tǒng)與應(yīng)用程序的溝通橋梁,應(yīng)用分為兩層:函數(shù)層(Library)和虛擬機(jī)(Virtual Machine)。 Bionic是 Android 改良libc的版本。Android 同時包含了Webkit,所謂的Webkit 就是Apple Safari 瀏覽器背后的引擎。Surface flinger 是就2D或3D的內(nèi)容顯示到屏幕上。Android使用工具鏈(Toolchain)為Google自制的Bionic Libc。
Android采用OpenCORE作為基礎(chǔ)多媒體框架。Open CORE可分7大塊:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。
Android 使用skia 為核心圖形引擎,搭配OpenGL/ES。skia與Linux Cairo功能相當(dāng),但相較于Linux Cairo, skia 功能還只是雛形的。2005年Skia公司被Google收購,2007年初,Skia GL源碼被公開,Skia 也是Google Chrome 的圖形引擎。
Android的多媒體數(shù)據(jù)庫采用SQLite數(shù)據(jù)庫系統(tǒng)。數(shù)據(jù)庫又分為共用數(shù)據(jù)庫及私用數(shù)據(jù)庫。用戶可通過ContentResolver類(Column)取得共用數(shù)據(jù)庫。
Android的中間層多以Java 實現(xiàn),并且采用特殊的Dalvik 虛擬機(jī)(Dalvik Virtual Machine)。Dalvik虛擬機(jī)是一種“暫存器型態(tài)”(Register Based)的Java虛擬機(jī),變量皆存放于暫存器中,虛擬機(jī)的指令相對減少。
Dalvik虛擬機(jī)可以有多個實例(Instance), 每個Android應(yīng)用程序都用一個自屬的Dalvik虛擬機(jī)來運(yùn)行,讓系統(tǒng)在運(yùn)行程序時可達(dá)到優(yōu)化。Dalvik 虛擬機(jī)并非運(yùn)行Java字節(jié)碼(Bytecode),而是運(yùn)行一種稱為.dex格式的文件。
安全權(quán)限機(jī)制
Android本身是一個權(quán)限分立的操作系統(tǒng)。在這類操作系統(tǒng)中,每個應(yīng)用都以唯一的一個系統(tǒng)識別身份運(yùn)行(Linux用戶ID與群組ID)。系統(tǒng)的各部分也分別使用各自獨(dú)立的識別方式。Linux就是這樣將應(yīng)用與應(yīng)用,應(yīng)用與系統(tǒng)隔離開。
系統(tǒng)更多的安全功能通過權(quán)限機(jī)制提供。權(quán)限可以限制某個特定進(jìn)程的特定操作,也可以限制每個URI權(quán)限對特定數(shù)據(jù)段的訪問。
Android安全架構(gòu)的核心設(shè)計思想是,在默認(rèn)設(shè)置下,所有應(yīng)用都沒有權(quán)限對其他應(yīng)用、系統(tǒng)或用戶進(jìn)行較大影響的操作。這其中包括讀寫用戶隱私數(shù)據(jù)(聯(lián)系人或電子郵件),讀寫其他應(yīng)用文件,訪問網(wǎng)絡(luò)或阻止設(shè)備待機(jī)等。
安裝應(yīng)用時,在檢查程序簽名提及的權(quán)限,且經(jīng)過用戶確認(rèn)后,軟件包安裝器會給予應(yīng)用權(quán)限。從用戶角度看,一款A(yù)ndroid應(yīng)用通常會要求如下的權(quán)限:
撥打電話、發(fā)送短信或彩信、修改/刪除SD卡上的內(nèi)容、讀取聯(lián)系人的信息、讀取日程信的息,寫入日程數(shù)據(jù)、讀取電話狀態(tài)或識別碼、精確的(基于GPS)地理位置、模糊的(基于網(wǎng)絡(luò)獲?。┑乩砦恢?、創(chuàng)建藍(lán)牙連接、對互聯(lián)網(wǎng)的完全訪問、查看網(wǎng)絡(luò)狀態(tài),查看WiFi狀態(tài)、避免手機(jī)待機(jī)、修改系統(tǒng)全局設(shè)置、讀取同步設(shè)定、開機(jī)自啟動、重啟其他應(yīng)用、終止運(yùn)行中的應(yīng)用、設(shè)定偏好應(yīng)用、震動控制、拍攝圖片等。
一款應(yīng)用應(yīng)該根據(jù)自身提供的功能,要求合理的權(quán)限。用戶也可以分析一款應(yīng)用所需權(quán)限,從而簡單判定這款應(yīng)用是否安全。如一款應(yīng)用是不帶廣告的單機(jī)版,也沒有任何附加的內(nèi)容需要下載,那么它要求訪問網(wǎng)絡(luò)的權(quán)限就比較可疑。