前言:
本書主要內容及特色
本書是筆者“深入理解Android”系列的第二本,這一本將關注重點放在了Android Framework的Java層。在眾多可供分析的知識點中,筆者另辟蹊徑,選擇了SystemServer中的服務(Service)作為主人公。這些Service大體可由圖1來表示。
圖1 SystemServer中的服務
由圖1可知,SystemServer中的服務可劃分為7大類共43項(包括Watchdog在內):
位于第一大類的是Android的核心服務,如ActivityManagerService、WindowManager-Service等。
位于第二大類的是和通信相關的服務,如Wifi的相關服務、Telephone的相關服務。
位于第三大類的是和系統功能相關的服務,如AudioService、MountService、UsbService等。
位于第四大類的是BatteryService、VibratorService等服務。
位于第五大類的是EntropyService、DiskStatsService、Watchdog等相對獨立的服務。
位于第六大類的是藍牙服務。
位于第七大類的是UI方面的服務,如狀態欄服務、通知管理服務等。
以上這些服務就是Android Framework Java層的核心。毫不夸張地說,它們也是Android系統的基石。另外,這些服務的內容遠非一本書所能囊括。作為Android Java層Framework分析的先頭部隊,本書涵蓋了以下內容:
第1章,介紹了閱讀本書需要做的一些準備工作,包括Android 4.0源碼的下載和編譯、Eclipse開發環境的搭建,以及Android系統進程(system_process)的調試等。
第2章,介紹了Java Binder和MessageQueue的實現。
第3章,介紹了SystemServer,并分析了圖1中第五類包含的服務的工作原理。這些服務包括EntropyService、DropBoxManagerService、DiskStatsService、DeviceStorageMonitorService、SamplingProfilerService和ClipboardService。
第4章,分析了PackageManagerService,該服務負責Android系統中的Package信息查詢和APK安裝、卸載、更新等方面的工作。
第5章,講解了PowerManagerService,它是Android中電源管理的核心服務。本章對其中的WakeLock、Power按鍵處理、BatteryStatsService和BatteryService都做了一番較為深入的分析。
第6章,以ActivityManagerService為分析重點,該服務是Android 的核心服務。本章對ActivityManagerService的啟動、Activity的創建和啟動、BroadcastReceiver的工作原理、Android中的進程管理等內容進行了較為深入的研究。
第7章,對ContentProvider的創建和啟動、SQLite相關知識、Cursor query和close的實現等進行了較為深入的分析。
第8章,以ContentService和AccountManagerService為分析對象,介紹了數據更新通知機制的實現、賬戶管理和數據同步等方面的知識。
圖1中的其他服務將會在“深入理解Android”系列的其他書中詳細分析。該系列書的規劃請見本書最后面的“深入理解Android系列圖書路線圖”。
本書以直接剖析源碼的方式進行講解,旨在引領讀者一步步深入于Android系統中相關模塊的內部原理,去理解它們是如何實現、如何工作的。在分析過程中,筆者根據個人研究Android代碼的心得,采用了精簡流程和逐個擊破的方法。同時,筆者還提出了一些難度不大的知識點、相關的補充閱讀資料,甚至筆者在實際項目中遇到的開放式問題,留給讀者自行研究和探討。總之,筆者希望讀者在閱讀完本書后,至少能有以下兩個收獲:
能從“基于Android并高于Android”的角度來看待和分析Android。
能初步具有大型復雜代碼的分析能力。
讀者對象
適合閱讀本書的讀者包括:
(1)Android應用開發工程師
雖然應用開發工程師平常接觸的多是Android SDK,但是只有更深入地理解了Android系統運行原理,才能寫出更健壯、更高效的模塊。
(2)Android系統開發工程師
系統開發工程師常常需要深入理解系統的運轉過程,而本書所涉及的內容正是他們在工作和學習中最想了解的。那些對具體服務(如ActivityManagerService、PackageManagerService)感興趣的讀者,也可以單刀直入,閱讀本書相關章節。
(3)對Android系統運行原理感興趣的讀者
這部分讀者需要具有基本的Android開發知識基礎。
如何閱讀本書
本書是針對Android源碼進行分析的,而源碼文件所在的路徑一般都很長,例如,文件AndroidRuntime.cpp的真實路徑是frameworks/base/core/jni/AndroidRuntime.cpp。為了行文方便,在各章節開頭,均把本章涉及的源碼路徑全部列出,而在具體分析源碼時,則只列出該源碼的文件名。例如:
[-->AndroidRuntime.cpp]
//這里是源碼和一些注釋
另外,本書在描述類之間的關系及函數調用流程上,使用了UML的靜態類圖及序列圖。UML是一個強大的工具,但它的建模規范過于煩瑣,為更簡單清晰地描述事情的本質,本書并未完全遵循UML的建模規范。這里僅舉一例,如圖2所示。
圖2 UML示例圖
在圖2中:
外部類內部的方框用于表示內部類。另外,“外部類A.內部類B”也用于表示內部類。
接口和普通類用同一種框圖表示。
本書所使用的UML圖都比較簡單,讀者不必花費大量時間專門學習UML。
這里有必要提醒一下,要閱讀此書,應具有Java基本知識。
另外,本書和《深入理解Android 卷I》(簡稱“卷I”)部分章節有一定聯系,主要集中在Binder和MessageQueue部分。讀者可將“卷I中”這部分內容作為補充閱讀資料來學習。卷I部分內容的電子版下載地址為: http://download.csdn.net/detail/hzbooks/3677793。
本書涉及的Android 4.0源碼以及一些開發工具的下載地址為:http://115.com/folder/fauqpj0t#Android-ICS-SOURCE-CODE。
勘誤和支持
由于作者的水平有限,加之寫作時間倉促,書中難免會出現一些錯誤或不準確的地方,懇請讀者批評和指正。若有問題,可通過郵箱或在博客上留言與筆者共同討論。筆者的聯系方式是:
郵箱:fanping.deng@gmail.com
博客:blog.csdn.net/innost、cnblogs.net/innost和http://my.oschina.net/innost/blog
致謝
本書即將付梓!首先要感謝楊福川編輯的大力支持。另外,要感謝本書的審稿編輯姜影。
再一次感謝我所在的中科創達(ThunderSoft)公司。有幸工作在這樣一個互相信任、互相鼓勵、平等和開放式的環境中,我才能完成本書。公司領導所給予的機會和挑戰,時時鞭策著我保持虛心學習的心態。此外,我所在團隊的各位同仁也給予了我不少支持和幫助。本書出版之日,將是我們團隊為之努力奮斗的Android系統高效、穩定運行于客戶手機之時!
一如既往地感謝妻子和家人,他們是我奮斗的動力。
謝謝在人生和職業道路上曾給予我指導的諸位師長。
當然,最應感謝的還是肯花費寶貴時間和精力關注本書的讀者,你們的意見和建議,將會使我獲得巨大的精神財富!
鄧凡平 于北京, 中科創達(ThunderSoft)公司