
關(guān)于Android系統(tǒng)
Android,本義指“機(jī)器人”,是Google于2007年11月5日宣布的基于Linux平臺(tái)的操作系統(tǒng)。
Android系統(tǒng)優(yōu)缺點(diǎn)
開(kāi)放性
在優(yōu)勢(shì)方面,Android平臺(tái)首先就是其開(kāi)發(fā)性,開(kāi)發(fā)的平臺(tái)允許任何移動(dòng)終端廠商加入到Android聯(lián)盟中來(lái)。顯著的開(kāi)放性可以使其擁有更多的開(kāi)發(fā)者,隨著用戶和應(yīng)用的日益豐富,一個(gè)嶄新的平臺(tái)也將很快走向成熟。
開(kāi)發(fā)性對(duì)于Android的發(fā)展而言,有利于積累人氣,這里的人氣包括消費(fèi)者和廠商,而對(duì)于消費(fèi)者來(lái)講,最大的受益正是豐富的軟件資源。開(kāi)放的平臺(tái)也會(huì)帶來(lái)更大競(jìng)爭(zhēng),如此一來(lái),消費(fèi)者將可以用更低的價(jià)位購(gòu)得心儀的手機(jī)。
豐富的硬件
這一點(diǎn)還是與Android平臺(tái)的開(kāi)放性相關(guān),由于Android的開(kāi)放性,眾多的廠商會(huì)推出千奇百怪,功能特色各具的多種產(chǎn)品。功能上的差異和特色,卻不會(huì)影響到數(shù)據(jù)同步、甚至軟件的兼容,如同從諾基亞Symbian風(fēng)格手機(jī)一下改用蘋果iPhone,同時(shí)還可將Symbian中優(yōu)秀的軟件帶iPhone上使用、聯(lián)系人等資料更是可以方便地轉(zhuǎn)移。
跨平臺(tái)
由于使用Java進(jìn)行開(kāi)發(fā),Android繼承了Java跨平臺(tái)的優(yōu)點(diǎn)。任何Android應(yīng)用幾乎無(wú)需任何修改就能運(yùn)行于所有的Android設(shè)備。包括但不限于手機(jī),平板,手環(huán),車載系統(tǒng),智能家居。
方便開(kāi)發(fā)
Android平臺(tái)提供給第三方開(kāi)發(fā)商一個(gè)十分寬泛、自由的環(huán)境,不會(huì)受到各種條條框框的阻擾,可想而知,會(huì)有多少新穎別致的軟件會(huì)誕生。但也有其兩面性,血腥、暴力、情色方面的程序和游戲如何控制正是留給Android難題之一。
Google應(yīng)用
在互聯(lián)網(wǎng)的Google已經(jīng)走過(guò)10年度歷史,從搜索巨人到全面的互聯(lián)網(wǎng)滲透,Google服務(wù)如地圖、郵件、搜索等已經(jīng)成為連接用戶和互聯(lián)網(wǎng)的重要紐帶,而Android平臺(tái)手機(jī)將無(wú)縫結(jié)合這些優(yōu)秀的Google服務(wù)。
太碎片化
紛繁復(fù)雜的屏幕尺寸,分辨率,不同版本且訂制開(kāi)發(fā)的Android系統(tǒng),各個(gè)廠家硬件,虛擬菜單等,給開(kāi)發(fā)者帶來(lái)一定的復(fù)雜性。
截至目前發(fā)行歷史版本:
每個(gè)版本都是按照英文字母順序取的字母,然把它作為單詞第一個(gè)字母,去拼一個(gè)甜點(diǎn)的單詞,可是到了M,N,O,P,到了Q的時(shí)候就變了,改為就叫Android 10了。
- 1.5 Cupcake(紙杯蛋糕)
- 1.6 Donut(甜甜圈)
- 2.2 Froyo(凍酸奶)
- 2.3 Gingerbread(姜餅)
- 3.x Honeycomb(蜂巢)
- 4.0 Ice Cream Sandwich(冰激凌三明治)
- 4.1 Jelly Bean(果凍豆)
- 4.4 KitKat(奇巧巧克力)
- 5.0 Lollipop(棒棒糖)
- 6.0 Marshmallow(棉花糖)
- 7.0 Nougat(牛軋?zhí)牵?/li>
- 8.0 Oreo(奧利奧)
- 9.0 Pie (派)
- 10.0 Android 10
系統(tǒng)架構(gòu)圖:

