Android系統原始碼情景分析

內容簡介

在組織上,本書將上述內容劃分為初識Android系統、Android專用驅動系統和Android應用程式框架三大篇。初識Android系統篇介紹了參考書籍、基礎知識以及實驗環境搭建;Android專用驅動系統篇介紹了Logger日誌驅動程式、Binder進程間通信驅動程式以及Ashmem匿名共享記憶體驅動程式;Android應用程式框架篇從組件、進程、訊息以及安裝四個維度對Android應用程式的框架進行了深入的剖析。

通過上述內容及其組織,本書能使讀者既能從整體上把握Android系統的層次結構,又能從細節上掌握每一個層次的要點。

作者簡介

羅昇陽,1984年出生,2007年畢業於浙江大學計算機系,取得學士學位,2010年畢業於上海交通大學計算機系,取得碩士學位。畢業後一直從事於網際網路軟體開發,並且致力於移動平台的研究,特別是對Android平台有深入的理解和研究。在國內知名IT技術社區CSDN上發表了數十篇高質量的Android系統原創性文章,並且開設部落格專欄--《老羅的Android之旅》,積極與網友互動,深受大家喜愛,訪問量一直居於前茅。

網友評論

強大的羅大師,感謝你的Android之旅,我已看完你的6篇教程,雖然我還不太懂,但是我相信你就是我打開它的那把鑰匙,再次感謝你的教程。

——mutex_js

老羅,寫的太精彩啦!不僅僅是在Android 按鍵機制方面令人受益匪淺,給我在學習其他模組上也提供了一套很好的分析思路。非常感謝!

——yuleslie

看你的文章,收穫很多,分析得很透徹,思路清晰,前後呼應,成系統,對我幫助很大,非常感謝你的無私奉獻!

——kenen2006

你的部落格給了我一種非常刺激的體驗,讓我更深層次地認識Android。非常感謝你的講解,太棒了!

——stevenhu_223

我真的想放棄這個行業,可我看到你的部落格,讓我看到了希望,讓我充滿了信心和堅定!

——zhudeqing

看過幾本Andriod方面的書,但還真比不上這裡的部落格。羅老師的Linux核心知識及對軟體架構的知識積累用功很深,代碼閱讀能力也很強!膜拜!

——herodie

我是看你的部落格開始學Android的,寫的真的太好了。每一個系列都自成一體,無需其他參考。從頂到下都能串到一起,這樣看起來最痛快了!

——hellowolrd

本人語言功底也不是很好,所以系統學習Android也經歷了不少困難。3個多月了,反反覆覆閱讀你的博文;每一次都有進步,每一次的進步也都有不同的方向。謝謝!技術的道路上真沒有捷徑,更不可以偷懶。我將不懈努力!謝謝博主,期待您能出書!

——tankai19880619

剛看到老羅的這篇新作,還挺熱乎的。忍不住分N口氣讀完,膜拜!讀完後,有些有意思的想法,從文章本身來看,很精彩。這篇文章老羅至少說明了一下問題:

1. 兩種最典型的使用場景及他們的區別(UI相關與否);

2. 引出來兩種執行緒訊息處理模型;

3. 用實例解釋兩種模型是如何使用的;

4. 最後介紹兩種模型的是怎樣實現的。

該文章不但告訴我們what(該文的主旨)、how (怎樣使用),還有why(怎么實現)。

偶的神,一篇文章里寫了這么多,還能寫的這么清楚。不容易啊!

——rambo2188

太牛了!我是一個剛從事Android開發的新人,你的文章真是入木三分,讀了很有啟發,你的這種分析Android方式很棒!為了造福更多的Android學習者,建議你出書!

——yang105

我覺得也許學習這些知識並不算難,可是要做到時刻有一個清晰的思路去學並且能夠把學過東西用通俗易懂的話語表達出來挺難的。必儘自身知識有限,有些東西可能一下子無法深刻理解。樓主是怎么做到的呢?感覺樓主的每篇文章都講的精練透徹,主要是能把問題全講出來。我想樓主的知識面一定很廣!

——wantianpei

雖然Android系統自2008年9月發布第一個版本1.0以來,2011年10月發布最新版本4.0,一共存在十多個版本,但是據官方統計,截至2012年3月5日,占據首位的是Android 2.3,市場占有率達到66.5%;其次是Android 2.2,市場占有率為25.3%;第三位是Android 2.1,市場占有率為6.6%;而最新發布的Android 3.2和Android 4.0的市場占有率只有3.3%和2%。因此,在本書中,我們選擇了Android 2.3的原始碼來分析Android系統的實現,一是因為它的基礎架構是最穩定的;二是因為它是使用最廣泛的。

本書內容

全書分為初識Android系統篇、Android專用驅動系統篇和Android應用程式框架篇三個部分。

