#### 回顧
今天是一個值得高興的日子。歷經兩年多的艱苦奮斗,張大偉同學的這本著作,同時也是隸屬“深入理解Android”系列三卷中的最后一卷終于完成了。從2011年我和華章公司的楊福川編輯一起開創這一迄今為止國內Android技術書籍市場上唯一一套兼具廣度和深度的“深入理解Android”系列書籍算起,四個年頭已經過去。在這四年中,本套書籍的作者們和出版社的編輯們共同奮斗,成果斐然:
- 2011年9月《深入理解Android 卷I》發布。
- 2012年8月《深入理解Android 卷II》發布。
- 2013年1月,本系列的第一本專題卷《深入理解Android:Telephony原理剖析與最佳實踐》發布,作者是楊青平。
- 2014年4月,本系列的第二本專題卷《深入理解Android:Wi-Fi,NFC和GPS卷》發布。
- 2015年,《深入理解Android 卷III》發布,作者即是本書的主人公張大偉。
- 2015年及以后,我們還要發布深入理解Android系列書籍中的WebKit專題卷、自動化測試卷、藍牙專題卷等。
從技術層面來說,本書填補了深入理解Android Framework卷中的一個主要空白,即Android Framework中和UI相關的部分。在一個特別講究顏值的時代,本書分析了Android 4.2中WindowManagerService、ViewRoot、Input系統、StatusBar、Wallpaper等重要“顏值繪制/處理”模塊。雖然在寫書的兩年中,Android版本已經從4.2進化到M,但“面雖新,神依在”。所以,我可以很負責任地說,對那些掌握了本書精髓的讀者而言,即使Android未來升級到了X,那也只不過是換了一個馬甲罷了。
#### 展望
我在卷II中曾經詳細闡述過“深入理解Android”這一系列的路線圖(http://blog.csdn.net/innost/article/details/7648869), 這里在展現一下當時的情況。
:-:

本套叢書大體分為應用部分、Framework部分、專題部分和內核部分。
1)應用部分。這部分擬以Android源碼中自帶的那些應用程序為分析目標,充分展示Google在自家SDK平臺上做應用開發的深厚功力。這些應用包括Contacts、Gallery2、Mms、Browser等,它們的分析難度都不可小覷。通過對這些系出名門的應用的分析,我們希望讀者不僅能把握商業級應用程序開發的精髓,而能更精熟地掌握Android應用開發的各種技能。
2)Framework部分。關注Android的框架,包括三本書。
- 卷I:以Native層Framework模塊為分析對象。知識點包括init、binder、zygote、jni、Message和Handler、audio系統、surface系統、vold、rild和mediascanner。本書已于2011年9月出版,雖然是基于Android 2.2,讀者如若扎實地掌握并理解了其中的內容,那么以后再研究2.3或4.0版本中對應的模塊,也是輕而易舉之事了。
- 卷II和卷III:以Java層Framework模塊為分析對象。卷II基于4.0.1版,包括UI相關服務和Window系統之外的一些重要服務,如PackageManagerService、ActivityManagerService、PowerManagerService、ContentService、ContentProvider等。而的卷III將以輸入系統、WindowManagerService、UI相關服務為主要目標。
Framework部分所包括的這3本書的目的是讓讀者對整個Android系統有較大廣度、一定深度的認識,這有益于讀者能構建一個更為完整的Android系統知識結構。應當指出,這3本書不可能覆蓋Android Framework中的所有知識點。因此,尚需讀者在此基礎上,結合不同需求,進行進一步的深入研究。
3)專題部分。旨在幫助讀者沿著Android平臺中的某一些專業方向,進行深度挖掘,擬規劃如下專題:
- Telephony專題,涵蓋SystemServer中相關的通信服務、rild、短信、電話等模塊。
- 多媒體專題,涵蓋MultiMedia相關的模塊,包括Stagefright、OMX等。另外,我們也打算引入開源世界中最流行的一些編解碼引擎和播放引擎作為分析對象。
- 瀏覽器和Webkit專題,該專題難度非常大,但其重要性卻不言而喻。
- Dalvik虛擬機專題,該專題希望對Dalvik進行一番深度研究,涉及面包括Java虛擬機的實現、Android的一些特殊定制等內容。現在來看,Dalvik已經被ART替換,所以這本書的目標就應該是ART虛擬機專題了。
- Android系統安全專題,該專題的目標是,分析Android系統上提供的安全方面的控制機制。另外,Linux平臺上的一些常用安全機制(例如,文件系統加密等)也是本書所要考慮的。這套安全專題我已經在自己的博客[①]上寫了部分內容,包括Java Security、設備加密等。
- UI/UE設計以及心理學專題,:該專題希望能提供一些心理學方面的指導以及具體的UI/UE設計方面的指南以幫助開發人員開發出更美、更體貼和更方便的應用。
專題部分隱含著的一個極為重要的宗旨:即基于Android,而高于Android。換言之,這些書籍雖都以Android為切入點,但我們更希望讀者學到的知識、掌握的技術卻不局限于Android平臺。
4) 內核部分。這部分圖書擬以Linux內核為主。雖然這方面的經典教材非常多,但要么是諸如《Linux內核情景分析》之類的鴻篇巨帙,要么是類似《Linux內核設計與實現》,內容過于簡潔。另外,現有書籍使用的內核源碼都已比較陳舊。為此,我們希望能有一本難度適中、知識面較廣、深度適宜的書籍。
今天,正是由于大偉的努力,我們的Framework部分得以完美收官。高興的同時,我們認為前路依然艱辛。在此,我和福川兄再次誠摯邀請國內外有熱情,愿分享、有責任心的兄弟姐妹們來一起繼續發揚光大“深入理解Android”這一系列書籍。
還是楊瀾的那句話,“原來我只佩服成功的人,現在我更尊敬那些正在努力的人”。讓我們一起成為被尊敬的人吧!
#### 內容簡介
《深入理解Android(卷3)》是Android經典暢銷書系“深入理解Android”系列Framework卷的第III卷,從源代碼的角度,對Android系統的Audio和UI兩大功能的相關模塊的實現原理和工作機制做了系統且詳細的分析,填補了市場的空白。
《深入理解Android(卷3)》在邏輯上分為4個部分:
Part 01(第1~2章):這是本書的基礎部分,首先介紹了Android源碼環境的搭建、編譯和調試;然后講解了Android進程間通信與任務調度的工具Binder與MessageQueue。這兩項基礎工作是深入研究Android前必須做的功課。
Part 02(第3章):詳細分析了AudioService服務的實現,包括音量管理、音頻外設管理、AudioFocus機制的實現等內容。
Part 03(第4~6章):這是本書的核心內容之一,詳細分析了Android UI的通用實現,依次剖析了WindowManagerService、Android輸入系統、Android控件系統的工作原理。
Part 04(第7~8章):主要分析了SystemUI和Android壁紙相關服務的實現,包括StatusBarManagerService與NotificationManagerService兩個系統服務,以及WallpaperManagerService系統服務、動態壁紙與靜態壁紙的工作原理等內容。
除此之外,在對海量的Android源代碼進行分析的過程中,本書盡可能地對其中的精妙之處進行了分析和解讀,目的是希望幫助讀者領悟其中的優秀設計思想和方法。
- 前言
- 推薦序
- 第1章 開發環境部署
- 1.1獲取Android源代碼
- 1.2Android的編譯
- 1.3在IDE中導入Android源代碼
- 1.3.1將Android源代碼導入Eclipse
- 1.3.2將Android源代碼導入SourceInsight
- 1.4調試Android源代碼
- 1.4.1使用Eclipse調試Android Java源代碼
- 1.4.2使用gdb調試Android C/C 源代碼
- 1.5本章小結
- 第2章 深入理解Java Binder和MessageQueue
- 2.1概述
- 2.2Java層中的Binder分析
- 2.2.1Binder架構總覽
- 2.2.2初始化Java層Binder框架
- 2.2.3窺一斑,可見全豹乎
- 2.2.4理解AIDL
- 2.2.5Java層Binder架構總結
- 2.3心系兩界的MessageQueue
- 2.3.1MessageQueue的創建
- 2.3.2提取消息
- 2.3.3nativePollOnce函數分析
- 2.3.4MessageQueue總結
- 2.4本章小結
- 第3章 深入理解AudioService
- 3.1概述
- 3.2音量管理
- 3.2.1音量鍵的處理流程
- 3.2.2通用的音量設置函數setStreamVolume()
- 3.2.3靜音控制
- 3.2.4音量控制小結
- 3.3音頻外設的管理
- 3.3.1 WiredAccessoryObserver 設備狀態的監控
- 3.3.2AudioService的外設狀態管理
- 3.3.3音頻外設管理小結
- 3.4AudioFocus機制的實現
- 3.4.1AudioFocus簡單的例子
- 3.4.2AudioFocus實現原理簡介
- 3.4.3申請AudioFocus
- 3.4.4釋放AudioFocus
- 3.4.5AudioFocus小結
- 3.5AudioService的其他功能
- 3.6本章小結
- 第4章 深入理解WindowManager-Service
- 4.1初識WindowManagerService
- 4.1.1一個從命令行啟動的動畫窗口
- 4.1.2WMS的構成
- 4.1.3初識WMS的小結
- 4.2WMS的窗口管理結構
- 4.2.1理解WindowToken
- 4.2.2理解WindowState
- 4.2.3理解DisplayContent
- 4.3理解窗口的顯示次序
- 4.3.1主序、子序和窗口類型
- 4.3.2通過主序與子序確定窗口的次序
- 4.3.3更新顯示次序到Surface
- 4.3.4關于顯示次序的小結
- 4.4窗口的布局
- 4.4.1從relayoutWindow()開始
- 4.4.2布局操作的外圍代碼分析
- 4.4.3初探performLayoutAndPlaceSurfacesLockedInner()
- 4.4.4布局的前期處理
- 4.4.5布局DisplayContent
- 4.4.6布局的階段
- 4.5WMS的動畫系統
- 4.5.1Android動畫原理簡介
- 4.5.2WMS的動畫系統框架
- 4.5.3WindowAnimator分析
- 4.5.4深入理解窗口動畫
- 4.5.5交替運行的布局系統與動畫系統
- 4.5.6動畫系統總結
- 4.6本章小結
- 第5章 深入理解Android輸入系統
- 5.1初識Android輸入系統
- 5.1.1getevent與sendevent工具
- 5.1.2Android輸入系統簡介
- 5.1.3IMS的構成
- 5.2原始事件的讀取與加工
- 5.2.1基礎知識:INotify與Epoll
- 5.2.2 InputReader的總體流程
- 5.2.3 深入理解EventHub
- 5.2.4 深入理解InputReader
- 5.2.5原始事件的讀取與加工總結
- 5.3輸入事件的派發
- 5.3.1通用事件派發流程
- 5.3.2按鍵事件的派發
- 5.3.3DispatcherPolicy與InputFilter
- 5.3.4輸入事件的派發總結
- 5.4輸入事件的發送、接收與反饋
- 5.4.1深入理解InputChannel
- 5.4.2連接InputDispatcher和窗口
- 5.4.3事件的發送
- 5.4.4事件的接收
- 5.4.5事件的反饋與發送循環
- 5.4.6輸入事件的發送、接收與反饋總結
- 5.5關于輸入系統的其他重要話題
- 5.5.1輸入事件ANR的產生
- 5.5.2 焦點窗口的確定
- 5.5.3以軟件方式模擬用戶操作
- 5.6本章小結
- 第6章 深入理解控件系統
- 6.1 初識Android的控件系統
- 6.1.1 另一種創建窗口的方法
- 6.1.2 控件系統的組成
- 6.2 深入理解WindowManager
- 6.2.1 WindowManager的創建與體系結構
- 6.2.2 通過WindowManagerGlobal添加窗口
- 6.2.3 更新窗口的布局
- 6.2.4 刪除窗口
- 6.2.5 WindowManager的總結
- 6.3 深入理解ViewRootImpl
- 6.3.1 ViewRootImpl的創建及其重要的成員
- 6.3.2 控件系統的心跳:performTraversals()
- 6.3.3 ViewRootImpl總結
- 6.4 深入理解控件樹的繪制
- 6.4.1 理解Canvas
- 6.4.2 View.invalidate()與臟區域
- 6.4.3 開始繪制
- 6.4.4 軟件繪制的原理
- 6.4.5 硬件加速繪制的原理
- 6.4.6 使用繪圖緩存
- 6.4.7 控件動畫
- 6.4.8 繪制控件樹的總結
- 6.5 深入理解輸入事件的派發
- 6.5.1 觸摸模式
- 6.5.2 控件焦點
- 6.5.3 輸入事件派發的綜述
- 6.5.4 按鍵事件的派發
- 6.5.5 觸摸事件的派發
- 6.5.6 輸入事件派發的總結
- 6.6 Activity與控件系統
- 6.6.1 理解PhoneWindow
- 6.6.2 Activity窗口的創建與顯示
- 6.7 本章小結
- 第7章 深入理解SystemUI
- 7.1 初識SystemUI
- 7.1.1 SystemUIService的啟動
- 7.1.2 狀態欄與導航欄的創建
- 7.1.3 理解IStatusBarService
- 7.1.4 SystemUI的體系結構
- 7.2 深入理解狀態欄
- 7.2.1 狀態欄窗口的創建與控件樹結構
- 7.2.2 通知信息的管理與顯示
- 7.2.3 系統狀態圖標區的管理與顯示
- 7.2.4 狀態欄總結
- 7.3 深入理解導航欄
- 7.3.1 導航欄的創建
- 7.3.2 虛擬按鍵的工作原理
- 7.3.3 SearchPanel
- 7.3.4 關于導航欄的其他話題
- 7.3.5 導航欄總結
- 7.4 禁用狀態欄與導航欄的功能
- 7.4.1 如何禁用狀態欄與導航欄的功能
- 7.4.2 StatusBarManagerService對禁用標記的維護
- 7.4.3 狀態欄與導航欄對禁用標記的響應
- 7.5 理解SystemUIVisibility
- 7.5.1 SystemUIVisibility在系統中的漫游過程
- 7.5.2 SystemUIVisibility發揮作用
- 7.5.3 SystemUIVisibility總結
- 7.6 本章小結
- 第8章 深入理解Android壁紙
- 8.1 初識Android壁紙
- 8.2深入理解動態壁紙
- 8.2.1啟動動態壁紙的方法
- 8.2.2壁紙服務的啟動原理
- 8.2.3 理解UpdateSurface()方法
- 8.2.4 壁紙的銷毀
- 8.2.5 理解Engine的回調
- 8.3 深入理解靜態壁紙-ImageWallpaper
- 8.3.1 獲取用作靜態壁紙的位圖
- 8.3.2 靜態壁紙位圖的設置
- 8.3.3 連接靜態壁紙的設置與獲取-WallpaperObserver
- 8.4 WMS對壁紙窗口的特殊處理
- 8.4.1 壁紙窗口Z序的確定
- 8.4.2 壁紙窗口的可見性
- 8.4.3 壁紙窗口的動畫
- 8.4.4 壁紙窗口總結
- 8.5 本章小結