閉關(guān)了四個多月,整理了博客上所有的Android文章,一共劃分為三大篇,十六個章節(jié),820頁,系統(tǒng)地分析了Android系統(tǒng)的源代碼,從Linux內(nèi)核層、HAL層、運行時庫層到應(yīng)用程序框架層。整理期間困難重重,多次想要放棄,但是看到在四個多月不更新文章的情況下,博客訪問量仍節(jié)節(jié)攀升,從評論中感受到了網(wǎng)友們的熱情支持,受到了極大的鼓舞,最終堅持了下來。現(xiàn)在將整理的內(nèi)容提綱發(fā)表出來,歡迎大家提供建議。
整理的內(nèi)容并不是簡單地復(fù)制了博客上的文章。博客文章由于發(fā)表得比較匆忙,不到六個月的時間,一共發(fā)表了50篇原創(chuàng)文章,平均每周發(fā)表兩篇,而且都是利用工作之余時間來發(fā)表,因此,很多內(nèi)容都不夠全面、深入和細致。例如,在分析Binder進程間通信機制的一系列博客文章中,并沒有提及到Binder對象的引用計數(shù)技術(shù)、死亡通知機制等重要內(nèi)容,對Binder驅(qū)動中的內(nèi)存管理也分析得不夠系統(tǒng);又如,在分析Android應(yīng)用程序的安裝過程時,沒有提及到系統(tǒng)是如何為應(yīng)用程序分配Linux用戶ID以及Linux用戶組ID。整理的內(nèi)容對博客文章中不夠全面、學入和細致的地方進行了相應(yīng)的補充。此外,博客文章也會出現(xiàn)一些錯誤。例如,在《Android應(yīng)用程序鍵盤(Keyboard)消息處理機制分析》這篇博客文章中,網(wǎng)友@foresee321指出了注冊系統(tǒng)當前激活窗口的過程有誤。整理的內(nèi)容也對這些錯誤作出了修正。博客文章不夠全面、深入、細致以及有誤的地方不能一一而足,不過它們在重新整理的內(nèi)容中都得到了解決。
整理的內(nèi)容從初學者的角度來組織,由淺入深、自下而上地對Android系統(tǒng)的源代碼進行了分析,目錄結(jié)構(gòu)如下所示:
第一篇 初識Android系統(tǒng)...........................................6
第一章 準備知識..............................................7
1.1 準備Linux內(nèi)核基礎(chǔ)知識................................7
1.2 準備Android應(yīng)用程序基礎(chǔ)知識..........................8
1.3 下載、編譯和運行Android源代碼........................8
1.3.1 安裝Git工具....................................9
1.3.2 安裝Java SDK...................................9
1.3.3 安裝其它工具包.................................9
1.3.4 安裝repo工具...................................9
1.3.5 下載Android源代碼..............................9
1.3.6 編譯Android源代碼..............................10
1.3.7 運行Android模擬器..............................11
1.4 下載、編譯和運行Android內(nèi)核源代碼....................12
1.4.1 下載Android內(nèi)核源代碼..........................12
1.4.2 修改Makefile文件...............................13
1.4.3 編譯Android內(nèi)核源代碼..........................13
1.4.4 運行Android模擬器..............................14
1.5 開發(fā)第一個Android應(yīng)用程序............................14
1.6 編譯和打包單個Android應(yīng)用程序模塊....................17
1.6.1 導(dǎo)入編譯單個模塊的mmm命令......................17
1.6.2 編譯單個Android應(yīng)用程序模塊....................18
1.6.3 重新打包Android系統(tǒng)鏡像文件....................18
第二章 硬件抽象層............................................19
2.1 開發(fā)Android硬件驅(qū)動程序..............................20
2.1.1 實現(xiàn)內(nèi)核驅(qū)動程序模塊...........................21
2.1.2 修改內(nèi)核Kconfig文件............................27
2.1.3 修改內(nèi)核Makefile文件...........................28
2.1.4 編譯內(nèi)核驅(qū)動程序模塊...........................28
2.1.5 驗證內(nèi)核驅(qū)動程序模塊...........................29
2.2 開發(fā)C可執(zhí)行程序驗證Android硬件驅(qū)動程序...............30
2.3 開發(fā)Android硬件抽象層模塊............................32
2.3.1 硬件抽象層編寫規(guī)范.............................32
2.3.1.1 模塊文件的命令規(guī)范.......................32
2.3.1.2 結(jié)構(gòu)體定義規(guī)范...........................33
2.3.2 實現(xiàn)硬件抽象層訪問接口.........................35
2.3.3 硬件抽象層模塊加載過程分析.....................39
2.3.4 處理硬件設(shè)備訪問權(quán)限問題.......................42
2.4 開發(fā)Android硬件訪問服務(wù)..............................44
2.4.1 定義硬件訪問服務(wù)接口...........................44
2.4.2 實現(xiàn)硬件訪問服務(wù)...............................45
2.4.3 實現(xiàn)硬件訪問服務(wù)的Java 本地接口方法............46
2.4.4 啟動硬件訪問服務(wù)...............................49
2.5 開發(fā)Android應(yīng)用程序來調(diào)用硬件訪問服務(wù)................50
第三章 智能指針..............................................55
3.1 輕量級指針...........................................57
3.1.1 實現(xiàn)原理分析...................................57
3.1.2 使用實例分析...................................59
3.2 強指針和弱指針.......................................61
3.2.1 強指針的實現(xiàn)原理分析...........................61
3.2.2 弱指針的實現(xiàn)原理分析...........................68
3.2.3 強指針和弱指針的使用實例分析...................74
第二篇 Android專用驅(qū)動系統(tǒng).......................................79
第四章 Logger日志系統(tǒng)........................................80
4.1 Logger驅(qū)動程序.......................................83
4.1.1 相關(guān)數(shù)據(jù)結(jié)構(gòu)...................................83
4.1.2 設(shè)備初始化過程.................................85
4.1.3 設(shè)備文件打開過程...............................90
4.1.4 日志讀取過程...................................91
4.1.5 日志寫入過程...................................95
4.2 運行時日志庫寫入接口.................................100
4.3 C/C++日志寫入接口....................................106
4.4 Java日志寫入接口.....................................110
4.5 Logcat工具分析.......................................116
4.5.1 相關(guān)數(shù)據(jù)結(jié)構(gòu)...................................117
4.5.2 初始化過程.....................................121
4.5.3 日志讀取過程...................................133
4.5.4 日志輸出過程...................................137
第五章 Binder進程間通信系統(tǒng)..................................149
5.1 Binder驅(qū)動程序.......................................151
5.1.1 相關(guān)數(shù)據(jù)結(jié)構(gòu)...................................152
5.1.2 設(shè)備初始化過程.................................172
5.1.3 設(shè)備文件打開過程...............................173
5.1.4 設(shè)備文件內(nèi)存映射過程...........................174
5.1.5 內(nèi)核緩沖區(qū)管理.................................181
5.1.5.1 分配內(nèi)核緩沖區(qū)...........................181
5.1.5.2 釋放內(nèi)核緩沖區(qū)...........................187
5.1.5.3 查詢內(nèi)核緩沖區(qū)...........................192
5.2 Binder進程間通信庫...................................193
5.3 Binder進程間通信應(yīng)用實例.............................197
5.4 Binder對象引用計數(shù)技術(shù)...............................205
5.4.1 Binder本地對象的生命周期.......................206
5.4.2 Binder實體對象的生命周期.......................210
5.4.3 Binder引用對象的生命周期.......................213
5.4.4 Binder代理對象的生命周期.......................218
5.5 Binder對象死亡通知機制...............................221
5.5.1 注冊死亡接收通知...............................221
5.5.2 發(fā)送死亡接收通知...............................225
5.5.3 注銷死亡接收通知...............................229
5.6 Service Manager的啟動過程............................232
5.6.1 打開和映射Binder設(shè)備文件.......................234
5.6.2 注冊成為Binder上下文管理者.....................235
5.6.3 循環(huán)等待Client進程請求.........................239
5.7 Service Manager代理對象接口的獲取過程................245
5.8 Service的啟動過程....................................252
5.8.1 注冊Service組件................................253
5.8.1.1 封裝通信數(shù)據(jù)為Parcel對象.................254
5.8.1.2 發(fā)送和處理BC_TRANSACTION命令協(xié)議.........257
5.8.1.3 發(fā)送和處理BR_TRANSACTION返回協(xié)議.........270
5.8.1.4 發(fā)送和處理BC_REPLY命令協(xié)議...............282
5.8.1.5 發(fā)送和處理BR_REPLY返回協(xié)議...............288
5.8.2 循環(huán)等待Client進程請求.........................291
5.9 Service代理對象接口的獲取過程........................294
5.10 Binder進程間通信機制的Java實現(xiàn)接口..................302
5.10.1 獲取Service Manager的Java代理對象接口.........303
5.10.2 AIDL服務(wù)接口解析..............................312
5.10.3 Java服務(wù)的啟動過程............................315
5.10.4 獲取Java服務(wù)的代理對象接口....................321
5.10.5 Java服務(wù)的調(diào)用過程............................324
第六章 Ashmem匿名共享內(nèi)存系統(tǒng)................................329
6.1 Ashmem驅(qū)動程序.......................................330
6.1.1 相關(guān)數(shù)據(jù)結(jié)構(gòu)...................................330
6.1.2 設(shè)備初始化過程.................................332
6.1.3 設(shè)備文件打開過程...............................334
6.1.4 設(shè)備文件內(nèi)存映射過程...........................336
6.1.5 內(nèi)存塊的鎖定和解鎖過程.........................338
6.1.6 解鎖狀態(tài)內(nèi)存塊的回收過程.......................345
6.2 運行時庫cutils的匿名共享內(nèi)存接口.....................346
6.3 匿名共享內(nèi)存的C++訪問接口............................349
6.3.1 MemoryHeapBase.................................349
6.3.1.1 Server端的實現(xiàn)...........................349
6.3.1.2 Client端的實現(xiàn)...........................353
6.3.2 MemoryBase.....................................359
6.3.2.1 Server端的實現(xiàn)...........................360
6.3.2.2 Client端的實現(xiàn)...........................362
6.3.3 應(yīng)用實例.......................................364
6.4 匿名共享內(nèi)存的Java訪問接口...........................370
6.4.1 MemoryFile.....................................370
6.4.2 應(yīng)用實例.......................................375
6.5 匿名共享內(nèi)存的共享原理分析...........................386
第三篇 Android應(yīng)用程序框架篇.....................................390
第七章 Activity組件的啟動過程................................391
7.1 Activity組件應(yīng)用實例.................................391
7.2 根Activity的啟動過程.................................397
7.3 Activity在進程內(nèi)的啟動過程...........................429
7.4 Activity在新進程中的啟動過程.........................438
第八章 Service組件的啟動過程.................................441
8.1 Service組件應(yīng)用實例..................................441
8.2 Service在新進程中的啟動過程..........................448
8.3 Service在進程內(nèi)的綁定過程............................460
第九章 Android系統(tǒng)廣播機制...................................483
9.1 廣播應(yīng)用實例.........................................484
9.2 廣播接收者的注冊過程.................................491
9.3 廣播的發(fā)送過程.......................................499
第十章 Content Provider組件的實現(xiàn)原理........................521
10.1 Content Provider組件應(yīng)用實例........................522
10.1.1 ArticlesProvider..............................523
10.1.2 Article.......................................533
10.2 Content Provider組件的啟動過程......................548
10.3 Content Provider組件的數(shù)據(jù)共享原理..................570
10.4 Content Provider組件的數(shù)據(jù)更新通知機制..............593
10.4.1 內(nèi)容觀察者的注冊過程..........................594
10.4.2 數(shù)據(jù)更新的通知過程............................601
第十一章 Zygote和System進程的啟動過程........................609
11.1 Zygote進程的啟動腳本................................609
11.2 Zygote進程的啟動過程................................612
11.3 System進程的啟動過程................................619
第十二章 Android應(yīng)用程序進程的啟動過程.......................628
12.1 應(yīng)用程序進程的創(chuàng)建過程..............................628
12.2 Binder線程池的啟動過程..............................637
12.3 消息循環(huán)的創(chuàng)建過程..................................640
第十三章 Android應(yīng)用程序的消息處理機制.......................644
13.1 創(chuàng)建線程消息隊列....................................644
13.2 線程消息循環(huán)過程....................................649
13.3 線程消息發(fā)送過程....................................654
13.4 線程消息處理過程....................................658
第十四章 Android應(yīng)用程序的鍵盤消息處理機制...................666
14.1 InputManager的啟動過程..............................669
14.1.1 創(chuàng)建InputManager..............................669
14.1.2 啟動InputManager..............................672
14.1.3 啟動InputDispatcher...........................674
14.1.4 啟動InputReader...............................676
14.2 InputChannel的注冊過程..............................687
14.2.1 創(chuàng)建InputChannel..............................688
14.2.2 注冊Server端InputChannel......................695
14.2.3 注冊當前激活窗口..............................699
14.2.4 注冊Client端InputChannel......................704
14.3 鍵盤消息的分發(fā)過程..................................708
14.3.1 InputReader處理鍵盤事件.......................708
14.3.2 InputDispatcher分發(fā)鍵盤事件...................715
14.3.3 當前激活的窗口獲得鍵盤消息....................727
14.3.4 InputDispatcher獲得鍵盤事件處理完成通知.......741
14.4 InputChannel的注銷過程..............................745
14.4.1 銷毀應(yīng)用程序窗口..............................746
14.4.2 注銷Client端InputChannel......................754
14.4.3 注銷Server端InputChannel......................756
第十五章 Android應(yīng)用程序線程的消息循環(huán)模型...................762
15.1 應(yīng)用程序主線程消息循環(huán)模型..........................762
15.2 界面無關(guān)的應(yīng)用程序子線程消息循環(huán)模型................764
15.3 界面相關(guān)的應(yīng)用程序子線程消息循環(huán)模型................766
第十六章 Android應(yīng)用程序的安裝和顯示過程.....................775
16.1 應(yīng)用程序的安裝過程..................................775
16.2 應(yīng)用程序的顯示過程..................................808
第一篇包含三個章節(jié),介紹了Android系統(tǒng)源代碼的下載、編譯和運行,Android系統(tǒng)的智能指針,以及Android系統(tǒng)的硬件抽象層。在應(yīng)用程序框架層的Native代碼中,大量的使用了智能指針,因此,在分析Android系統(tǒng)的源代碼之前,我們需要對它的智能指針有所了解。學習
Android系統(tǒng)的硬件抽象層,能夠使得我們迅速掌握Android系統(tǒng)的層次結(jié)構(gòu)。
第二篇也是包含三個章節(jié),分析Android系統(tǒng)在Linux內(nèi)核中的三個專用驅(qū)動,分別是日志驅(qū)動、Binder驅(qū)動和匿名共享內(nèi)存驅(qū)動。毋容置疑,這三個專用驅(qū)動構(gòu)成了Android系統(tǒng)的基礎(chǔ),學習它們對了解Android系統(tǒng)有非常大的幫助。
第三篇包含了十個章節(jié),系統(tǒng)地分析Android應(yīng)用程序的架構(gòu),從應(yīng)用程序組件、進程、消息和安裝四個角度來它進行系統(tǒng)的分析。移動平臺最核心的競爭力是運行在它上面的豐富的、高質(zhì)量的應(yīng)用程序,而這些豐富的、高質(zhì)量的應(yīng)用程序離不開優(yōu)秀的應(yīng)用程序基礎(chǔ)設(shè)施和架構(gòu),因此,花了很大的篇幅來介紹Android應(yīng)用程序的架構(gòu),同時它是理解整個Android系統(tǒng)的一個很好切入點,畢竟系統(tǒng)所做的一切都是為使得它上面的應(yīng)用程序能夠好好地運行、好好地為用戶服務(wù)。
作者:Luoshengyang 發(fā)表于2012-3-30 2:31:13
原文鏈接
posted on 2012-04-17 21:32
mixer-a 閱讀(229)
評論(0) 編輯 收藏