初識Android系統篇包含三個章節的內容,主要介紹Android系統的基礎知識。第1章介紹與Android系統有關的參考書籍,以及Android原始碼工程環境的搭建方法;第2章介紹Android系統的硬體抽象層;第3章介紹Android系統的智慧型指針。讀者可能會覺得奇怪,為什麼一開始就介紹Android系統的硬體抽象層呢?因為涉及硬體,它似乎是一個深奧的知識點。其實不然,Android系統的硬體抽象層無論是從實現上,還是從使用上,它的層次都是非常清晰的,而且從下到上涵蓋了整個Android系統,包括Android系統在用戶空間和核心空間的實現。核心空間主要涉及硬體驅動程式的編寫方法,而用戶空間涉及運行時庫層、應用程式框架層及應用程式層。因此,儘早學習Android系統的硬體抽象層,有助於我們從整體上去認識Android系統,以便後面可以更好地分析它的原始碼。在分析Android系統原始碼的過程中,經常會碰到智慧型指針,第3章我們就重點分析Android系統智慧型指針的實

現原理,也是為了後面可以更好地分析Android系統原始碼。

Android專用驅動系統篇包含三個章節的內容。我們知道,Android系統是基於Linux核心來開發的,但是由於移動設備的CPU和記憶體配置都要比PC低,因此,Android系統並不是完全在Linux核心上開發的,而是在Linux核心裡面添加了一些專用的驅動模組來使它更適合於移動設備。這些專用的驅動模組同時也形成了Android系統的堅實基礎,尤其是Logger日誌驅動程式、Binder進程間通信驅動程式,以及Ashmem匿名共享記憶體驅動程式,它們在Android系統中被廣泛地使用。在此篇中,我們分別在第4章、第5章和第6章分析Logger日誌系統、Binder進程間通信系統和Ashmem共享記憶體系統的實現原理,為後面深入分析Android應用程式的框架打下良好的基礎。

Android應用程式框架篇包含十個章節的內容。我們知道,在移動平台中,Android系統、iOS系統和Windows Phone系統正在形成三足鼎立之勢,誰的應用程式更豐富、質量更高、用戶體驗更好,誰就能取得最終的勝利。因此,每個平台都在盡最大努力吸引第三方開發者來為其開發應用程式。這就要求平台必須提供良好的應用程式架構,以便第三方開發者可以將更多的精力集中在應用程式的業務邏輯上,從而開發出數量更多、質量更高和用戶體驗更好的應用程式。在此篇中,我們將從組件、進程、訊息和安裝四個維度來分析Android應用程式的實現框架。第7章到第10章分析Android應用程式四大組件Activity、Service、Broadcast Receiver和Content Provider的實現原理;第11章和第12章分析Android應用程式進程的啟動過程;第13章到第15章分析Android應用程式的訊息處理機制;第16章分析Android應用程式的安裝和顯示過程。學習了這些知識之後,我們就可以掌握Android系統的精髓了。

本書特點

本書從初學者的角度出發,結合具體的使用情景,在縱向和橫向上對Android系統的原始碼進行了全面、深入、細緻的分析。在縱向上,採用從下到上的方式,分析的原始碼涉及了Android系統的核心層(Linux Kernel)、硬體抽象層(HAL)、運行時庫層(Runtime)、應用程式框架層(Application Framework)以及應用程式層(Application),這有利於讀者從整體上掌握Android系統的架構。在橫向上,從Android應用程式的組件、進程、訊息以及安裝四個角度出發,全面地剖析了Android系統的應用程式框架層,這有利於讀者深入地理解Android應用程式的架構以及運行原理。

目錄

第1篇初識Android系統

第1章 準備知識................................................................ 2

1.1 Linux核心參考書籍.................................................. 2

1.2 Android應用程式參考書籍....................................... 3

1.3 下載、編譯和運行Android原始碼........................... 3

1.3.1 下載Android原始碼........................................... 4

1.3.2 編譯Android原始碼........................................... 4

1.3.3 運行Android模擬器........................................... 5

1.4 下載、編譯和運行Android核心原始碼............................................................ 6

1.4.1 下載Android核心原始碼................................... 6

1.4.2 編譯Android核心原始碼................................... 7

1.4.3 運行Android模擬器........................................... 8

1.5 開發第一個Android應用程式................................... 8

1.6 單獨編譯和打包Android應用程式模組.......................................................... 11

1.6.1 導入單獨編譯模組的mmm命令............................................................... 11

1.6.2 單獨編譯Android應用程式模組............................................................... 12

1.6.3 重新打包Android系統鏡像檔案............................................................... 12

第2章 硬體抽象層....................................................... 13

2.1 開發Android硬體驅動程式..................................... 14

