內(nèi) 容 簡 介
Android是一款服務(wù)于智能手機和平板電腦等設(shè)備的操作系統(tǒng),截止作者撰寫此書時為止,Android在智能手機操作系統(tǒng)市場中已經(jīng)占有75%的份額。為了讓廣大讀者充分了解這款神奇的操作系統(tǒng)的架構(gòu)原理,本書循序漸進(jìn)地分析了Android系統(tǒng)核心源碼的基本知識。
本書共分為15章,主要內(nèi)容包括走進(jìn)Android世界、硬件抽象層詳解、分析JNI(Java本地接口)層、Android內(nèi)存系統(tǒng)分析、Android虛擬機系統(tǒng)詳解、IPC通信機制詳解、Zygote進(jìn)程/System進(jìn)程和應(yīng)用程序進(jìn)程、分析Activity組件、Content Provider數(shù)據(jù)存儲、Broadcast(廣播)系統(tǒng)詳解、多媒體系統(tǒng)詳解、電源管理系統(tǒng)詳解、輸入系統(tǒng)驅(qū)動應(yīng)用、藍(lán)牙系統(tǒng)詳解、網(wǎng)絡(luò)系統(tǒng)詳解等。
本書幾乎涵蓋了Android源碼中的所有核心系統(tǒng)的內(nèi)容,全書內(nèi)容通俗易懂,適合Android初學(xué)者、Android愛好者、Android底層開發(fā)人員、Android應(yīng)用開發(fā)人員閱讀和學(xué)習(xí),也可以作為相關(guān)培訓(xùn)學(xué)校和大專院校相關(guān)專業(yè)的教學(xué)用書。
前 言
Android(中文譯名為安卓)是IT界巨頭Google(谷歌)公司于2007年11月5日推出的一款智能操作系統(tǒng),最初被應(yīng)用于智能手機,后來隨著版本的更新和發(fā)展,也被廣泛應(yīng)用于平板電腦、智能電視、可穿戴設(shè)備和健康設(shè)備中。Android是一款基于Linux平臺的開源操作系統(tǒng)的名稱,根據(jù)國際數(shù)據(jù)公司(IDC)公布的數(shù)據(jù),Android在智能手機操作系統(tǒng)中的市場占有率已經(jīng)達(dá)到75%。
高份額的市場占有率使得更多的開發(fā)人員把目光投入這款神奇的系統(tǒng),很多初學(xué)者也紛紛涌入Android的學(xué)習(xí)行列中,配合這些需求,Android的各種應(yīng)用類圖書不斷涌現(xiàn)并廣受歡迎。但美中不足的是,深入源碼分析的書籍屈指可數(shù)。而源碼分析正是通往Android殿堂、躋身為高手的階梯。
為了讓廣大初學(xué)者可以對Android系統(tǒng)實現(xiàn)“靈與肉”的感知,而不是停留在抽象的原理和概念上,本書對Android系統(tǒng)的源碼進(jìn)行細(xì)致的分析,這樣做的目的,是提煉出Android系統(tǒng)埋藏于深處的本質(zhì)和精華的東西,以展示這款神奇的系統(tǒng)究竟是怎樣實現(xiàn)的。
1.本書內(nèi)容
Android系統(tǒng)升級較快,有些代碼變動很大。系統(tǒng)自2007年發(fā)布第一個版本1.1以來,截至2013年7月發(fā)布版本4.3,中間一共存在十多個版本。但據(jù)官方統(tǒng)計,到2013年5月5日,占據(jù)前三位的版本分別是Android 4.2,Android 4.1和Android 4.3,其實這三個版本的區(qū)別并不是很大,只是在某領(lǐng)域的細(xì)節(jié)上進(jìn)行了更新。因此,在本書中,我們選擇本書最初寫作時的最新版本Android 4.3系統(tǒng)的實現(xiàn)。
本書共分15章,依次為走進(jìn)Android世界、硬件抽象層詳解、分析JNI(Java本地接口)層、Android內(nèi)存系統(tǒng)分析、Android虛擬機系統(tǒng)詳解、IPC通信機制詳解、Zygote進(jìn)程/System進(jìn)程和應(yīng)用程序進(jìn)程、分析Activity組件、Content Provider數(shù)據(jù)存儲、Broadcast(廣播)系統(tǒng)詳解、多媒體系統(tǒng)詳解、電源管理系統(tǒng)詳解、輸入系統(tǒng)驅(qū)動應(yīng)用、藍(lán)牙系統(tǒng)詳解、網(wǎng)絡(luò)系統(tǒng)詳解。
本書幾乎涵蓋Android源碼中的所有核心系統(tǒng)的內(nèi)容,全書通俗易懂,特別有利于初學(xué)者學(xué)習(xí)和消化。
2.本書特色
本書內(nèi)容十分豐富,分析細(xì)致、全面。我們的目標(biāo)是通過一本圖書,提供多本圖書的價值,讀者可以根據(jù)自己的需要,有選擇地閱讀。
在內(nèi)容的編寫上,本書具有以下特色。
(1) 結(jié)構(gòu)合理
從用戶的實際需要出發(fā),科學(xué)安排知識結(jié)構(gòu)。全書詳細(xì)地講解與Android應(yīng)用開發(fā)有關(guān)的源碼,內(nèi)容循序漸進(jìn),由淺入深。
(2) 易學(xué)易懂
本書條理清晰、語言簡潔,可幫助讀者快速掌握每個知識點,使讀者既可以按照本書編排的章節(jié)順序進(jìn)行學(xué)習(xí),也可以根據(jù)自己的需求,對某一章節(jié)進(jìn)行有針對性的學(xué)習(xí)。
(3) 實用性強
本書徹底摒棄枯燥的理論知識羅列,注重實用性和可操作性,通過細(xì)膩的筆法,逐步講解各個知識點的基本知識。
(4) 內(nèi)容全面
本書是如今市面上“內(nèi)容最全的Android源碼分析書”,無論是獲取源碼,還是各個常用、常見的模塊系統(tǒng),在本書中您都能找到解決問題的答案。
3.讀者對象
本書適合下列人員閱讀和學(xué)習(xí):
初學(xué)Android編程的自學(xué)者。
Android源碼分析人員。
Android底層開發(fā)人員。
Android系統(tǒng)開發(fā)人員。
相關(guān)培訓(xùn)機構(gòu)的教師和學(xué)員。
從事Android開發(fā)的程序員。
4.作者支持
在編寫此書的過程中,得到了清華大學(xué)出版社工作人員的大力支持,正是由于各位編輯的求實態(tài)度、耐心的工作和奉獻(xiàn)精神,才使得本書能夠快速出版。
另外也十分感謝我的家人在我寫作的時候給予的巨大支持。
由于作者水平有限,本書的疏漏之處在所難免,懇請讀者提出意見或建議,以便再版時修訂并使之更臻完善。我們提供了售后支持QQ(號碼為1727069718),讀者如有疑問可以通過QQ提出,將會得到滿意的答復(fù)。
編 者
目 錄
第1章 走進(jìn)Android世界 1
1.1 Android系統(tǒng)的優(yōu)勢 2
1.1.1 開源 2
1.1.2 強大的開發(fā)團(tuán)隊的支持 2
1.1.3 開發(fā)人員的支持 2
1.2 Android系統(tǒng)架構(gòu)介紹 3
1.2.1 底層操作系統(tǒng)層(Linux內(nèi)核層) 4
1.2.2 庫(Libraries)和運行環(huán)境(Runtime) 4
1.2.3 應(yīng)用程序框架(ApplicationFramework) 5
1.2.4 頂層應(yīng)用程序(Application) 5
1.3 核心組件 5
1.3.1 Activity的界面表現(xiàn) 5
1.3.2 Intent和IntentFilters界面切換 6
1.3.3 Service服務(wù) 6
1.3.4 用Broadcast IntentReceiver廣播 7
1.3.5 用Content Provider存儲 7
1.4 進(jìn)程和線程 7
1.4.1 什么是進(jìn)程 7
1.4.2 什么是線程 8
1.5 獲取Android 4.3源碼 8
1.5.1 在Linux系統(tǒng)中獲取Android源碼 8
1.5.2 在Windows平臺上獲取Android源碼 9
1.6 Android源碼結(jié)構(gòu)分析 14
1.6.1 Android源碼的目錄結(jié)構(gòu) 15
1.6.2 應(yīng)用程序 16
1.6.3 應(yīng)用程序框架 18
1.6.4 系統(tǒng)服務(wù) 19
1.6.5 系統(tǒng)程序庫 21
1.6.6 系統(tǒng)運行庫 24
1.6.7 硬件抽象層 25
1.7 編譯Android源碼 26
1.7.1 搭建編譯環(huán)境 27
1.7.2 開始編譯 27
1.7.3 在模擬器中運行 29
1.7.4 編譯源碼生成SDK 30
第2章 硬件抽象層詳解 35
2.1 什么是HAL層 36
2.1.1 為什么把對硬件的支持劃分為兩層來實現(xiàn) 36
2.1.2 HAL層的位置結(jié)構(gòu) 36
2.2 分析HAL Module架構(gòu) 38
2.2.1 hw_module_t 39
2.2.2 hw_module_methods_t 40
2.2.3 hw_device_t 40
2.3 分析文件hardware.c 41
2.3.1 函數(shù)hw_get_module 41
2.3.2 數(shù)組variant_keys 41
2.3.3 載入相應(yīng)的庫 42
2.3.4 打開相應(yīng)庫并獲得hw_module_t結(jié)構(gòu)體 43
2.4 分析硬件抽象層的加載過程 44
2.5 分析硬件訪問服務(wù) 48
2.5.1 定義硬件訪問服務(wù)接口 48
2.5.2 實現(xiàn)硬件訪問服務(wù) 49
2.6 分析mokoid工程 50
2.6.1 直接調(diào)用Service方法實現(xiàn) 51
2.6.2 通過Manager調(diào)用Service實現(xiàn) 56
2.7 分析HAL層的具體實現(xiàn)(以Sensor系統(tǒng)為例) 59
2.7.1 傳感器系統(tǒng)的基礎(chǔ)知識 59
2.7.2 HAL層的Sensor代碼 60
2.7.3 Sensor編程的流程 61
第3章 分析JNI(Java本地接口)層 63
3.1 JNI基礎(chǔ) 64
3.1.1 JNI的層次結(jié)構(gòu) 64
3.1.2 JNI的本質(zhì) 64
3.1.3 與JNI相關(guān)的文件 65
3.2 分析Java層 66
3.2.1 加載JNI庫 66
3.2.2 實現(xiàn)掃描工作 68
3.2.3 讀取并保存信息 69
3.2.4 刪除不是SD卡中的文件信息 72
3.2.5 直接轉(zhuǎn)向JNI 72
3.2.6 掃描函數(shù)scanFile 73
3.2.7 異常處理 73
3.3 分析MediaScanner的JNI層 74
3.3.1 將Native對象的指針保存到Java對象 75
3.3.2 創(chuàng)建Native層的MediaScanner對象 75
3.4 分析MediaScanner的Native層 76
3.4.1 注冊JNI函數(shù) 76
3.4.2 完成注冊工作 78
3.4.3 動態(tài)注冊 80
3.4.4 處理路徑參數(shù) 82
3.4.5 掃描文件 83
3.4.6 添加TAG信息 83
3.4.7 JNIEnv接口 85
3.4.8 JNI中的環(huán)境變量 86
3.5 JNI實例分析(基于Camera系統(tǒng)) 87
3.5.1 Java層預(yù)覽接口 87
3.5.2 注冊預(yù)覽的JNI函數(shù) 89
3.5.3 C/C++層的預(yù)覽函數(shù) 92
第4章 Android內(nèi)存系統(tǒng)分析 95
4.1 Android的進(jìn)程通信機制 96
4.1.1 Android的進(jìn)程間通信(IPC)機制Binder 96
4.1.2 Service Manager是Binder機制的上下文管理者 97
4.2 分析Ashmem驅(qū)動程序 98
4.2.1 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu) 98
4.2.2 初始化處理 99
4.2.3 打開匿名共享內(nèi)存設(shè)備文件 101
4.2.4 內(nèi)存映射 104
4.2.5 讀寫操作 105
4.2.6 鎖定和解鎖 107
4.2.7 回收內(nèi)存塊 113
4.3 分析C++訪問接口層 115
4.3.1 接口MemoryHeapBase 115
4.3.2 接口MemoryBase 125
4.4 分析Java訪問接口層 128
4.5 內(nèi)存優(yōu)化機制 132
4.5.1 sp和wp簡析 132
4.5.2 詳解智能指針 134
4.5.3 輕量級指針 136
4.5.4 強指針 139
4.5.5 弱指針 153
第5章 Android虛擬機系統(tǒng)詳解 159
5.1 Android虛擬機基礎(chǔ) 160
5.1.1 Android虛擬機源碼目錄 160
5.1.2 Dalvik的架構(gòu) 161
5.1.3 Dalvik虛擬機的主要特征 163
5.1.4 Dalvik的進(jìn)程管理 163
5.1.5 Android的初始化流程 163
5.2 分析Dalvik的運作流程 164
5.2.1 Dalvik虛擬機相關(guān)的可執(zhí)行程序 164
5.2.2 初始化Dalvik虛擬機 167
5.2.3 啟動Zygote 186
5.2.4 啟動SystemServer進(jìn)程 190
5.2.5 加載class類文件 193
5.3 Dalvik VM的內(nèi)存系統(tǒng) 197
5.3.1 如何分配內(nèi)存 197
5.3.2 分析內(nèi)存管理機制的源碼 199
5.4 分析Dalvik VM的啟動過程 211
5.4.1 創(chuàng)建一個Dalvik VM實例 211
5.4.2 指定控制選項 212
5.4.3 創(chuàng)建并初始化Dalvik VM實例 220
5.4.4 創(chuàng)建JNIEnvExt對象 223
5.4.5 設(shè)置當(dāng)前進(jìn)程 229
5.4.6 注冊Android核心類的JNI方法 229
5.4.7 使用線程創(chuàng)建javaCreateThreadEtc鉤子 233
5.5 創(chuàng)建Dalvik VM進(jìn)程 233
5.5.1 分析底層啟動過程 234
5.5.2 創(chuàng)建Dalvik VM進(jìn)程 234
5.5.3 初始化運行的Dalvik VM 238
第6章 IPC通信機制詳解 241
6.1 Binder機制概述 242
6.2 分析Binder驅(qū)動程序 243
6.2.1 分析數(shù)據(jù)結(jié)構(gòu) 243
6.2.2 分析設(shè)備初始化 255
6.2.3 打開Binder設(shè)備文件 257
6.2.4 內(nèi)存映射 258
6.2.5 釋放物理頁面 264
6.2.6 分配內(nèi)核緩沖區(qū) 264
6.2.7 釋放內(nèi)核緩沖區(qū) 267
6.2.8 查詢內(nèi)核緩沖區(qū) 269
6.3 Binder封裝庫 270
6.3.1 Binder庫的實現(xiàn)層次 270
6.3.2 類BBinder 271
6.3.3 類BpRefBase 274
6.3.4 類IPCThreadState 275
6.4 初始化Java層Binder框架 279
第7章 Zygote進(jìn)程、System進(jìn)程和應(yīng)用程序進(jìn)程 283
7.1 Zygote(孕育)進(jìn)程詳解 284
7.1.1 Zygote基礎(chǔ) 284
7.1.2 分析Zygote的啟動過程 285
7.2 System進(jìn)程詳解 303
7.2.1 啟動System進(jìn)程前的準(zhǔn)備工作 303
7.2.2 分析SystemServer 304
7.2.3 分析EntropyService 308
7.2.4 分析DropBoxManagerService 310
7.2.5 分析DiskStatsService 318
7.2.6 分析DeviceStorageManagerService 323
7.2.7 分析SamplingProfilerService 326
7.3 應(yīng)用程序進(jìn)程詳解 336
7.3.1 創(chuàng)建應(yīng)用程序 336
7.3.2 啟動線程池 347
7.3.3 創(chuàng)建信息循環(huán) 348
第8章 分析Activity組件 351
8.1 Activity基礎(chǔ) 352
8.1.1 Activity的狀態(tài) 352
8.1.2 Activity的主要函數(shù) 353
8.2 啟動Activity 355
8.2.1 Launcher啟動應(yīng)用程序 356
8.2.2 返回ActivityManagerService的遠(yuǎn)程接口 358
8.2.3 解析intent的內(nèi)容 359
8.2.4 分析檢查機制 363
8.2.5 執(zhí)行Activity組件的操作 378
8.2.6 將Launcher推入Paused狀態(tài) 386
8.2.7 處理消息 388
8.2.8 報告暫停 389
8.2.9 建立雙向連接 394
8.2.10 啟動新的Activity 400
8.2.11 發(fā)送通知信息 403
第9章 Content Provider數(shù)據(jù)存儲 405
9.1 Content Provider基礎(chǔ) 406
9.1.1 Content Provider在應(yīng)用程序中的架構(gòu) 406
9.1.2 Content Provider的常用接口 407
9.2 啟動Content Provider 408
9.2.1 獲得對象接口 408
9.2.2 存在校驗 410
9.2.3 啟動Android應(yīng)用程序 416
9.2.4 根據(jù)進(jìn)程啟動Content Provider 416
9.2.5 處理消息 422
9.2.6 具體啟動 423
9.3 Content Provider數(shù)據(jù)共享 427
9.3.1 獲取接口 427
9.3.2 創(chuàng)建CursorWindow對象 430
9.3.3 數(shù)據(jù)傳遞 433
9.3.4 處理進(jìn)程通信的請求 436
9.3.5 數(shù)據(jù)操作 442
第10章 Broadcast(廣播)系統(tǒng)詳解 447
10.1 Broadcast基礎(chǔ) 448
10.2 發(fā)送廣播信息 448
10.2.1 intent描述指示 449
10.2.2 傳遞廣播信息 449
10.2.3 封裝傳遞 450
10.2.4 處理發(fā)送請求 451
10.2.5 查找廣播接收者 451
10.2.6 處理廣播信息 455
10.2.7 檢查權(quán)限 464
10.2.8 處理的進(jìn)程通信請求 466
10.3 分析BroadcastReceiver 469
10.3.1 MainActivity的調(diào)用 470
10.3.2 注冊廣播接收者 470
10.3.3 獲取接口對象 471
10.3.4 處理進(jìn)程間的通信請求 474
第11章 多媒體系統(tǒng)詳解 479
11.1 Android多媒體系統(tǒng)介紹 480
11.2 OpenMAX框架詳解 481
11.2.1 分析OpenMAX框架構(gòu)成 482
11.2.2 實現(xiàn)OpenMAX IL層接口 486
11.3 分析OpenCore框架 495
11.3.1 OpenCore的層次結(jié)構(gòu) 495
11.3.2 OpenCore的代碼結(jié)構(gòu) 496
11.3.3 OpenCore的編譯結(jié)構(gòu) 497
11.3.4 操作系統(tǒng)兼容庫 501
11.3.5 實現(xiàn)OpenCore中的OpenMAX部分 503
11.3.6 OpenCore擴(kuò)展詳解 517
11.4 Stagefright框架詳解 523
11.4.1 Stagefright代碼結(jié)構(gòu) 523
11.4.2 Stagefright實現(xiàn)OpenMAX接口 524
11.4.3 分析Video Buffer的傳輸流程 528
第12章 電源管理系統(tǒng)詳解 533
12.1 Android Power Management基礎(chǔ) 534
12.2 分析Framework層 535
12.2.1 文件PowerManager.java 535
12.2.2 文件PowerManagerService.java 536
12.3 分析JNI層 560
12.3.1 文件android_os_Power.cpp 560
12.3.2 文件power.c 561
12.4 分析Kernel(內(nèi)核)層 562
12.4.1 文件power.c 562
12.4.2 文件earlysuspend.c 565
12.4.3 文件wakelock.c 566
12.4.4 文件resume.c 568
12.4.5 文件suspend.c 568
12.4.6 文件main.c 570
12.4.7 proc文件 570
12.5 wakelock和early_suspend 571
12.5.1 wakelock的原理 571
12.5.2 early_suspend的原理 572
12.5.3 Android休眠 572
12.5.4 Android喚醒 575
第13章 輸入系統(tǒng)驅(qū)動應(yīng)用 577
13.1 輸入系統(tǒng)介紹 578
13.2 分析Input(輸入)系統(tǒng)驅(qū)動 580
13.2.1 分析頭文件 580
13.2.2 分析核心文件input.c 584
13.2.3 分析event機制 600
13.3 分析硬件抽象層 603
13.3.1 分析文件KeycodeLabels.h 603
13.3.2 分析文件KeyCharacterMap.h 608
13.3.3 分析Kl格式的文件 609
13.3.4 分析kcm格式文件 610
13.3.5 分析文件EventHub.cpp 611
13.4 分析驅(qū)動的具體實現(xiàn) 615
13.4.1 分析內(nèi)置模擬器中的輸入驅(qū)動實現(xiàn) 615
13.4.2 MSM高通處理器中的輸入驅(qū)動實現(xiàn) 616
13.4.3 OMAP高通處理器中的輸入驅(qū)動實現(xiàn) 625
第14章 藍(lán)牙系統(tǒng)詳解 627
14.1 Android系統(tǒng)中的藍(lán)牙模塊 628
14.2 分析藍(lán)牙模塊的源碼 630
14.2.1 初始化藍(lán)牙芯片 630
14.2.2 藍(lán)牙服務(wù) 630
14.2.3 管理藍(lán)牙電源 631
14.3 與藍(lán)牙相關(guān)的類 632
14.3.1 BluetoothSocket類 632
14.3.2 BluetoothServerSocket類 633
14.3.3 BluetoothAdapter類 634
14.3.4 BluetoothClass.Service類 641
14.3.5 BluetoothClass.Device類 641
14.4 低功耗藍(lán)牙協(xié)議棧詳解 642
14.4.1 低功耗藍(lán)牙協(xié)議棧基礎(chǔ) 642
14.4.2 低功耗藍(lán)牙API詳解 643
14.5 Android中的BlueDroid 644
14.5.1 Android系統(tǒng)中BlueDroid的架構(gòu) 644
14.5.2 Application Framework層分析 645
14.5.3 分析Bluetooth SystemService層 653
14.5.4 分析JNI層 654
14.5.5 分析HAL層 659
14.6 Android藍(lán)牙模塊的運作流程 659
14.6.1 打開藍(lán)牙設(shè)備 659
14.6.2 搜索藍(lán)牙 665
14.6.3 傳輸OPP文件 671
第15章 網(wǎng)絡(luò)系統(tǒng)詳解 679
15.1 使用WebKit瀏覽網(wǎng)頁 680
15.1.1 WebKit的Java層框架 681
15.1.2 C/C++層框架 685
15.1.3 分析WebKit的操作過程 688
15.1.4 WebView詳解 692
15.1.5 WebViewCore詳解 693
15.2 Wi-Fi系統(tǒng)應(yīng)用 700
15.2.1 Wi-Fi概述 700
15.2.2 Wi-Fi系統(tǒng)的層次結(jié)構(gòu) 701
15.2.3 與Linux的差異 703
15.2.4 分析本地部分的源碼 703
15.2.5 分析JNI部分的源碼 706
15.2.6 分析Java Framework部分的源碼 708
15.2.7 分析Setting中的設(shè)置部分的源碼 721