閉關(guān)了四個(gè)多月,整理了博客上所有的Android文章,一共劃分為三大篇,十六個(gè)章節(jié),820頁,系統(tǒng)地分析了Android系統(tǒng)的源代碼,從Linux內(nèi)核層、HAL層、運(yùn)行時(shí)庫(kù)層到應(yīng)用程序框架層。整理期間困難重重,多次想要放棄,但是看到在四個(gè)多月不更新文章的情況下,博客訪問量仍節(jié)節(jié)攀升,從評(píng)論中感受到了網(wǎng)友們的熱情支持,受到了極大的鼓舞,最終堅(jiān)持了下來。現(xiàn)在將整理的內(nèi)容提綱發(fā)表出來,歡迎大家提供建議。
整理的內(nèi)容并不是簡(jiǎn)單地復(fù)制了博客上的文章。博客文章由于發(fā)表得比較匆忙,不到六個(gè)月的時(shí)間,一共發(fā)表了50篇原創(chuàng)文章,平均每周發(fā)表兩篇,而且都是利用工作之余時(shí)間來發(fā)表,因此,很多內(nèi)容都不夠全面、深入和細(xì)致。例如,在分析Binder進(jìn)程間通信機(jī)制的一系列博客文章中,并沒有提及到Binder對(duì)象的引用計(jì)數(shù)技術(shù)、死亡通知機(jī)制等重要內(nèi)容,對(duì)Binder驅(qū)動(dòng)中的內(nèi)存管理也分析得不夠系統(tǒng);又如,在分析Android應(yīng)用程序的安裝過程時(shí),沒有提及到系統(tǒng)是如何為應(yīng)用程序分配Linux用戶ID以及Linux用戶組ID。整理的內(nèi)容對(duì)博客文章中不夠全面、學(xué)入和細(xì)致的地方進(jìn)行了相應(yīng)的補(bǔ)充。此外,博客文章也會(huì)出現(xiàn)一些錯(cuò)誤。例如,在《Android應(yīng)用程序鍵盤(Keyboard)消息處理機(jī)制分析》這篇博客文章中,網(wǎng)友@foresee321指出了注冊(cè)系統(tǒng)當(dāng)前激活窗口的過程有誤。整理的內(nèi)容也對(duì)這些錯(cuò)誤作出了修正。博客文章不夠全面、深入、細(xì)致以及有誤的地方不能一一而足,不過它們?cè)谥匦抡淼膬?nèi)容中都得到了解決。
整理的內(nèi)容從初學(xué)者的角度來組織,由淺入深、自下而上地對(duì)Android系統(tǒng)的源代碼進(jìn)行了分析,目錄結(jié)構(gòu)如下所示:
第一篇 初識(shí)Android系統(tǒng)...........................................6 第一章 準(zhǔn)備知識(shí)..............................................7 1.1 準(zhǔn)備Linux內(nèi)核基礎(chǔ)知識(shí)................................7 1.2 準(zhǔn)備Android應(yīng)用程序基礎(chǔ)知識(shí)..........................8 1.3 下載、編譯和運(yùn)行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 運(yùn)行Android模擬器..............................11 1.4 下載、編譯和運(yùn)行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 運(yùn)行Android模擬器..............................14 1.5 開發(fā)第一個(gè)Android應(yīng)用程序............................14 1.6 編譯和打包單個(gè)Android應(yīng)用程序模塊....................17 1.6.1 導(dǎo)入編譯單個(gè)模塊的mmm命令......................17 1.6.2 編譯單個(gè)Android應(yīng)用程序模塊....................18 1.6.3 重新打包Android系統(tǒng)鏡像文件....................18 第二章 硬件抽象層............................................19 2.1 開發(fā)Android硬件驅(qū)動(dòng)程序..............................20 2.1.1 實(shí)現(xiàn)內(nèi)核驅(qū)動(dòng)程序模塊...........................21 2.1.2 修改內(nèi)核Kconfig文件............................27 2.1.3 修改內(nèi)核Makefile文件...........................28 2.1.4 編譯內(nèi)核驅(qū)動(dòng)程序模塊...........................28 2.1.5 驗(yàn)證內(nèi)核驅(qū)動(dòng)程序模塊...........................29 2.2 開發(fā)C可執(zhí)行程序驗(yàn)證Android硬件驅(qū)動(dòng)程序...............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 實(shí)現(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 實(shí)現(xiàn)硬件訪問服務(wù)...............................45 2.4.3 實(shí)現(xiàn)硬件訪問服務(wù)的Java 本地接口方法............46 2.4.4 啟動(dòng)硬件訪問服務(wù)...............................49 2.5 開發(fā)Android應(yīng)用程序來調(diào)用硬件訪問服務(wù)................50 第三章 智能指針..............................................55 3.1 輕量級(jí)指針...........................................57 3.1.1 實(shí)現(xiàn)原理分析...................................57 3.1.2 使用實(shí)例分析...................................59 3.2 強(qiáng)指針和弱指針.......................................61 3.2.1 強(qiáng)指針的實(shí)現(xiàn)原理分析...........................61 3.2.2 弱指針的實(shí)現(xiàn)原理分析...........................68 3.2.3 強(qiáng)指針和弱指針的使用實(shí)例分析...................74 第二篇 Android專用驅(qū)動(dòng)系統(tǒng).......................................79 第四章 Logger日志系統(tǒng)........................................80 4.1 Logger驅(qū)動(dòng)程序.......................................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 運(yùn)行時(shí)日志庫(kù)寫入接口.................................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進(jìn)程間通信系統(tǒng)..................................149 5.1 Binder驅(qū)動(dòng)程序.......................................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進(jìn)程間通信庫(kù)...................................193 5.3 Binder進(jìn)程間通信應(yīng)用實(shí)例.............................197 5.4 Binder對(duì)象引用計(jì)數(shù)技術(shù)...............................205 5.4.1 Binder本地對(duì)象的生命周期.......................206 5.4.2 Binder實(shí)體對(duì)象的生命周期.......................210 5.4.3 Binder引用對(duì)象的生命周期.......................213 5.4.4 Binder代理對(duì)象的生命周期.......................218 5.5 Binder對(duì)象死亡通知機(jī)制...............................221 5.5.1 注冊(cè)死亡接收通知...............................221 5.5.2 發(fā)送死亡接收通知...............................225 5.5.3 注銷死亡接收通知...............................229 5.6 Service Manager的啟動(dòng)過程............................232 5.6.1 打開和映射Binder設(shè)備文件.......................234 5.6.2 注冊(cè)成為Binder上下文管理者.....................235 5.6.3 循環(huán)等待Client進(jìn)程請(qǐng)求.........................239 5.7 Service Manager代理對(duì)象接口的獲取過程................245 5.8 Service的啟動(dòng)過程....................................252 5.8.1 注冊(cè)Service組件................................253 5.8.1.1 封裝通信數(shù)據(jù)為Parcel對(duì)象.................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進(jìn)程請(qǐng)求.........................291 5.9 Service代理對(duì)象接口的獲取過程........................294 5.10 Binder進(jìn)程間通信機(jī)制的Java實(shí)現(xiàn)接口..................302 5.10.1 獲取Service Manager的Java代理對(duì)象接口.........303 5.10.2 AIDL服務(wù)接口解析..............................312 5.10.3 Java服務(wù)的啟動(dòng)過程............................315 5.10.4 獲取Java服務(wù)的代理對(duì)象接口....................321 5.10.5 Java服務(wù)的調(diào)用過程............................324 第六章 Ashmem匿名共享內(nèi)存系統(tǒng)................................329 6.1 Ashmem驅(qū)動(dòng)程序.......................................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 運(yùn)行時(shí)庫(kù)cutils的匿名共享內(nèi)存接口.....................346 6.3 匿名共享內(nèi)存的C++訪問接口............................349 6.3.1 MemoryHeapBase.................................349 6.3.1.1 Server端的實(shí)現(xiàn)...........................349 6.3.1.2 Client端的實(shí)現(xiàn)...........................353 6.3.2 MemoryBase.....................................359 6.3.2.1 Server端的實(shí)現(xiàn)...........................360 6.3.2.2 Client端的實(shí)現(xiàn)...........................362 6.3.3 應(yīng)用實(shí)例.......................................364 6.4 匿名共享內(nèi)存的Java訪問接口...........................370 6.4.1 MemoryFile.....................................370 6.4.2 應(yīng)用實(shí)例.......................................375 6.5 匿名共享內(nèi)存的共享原理分析...........................386 第三篇 Android應(yīng)用程序框架篇.....................................390 第七章 Activity組件的啟動(dòng)過程................................391 7.1 Activity組件應(yīng)用實(shí)例.................................391 7.2 根Activity的啟動(dòng)過程.................................397 7.3 Activity在進(jìn)程內(nèi)的啟動(dòng)過程...........................429 7.4 Activity在新進(jìn)程中的啟動(dòng)過程.........................438 第八章 Service組件的啟動(dòng)過程.................................441 8.1 Service組件應(yīng)用實(shí)例..................................441 8.2 Service在新進(jìn)程中的啟動(dòng)過程..........................448 8.3 Service在進(jìn)程內(nèi)的綁定過程............................460 第九章 Android系統(tǒng)廣播機(jī)制...................................483 9.1 廣播應(yīng)用實(shí)例.........................................484 9.2 廣播接收者的注冊(cè)過程.................................491 9.3 廣播的發(fā)送過程.......................................499 第十章 Content Provider組件的實(shí)現(xiàn)原理........................521 10.1 Content Provider組件應(yīng)用實(shí)例........................522 10.1.1 ArticlesProvider..............................523 10.1.2 Article.......................................533 10.2 Content Provider組件的啟動(dòng)過程......................548 10.3 Content Provider組件的數(shù)據(jù)共享原理..................570 10.4 Content Provider組件的數(shù)據(jù)更新通知機(jī)制..............593 10.4.1 內(nèi)容觀察者的注冊(cè)過程..........................594 10.4.2 數(shù)據(jù)更新的通知過程............................601 第十一章 Zygote和System進(jìn)程的啟動(dòng)過程........................609 11.1 Zygote進(jìn)程的啟動(dòng)腳本................................609 11.2 Zygote進(jìn)程的啟動(dòng)過程................................612 11.3 System進(jìn)程的啟動(dòng)過程................................619 第十二章 Android應(yīng)用程序進(jìn)程的啟動(dòng)過程.......................628 12.1 應(yīng)用程序進(jìn)程的創(chuàng)建過程..............................628 12.2 Binder線程池的啟動(dòng)過程..............................637 12.3 消息循環(huán)的創(chuàng)建過程..................................640 第十三章 Android應(yīng)用程序的消息處理機(jī)制.......................644 13.1 創(chuàng)建線程消息隊(duì)列....................................644 13.2 線程消息循環(huán)過程....................................649 13.3 線程消息發(fā)送過程....................................654 13.4 線程消息處理過程....................................658 第十四章 Android應(yīng)用程序的鍵盤消息處理機(jī)制...................666 14.1 InputManager的啟動(dòng)過程..............................669 14.1.1 創(chuàng)建InputManager..............................669 14.1.2 啟動(dòng)InputManager..............................672 14.1.3 啟動(dòng)InputDispatcher...........................674 14.1.4 啟動(dòng)InputReader...............................676 14.2 InputChannel的注冊(cè)過程..............................687 14.2.1 創(chuàng)建InputChannel..............................688 14.2.2 注冊(cè)Server端InputChannel......................695 14.2.3 注冊(cè)當(dāng)前激活窗口..............................699 14.2.4 注冊(cè)Client端InputChannel......................704 14.3 鍵盤消息的分發(fā)過程..................................708 14.3.1 InputReader處理鍵盤事件.......................708 14.3.2 InputDispatcher分發(fā)鍵盤事件...................715 14.3.3 當(dāng)前激活的窗口獲得鍵盤消息....................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第一篇包含三個(gè)章節(jié),介紹了Android系統(tǒng)源代碼的下載、編譯和運(yùn)行,Android系統(tǒng)的智能指針,以及Android系統(tǒng)的硬件抽象層。在應(yīng)用程序框架層的Native代碼中,大量的使用了智能指針,因此,在分析Android系統(tǒng)的源代碼之前,我們需要對(duì)它的智能指針有所了解。學(xué)習(xí)Android系統(tǒng)的硬件抽象層,能夠使得我們迅速掌握Android系統(tǒng)的層次結(jié)構(gòu)。
第二篇也是包含三個(gè)章節(jié),分析Android系統(tǒng)在Linux內(nèi)核中的三個(gè)專用驅(qū)動(dòng),分別是日志驅(qū)動(dòng)、Binder驅(qū)動(dòng)和匿名共享內(nèi)存驅(qū)動(dòng)。毋容置疑,這三個(gè)專用驅(qū)動(dòng)構(gòu)成了Android系統(tǒng)的基礎(chǔ),學(xué)習(xí)它們對(duì)了解Android系統(tǒng)有非常大的幫助。
第三篇包含了十個(gè)章節(jié),系統(tǒng)地分析Android應(yīng)用程序的架構(gòu),從應(yīng)用程序組件、進(jìn)程、消息和安裝四個(gè)角度來它進(jìn)行系統(tǒng)的分析。移動(dòng)平臺(tái)最核心的競(jìng)爭(zhēng)力是運(yùn)行在它上面的豐富的、高質(zhì)量的應(yīng)用程序,而這些豐富的、高質(zhì)量的應(yīng)用程序離不開優(yōu)秀的應(yīng)用程序基礎(chǔ)設(shè)施和架構(gòu),因此,花了很大的篇幅來介紹Android應(yīng)用程序的架構(gòu),同時(shí)它是理解整個(gè)Android系統(tǒng)的一個(gè)很好切入點(diǎn),畢竟系統(tǒng)所做的一切都是為使得它上面的應(yīng)用程序能夠好好地運(yùn)行、好好地為用戶服務(wù)。