2.1.1 實現核心驅動程式模組.................................. 14

2.1.2 修改核心Kconfig檔案...................................... 21

2.1.3 修改核心Makefile檔案..................................... 22

2.1.4 編譯核心驅動程式模組.................................. 22

2.1.5 驗證核心驅動程式模組.................................. 23

2.2 開發C可執行程式驗證Android硬體驅動程式............................................... 24

2.3 開發Android硬體抽象層模組................................. 26

2.3.1 硬體抽象層模組編寫規範............................... 26

2.3.2 編寫硬體抽象層模組接口............................... 29

2.3.3 硬體抽象層模組的載入過程........................... 33

2.3.4 處理硬體設備訪問許可權問題........................... 36

2.4 開發Android硬體訪問服務..................................... 38

2.4.1 定義硬體訪問服務接口.................................. 38

2.4.2 實現硬體訪問服務.......................................... 39

2.4.3 實現硬體訪問服務的JNI方法.......................... 40

2.4.4 啟動硬體訪問服務.......................................... 43

2.5 開發Android應用程式來使用硬體訪問服務.................................................. 44

第3章 智慧型指針............................................................... 49

3.1 輕量級指針............................................................. 50

3.1.1 實現原理分析................................................ 50

3.1.2 套用實例分析................................................ 53

3.2 強指針和弱指針..................................................... 54

3.2.1 強指針的實現原理分析.................................. 55

3.2.2 弱指針的實現原理分析.................................. 61

3.2.3 套用實例分析................................................ 67

第2篇Android專用驅動系統

第4章 Logger日誌系統............................................. 74

4.1 Logger日誌格式....................................................... 75

4.2 Logger日誌驅動程式.............................................. 76

4.2.1 基礎數據結構................................................ 77

4.2.2 日誌設備的初始化過程.................................. 78

4.2.3 日誌設備檔案的打開過程............................... 83

4.2.4 日誌記錄的讀取過程...................................... 84

4.2.5 日誌記錄的寫入過程...................................... 88

4.3 運行時庫層日誌庫................................................. 93

4.4 C/C++日誌寫入接口............................................. 100

4.5 Java日誌寫入接口................................................ 104

4.6 Logcat工具分析..................................................... 110

4.6.1 基礎數據結構.............................................. 111

4.6.2 初始化過程.................................................. 115

4.6.3 日誌記錄的讀取過程.................................... 127

4.6.4 日誌記錄的輸出過程.................................... 132

第5章 Binder進程間通信系統............................... 144

5.1 Binder驅動程式..................................................... 145

5.1.1 基礎數據結構.............................................. 146

5.1.2 Binder設備的初始化過程.............................. 164

5.1.3 Binder設備檔案的打開過程.......................... 165

5.1.4 Binder設備檔案的記憶體映射過程............................................................ 166

5.1.5 核心緩衝區管理........................................... 173

5.2 Binder進程間通信庫............................................. 183

5.3 Binder進程間通信套用實例................................. 188

5.4 Binder對象引用計數技術..................................... 196

5.4.1 Binder本地對象的生命周期.......................... 197

5.4.2 Binder實體對象的生命周期.......................... 201

5.4.3 Binder引用對象的生命周期.......................... 204

5.4.4 Binder代理對象的生命周期.......................... 209

5.5 Binder對象死亡通知機制..................................... 212

5.5.1 註冊死亡接收通知........................................ 213

5.5.2 傳送死亡接收通知........................................ 216

5.5.3 註銷死亡接收通知........................................ 221

5.6 Service Manager的啟動過程.................................. 224

5.6.1 打開和映射Binder設備檔案.......................... 226

5.6.2 註冊為Binder上下文管理者.......................... 227

5.6.3 循環等待Client進程請求............................... 231

5.7 Service Manager代理對象的獲取過程........................................................... 238

5.8 Service組件的啟動過程........................................ 244

5.8.1 註冊Service組件............................................ 245

5.8.2 啟動Binder執行緒池......................................... 289

5.9 Service代理對象的獲取過程................................ 291

5.10 Binder進程間通信機制的Java接口............................................................. 300

5.10.1 Service Manager的Java代理對象的獲取過程.......................................... 300

5.10.2 Java服務接口的定義和解析.................................................................. 310

5.10.3 Java服務的啟動過程.................................... 313

5.10.4 Java服務代理對象的獲取過程.............................................................. 320

5.10.5 Java服務的調用過程.................................... 323

第6章 Ashmem匿名共享記憶體系統.............................................................. 327

6.1 Ashmem驅動程式................................................. 328

6.1.1 基礎數據結構.............................................. 328

6.1.2 匿名共享記憶體設備的初始化過程........................................................... 330

6.1.3 匿名共享記憶體設備檔案的打開過程....................................................... 332