基于Android 8.0的系統(tǒng)根目錄結(jié)構(gòu)圖:

Android從下往上層主要分為4層,如同網(wǎng)絡(luò)的七層協(xié)議,這樣做的好處是屏蔽本層與下層的差異。
- linux內(nèi)核層(Linux Kernel)
- 系統(tǒng)運(yùn)行時(shí)庫(kù)層 (Libraries and Android Runtime)
- 應(yīng)用程序框架層(Application Framework)
- 應(yīng)用程序?qū)?(Applications)
linux內(nèi)核層(Linux Kernel)
| 驅(qū)動(dòng)名稱 | 簡(jiǎn)介 |
|---|---|
| Android電源管理(Power Management) | 針對(duì)嵌入式設(shè)備的,基于標(biāo)準(zhǔn)Linux電源管理系統(tǒng)的,輕量級(jí)的電源管理驅(qū)動(dòng) |
| 低內(nèi)存管理器 (Low Memory Keller) | 選擇性殺死進(jìn)程來(lái)釋放需要的內(nèi)存 |
| 匿名共享內(nèi)存 (Ashmem) | 為進(jìn)程之間提供共享內(nèi)存資源,同時(shí)為內(nèi)核提供回收和管理內(nèi)存的機(jī)制 |
| 日志(Android Logger) | 一個(gè)輕量級(jí)的日志設(shè)備 |
| 定時(shí)器(Android Alarm) | 提供一個(gè)定時(shí)器把設(shè)備從睡眠狀態(tài)喚醒 |
| 物理內(nèi)存映射管理 (Android PMEM) | DSP及其他設(shè)備只能工作在連續(xù)的物理內(nèi)存上,PMEM用于向用戶空間提供 連續(xù)的物理內(nèi)存區(qū)域映射 |
| Android定時(shí)設(shè)備(Android Timed device) | 執(zhí)行對(duì)設(shè)備的定時(shí)控制功能 |
| Yaffs2文件系統(tǒng) | Android采用大容量的NAND閃存作為存儲(chǔ)設(shè)備,使用Yaffs2作為文件系統(tǒng)管理大容量MTD NAND Flash;Yaffs2占用內(nèi)存小,垃圾回收簡(jiǎn)潔迅速 |
硬件抽象層
在linux內(nèi)核層和系統(tǒng)運(yùn)行時(shí)庫(kù)層之間還有一層硬件抽象層(Hardware Abstract Layer,HAL),它是對(duì)硬件設(shè)備的具體實(shí)現(xiàn)加以抽象。鑒于許多硬件設(shè)備廠商不希望公開(kāi)其設(shè)備驅(qū)動(dòng)的源代碼,如果能將android的應(yīng)用框架層與linux系統(tǒng)內(nèi)核的設(shè)備驅(qū)動(dòng)隔離,使應(yīng)用程序框架的開(kāi)發(fā)盡量獨(dú)立于具體的驅(qū)動(dòng)程序,則android將減少對(duì)Linux內(nèi)核的依賴。HAL由此而生,它是對(duì)Linux內(nèi)核驅(qū)動(dòng)程序進(jìn)行的封裝,將硬件抽象化,屏蔽掉了底層的實(shí)現(xiàn)細(xì)節(jié)。
系統(tǒng)運(yùn)行庫(kù)層
由系統(tǒng)類庫(kù)和Android運(yùn)行時(shí)組成。
-
系統(tǒng)類庫(kù)(Libraries)
系統(tǒng)類庫(kù)大部分由C/C++編寫,提供的功能通過(guò)Android應(yīng)用程序框架來(lái)調(diào)用。
| 名稱 | 簡(jiǎn)介 |
|---|---|
| Surface Manager | 管理應(yīng)用顯示,另外也對(duì)2D和3D圖形提供支持 |
| Media Framework | 基于PacketVideo的OpenCORE的多媒體庫(kù),支持多種常見(jiàn)音視頻格式的錄制和播放 |
| SQLite | 本地小型關(guān)系數(shù)據(jù)庫(kù),如平時(shí)用數(shù)據(jù)庫(kù)用到 |
| OpenGL | 基于OpenGL ES 1.0API標(biāo)準(zhǔn)實(shí)現(xiàn)的3D跨平臺(tái)圖形庫(kù) |
| FreeType | 用于顯示位圖和矢量字體 |
| WebKit | Web瀏覽器的軟件引擎 |
| SGL | 基于2D圖形引擎 |
| Libc(bionic ibc) | C函數(shù)庫(kù)bionic libc,更適合基于嵌入式Linux的移動(dòng)設(shè)備 |
| SSL | 安全套接層,為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議,如https請(qǐng)求需認(rèn)證 |
幾個(gè)常用且比較重要的C/C++程序庫(kù)所在的目錄如圖:

-
Android運(yùn)行時(shí)(Android Runtime)
由核心庫(kù)和Dalvik虛擬機(jī)組成。
核心庫(kù):核心庫(kù)提供了Java5 se API的多數(shù)功能,并提供Android的核心API,如android.os,android.net,android.media等。
Dalvik虛擬機(jī):Dalvik虛擬機(jī)是基于apache的java虛擬機(jī),并被改進(jìn)以適應(yīng)低內(nèi)存,低處理器速度的移動(dòng)設(shè)備環(huán)境。Dalvik虛擬機(jī)依賴于Linux內(nèi)核,實(shí)現(xiàn)進(jìn)程隔離與線程調(diào)試管理,安全和異常管理,垃圾回收等重要功能。
Jvm、Dalvik和Art
| java虛擬機(jī) | Dalvik虛擬機(jī) |
|---|---|
| java虛擬機(jī)基于棧,基于棧的機(jī)器必須使用指令來(lái)載入和操作棧上數(shù)據(jù) | Dalvik虛擬機(jī)基于寄存器 |
| java虛擬機(jī)運(yùn)行的是java字節(jié)碼。(java類會(huì)被編譯成一個(gè)或多個(gè)字節(jié)碼.class文件,打包到.jar文件中,java虛擬機(jī)從相應(yīng)的.class文件和.jar獲取相應(yīng)的字節(jié)碼) | Dalvik運(yùn)行的是自己專屬的.dex字節(jié)碼格式。(java類被編譯成.class文件后,會(huì)通過(guò)一個(gè)dx工具將所有的.class文件轉(zhuǎn)換成一個(gè).dex文件,然后dalvik虛擬機(jī)會(huì)從其中讀取指令和數(shù)據(jù)) |
| - | 一個(gè)應(yīng)用對(duì)應(yīng)一個(gè)Diavik虛擬機(jī)實(shí)例,獨(dú)立運(yùn)行 |
Android應(yīng)用編譯及運(yùn)行流程:

aapt:
即Android Asset Packaging Tool(Android 打包工具),在SDK的build-tools目錄下,也行平時(shí)沒(méi)有用到過(guò),但是開(kāi)發(fā)工具生成Apk時(shí)會(huì)自動(dòng)使用aapt將代碼和資源文件打包在其中。
Apk打包流程:

SDK和NDK的關(guān)系:

ndk可以通過(guò)native code跨過(guò)使用dalvik runtime,直接調(diào)用到android內(nèi)核資源,而sdk則需要在dalvik runtime環(huán)境下才能調(diào)用到內(nèi)核資源。然而兩者并不是各司其職,各不相關(guān)。android提供了JNI(java native interface)使兩者可以進(jìn)行相互調(diào)用和通信。
應(yīng)用框架層(Application Framework)
應(yīng)用程序框架層提供開(kāi)發(fā)Android應(yīng)用程序所需的一系列類庫(kù),高度封裝直接調(diào)用。
應(yīng)用框架層的主要實(shí)現(xiàn)代碼在frameworks/base和frameworks/av目錄下,其中frameworks/base目錄結(jié)構(gòu)如圖:

| 類庫(kù)名稱 | 簡(jiǎn)介 |
|---|---|
| 視圖系統(tǒng)(View System) | 創(chuàng)建應(yīng)用所需的組件 |
| 活動(dòng)管理器(ActivityManager) | 管理各個(gè)應(yīng)用程序生命周期,為所有程序的窗口提供交互的接口 |
| 窗口管理器(Window Manager) | 對(duì)窗口程序進(jìn)行管理 |
| 內(nèi)容提供者(Content Provider) | 提供一個(gè)應(yīng)用程序訪問(wèn)另一個(gè)應(yīng)用程序數(shù)據(jù)的功能,實(shí)現(xiàn)應(yīng)用間共享數(shù)據(jù) |
| 通知管理器(Notification Manager) | 使應(yīng)用可以在系統(tǒng)狀態(tài)欄中顯示通知消息 |
| 包管理器(Package Manager) | 管理應(yīng)用安裝、卸載,應(yīng)用版本號(hào)、版本名,查詢相關(guān)權(quán)限等功能 |
| 資源管理器(Resource Manager) | 提供各種非代碼資源供應(yīng)用程序使用,如字符串,顏色,圖片,音頻等 |
| 位置管理器(Location Manager) | 提供位置服務(wù) |
| 電話管理器(Telephony Manager) | 提供設(shè)備電話相關(guān)功能 |
| XMPP服務(wù) | Google在線即時(shí)交流軟件中一個(gè)通用的進(jìn)程,提供后臺(tái)推送服務(wù) |
系統(tǒng)應(yīng)用
根據(jù)Google給出的官方架構(gòu)圖,Android系統(tǒng)應(yīng)用開(kāi)發(fā)處于Android架構(gòu)的System Apps層,像桌面,撥號(hào)盤,日歷,相機(jī),郵件,設(shè)置等,但這些app屬于系統(tǒng)app,系統(tǒng)app本質(zhì)上跟第三方app沒(méi)什么區(qū)別,只是最終存放在Android系統(tǒng)中的位置不同,系統(tǒng)app存放在/system/priv-app/和/system/app/中,第三方app存放在/data/app/當(dāng)中,這三個(gè)目錄的權(quán)限不一樣,按照權(quán)限大小排序分別為,/system/priv-app/ > /system/app/ > /data/app/。
應(yīng)用層(Applications)
系統(tǒng)內(nèi)置的應(yīng)用程序以及非系統(tǒng)級(jí)的應(yīng)用程序都屬于應(yīng)用層,負(fù)責(zé)與用戶進(jìn)行直接交互,通常都是用Java進(jìn)行開(kāi)發(fā)的。包括設(shè)備系統(tǒng)自帶的工具,日歷,音樂(lè),瀏覽器,圖片查看等應(yīng)用,還有開(kāi)發(fā)者開(kāi)發(fā)應(yīng)用程序。
源碼根目錄中的packages目錄對(duì)應(yīng)著系統(tǒng)應(yīng)用層,目錄結(jié)構(gòu)圖:

在線閱讀Android源碼
在Android系統(tǒng)源碼官網(wǎng),各個(gè)Android版本的源碼任君挑選。
Android在線閱讀源碼地址

雖然我們平時(shí)開(kāi)發(fā)應(yīng)用主要行走在Applications層上,但是并不限制我們往下走,雖然這條路是艱難漫長(zhǎng)的,堅(jiān)持下去總有撥云見(jiàn)霧的一天。該篇文章保持更新。