6.1.4 匿名共享記憶體設備檔案的記憶體映射過程................................................ 334

6.1.5 匿名共享記憶體塊的鎖定和解鎖過程....................................................... 336

6.1.6 匿名共享記憶體塊的回收過程.................................................................. 344

6.2 運行時庫cutils的匿名共享記憶體訪問接口.................................................... 345

6.3 匿名共享記憶體的C++訪問接口............................. 349

6.3.1 MemoryHeapBase......................................... 349

6.3.2 MemoryBase................................................. 359

6.3.3 套用實例..................................................... 364

6.4 匿名共享記憶體的Java訪問接口............................. 370

6.4.1 MemoryFile.................................................. 370

6.4.2 套用實例..................................................... 375

6.5 匿名共享記憶體的共享原理.................................... 386

第3篇Android應用程式框架

第7章 Activity組件的啟動過程............................. 392

7.1 Activity組件套用實例............................................ 392

7.2 根Activity組件的啟動過程.................................... 398

7.3 子Activity組件在進程內的啟動過程............................................................ 432

7.4 子Activity組件在新進程中的啟動過程........................................................ 440

第8章 Service組件的啟動過程............................ 443

8.1 Service組件套用實例............................................. 443

8.2 Service組件在新進程中的啟動過程............................................................. 451

8.3 Service組件在進程內的綁定過程................................................................. 463

第9章 Android系統廣播機制................................. 486

9.1 廣播機制套用實例............................................... 487

9.2 廣播接收者的註冊過程........................................ 493

9.3 廣播的傳送過程................................................... 501

第10章 Content Provider組件的實現原理................................................. 524

10.1 Content Provider組件套用實例........................... 525

10.1.1 ArticlesProvider........................................... 525

10.1.2 Article......................................................... 535

10.2 Content Provider組件的啟動過程................................................................ 550

10.3 Content Provider組件的數據共享原理........................................................ 573

10.3.1 數據共享模型............................................. 573

10.3.2 數據傳輸過程............................................. 576

10.4 Content Provider組件的數據更新通知機制................................................ 596

10.4.1 註冊內容觀察者.......................................... 597

10.4.2 傳送數據更新通知...................................... 603

第11章 Zygote和System進程的啟動過程................................................. 611

11.1 Zygote進程的啟動腳本........................................ 611

11.2 Zygote進程的啟動過程........................................ 614

11.3 System進程的啟動過程....................................... 622

第12章 Android應用程式進程的啟動過程................................................. 630

12.1 應用程式進程的創建過程.................................. 630

12.2 Binder執行緒池的啟動過程................................... 639

12.3 訊息循環的創建過程.......................................... 641

第13章 Android應用程式的訊息處理機制................................................. 645

13.1 創建執行緒訊息佇列............................................. 645

13.2 執行緒訊息循環過程............................................. 650

13.3 執行緒訊息傳送過程............................................. 655

13.4 執行緒訊息處理過程............................................. 660

第14章 Android應用程式的鍵盤訊息處理機制....................................... 667

14.1 鍵盤訊息處理模型............................................. 667

14.2 InputManager的啟動過程.................................... 670

14.2.1 創建InputManager...................................... 670

14.2.2 啟動InputManager...................................... 673

14.2.3 啟動InputDispatcher.................................... 675

14.2.4 啟動InputReader........................................ 677

14.3 InputChannel的註冊過程..................................... 688

14.3.1 創建InputChannel....................................... 689

14.3.2 註冊Server端InputChannel........................... 697

14.3.3 註冊系統當前激活的應用程式視窗..................................................... 701

14.3.4 註冊Client端InputChannel........................... 706

14.4 鍵盤訊息的分發過程.......................................... 709

14.4.1 InputReader獲得鍵盤事件........................... 710

14.4.2 InputDispatcher分發鍵盤事件............................................................... 717

14.4.3 系統當前激活的應用程式視窗獲得鍵盤訊息....................................... 727

14.4.4 InputDispatcher獲得鍵盤事件處理完成通知......................................... 743

14.5 InputChannel的註銷過程..................................... 746

14.5.1 銷毀應用程式視窗...................................... 747

14.5.2 註銷Client端InputChannel........................... 756

14.5.3 註銷Server端InputChannel........................... 758

第15章 Android應用程式執行緒的訊息循環模型....................................... 764

15.1 應用程式主執行緒訊息循環模型.......................... 765

15.2 與界面無關的應用程式子執行緒訊息循環模型.......................................... 766

15.3 與界面相關的應用程式子執行緒訊息循環模型.......................................... 769

第16章 Android應用程式的安裝和顯示過程............................................ 778

16.1 應用程式的安裝過程......................................... 778

16.2 應用程式的顯示過程.......................................... 814

相關詞條

熱門詞條

聯絡我們