本節將介紹如何利用Eclipse來調試Android Java Framework的核心進程SystemServer。
1. 配置Eclipse
首先要下載Android SDK。下載地址為[http://developer.android.com/sdk/index.html](http://developer.android.com/sdk/index.html)
在Linux環境下,該網站截圖如圖1-6所示。
:-: 
圖1-6 AndroidSDK下載網頁示意圖
筆者下載的是Linux系統上的SDK。解壓后的位置在/thunderst/disk/anroid/android-sdk-linux_x86下。
然后要為Eclipse安裝ADT插件(Android Development Tools),步驟如下。
- 單擊Eclipse菜單欄Help->Install New Software,輸入Android ADT下載地址:https://dl-ssl.google.com/android/eclipse/, 然后安裝其中的所有組件,并重啟Eclipse。
- 單擊Eclipse菜單欄Preferences->Android一欄,在右邊的SDK Location中輸入剛才解壓SDK后得到的目錄,即筆者設置的/thunderst/disk/anroid/android-sdk-linux_x86,最終結果如圖1-7所示。
:-: 
圖1-7 SDK安裝示意圖
- 單擊Eclipse菜單欄Window->Android SDK Manager,彈出一個對話框,如圖1-8所示。
:-: 
圖1-8 Android SDK Manager對話框
在圖1-8中選擇下載其中的Tools和對應版本的SDK文檔、鏡像文件、開發包等。有條件的讀者可以將Android 4.0.3和4.0對應的內容及Tools全部下載過來。
2. 使用Coffee Bytes Java插件
Coffee BytesJava是Eclipse的一個插件,用于對代碼進行折疊,其功能比Eclipse自帶的代碼折疊功能強大多了。對于大段代碼的研究,該插件的作用功不可沒。此插件的安裝和配置步驟如下:
- 單擊Eclipse菜單欄Help->Install New Software,在彈出的對話框中輸入[http://eclipse.realjenius.com/update-site](http://eclipse.realjenius.com/update-site) ,選擇安裝這個插件即可。
- 單擊Eclipse菜單欄Window->Preference,在左上角輸入Folding進行搜索,結果如圖1-9所示。
:-: 
圖1-9 Coffee Bytes Java 插件配置
在圖1-9所示的對話框中,要先打開Enablefolding選項,然后從Select foldingto use框中選擇CoffeeBytes Java Folding。圖1-9右下部分的勾選框用來配置此插件的代碼折疊功能。讀者不妨按照圖1-9所示來配置它。使用該插件后的示意圖如圖1-10所示。
如果不關心else if分支,就可以把這段代碼折疊起來
:-: 
圖1-10 Coffee Bytes Java插件的使用示例
從圖1-10中可看到,使用該插件后,基本上代碼中所有分支都可以折疊起來,該功能將幫助開發人員集中精力關注自己所關心的分支。
3. 導入Android源碼
注意,這一步必須編譯完整個Android源碼才可以實施,步驟如下:
· 復制Android源碼目錄/development/ide/eclipse/.classpath到Android源碼根目錄。
· 打開Andriod源碼根目錄下的.classpath文件。該文件是供Eclipse使用的,其中保存的是源碼目錄中各個模塊的路徑。由于我們只關心Framework相關的模塊,因此可以把一些不是Framework的目錄從該文件中注釋掉。同時,去掉不必要的模塊也可加快Android源碼導入速度。圖1-11所示為該文件的部分內容。
:-: 
圖1-11.classpath文件部分文件內容
另外,一些不必要的模塊會導致后續在Eclipse中Android源碼編譯失敗。筆者共享了一個.classpath文件,讀者可從[http://download.csdn.net/detail/innost/4247578](http://download.csdn.net/detail/innost/4247578) 下載并直接使用。
單擊Eclipse菜單欄New->Java Project,彈出如圖1-12所示的對話框。設置Location為Android4.0源碼所在路徑。
:-: 
圖1-12 導入Android源碼示意圖
由于Android 4.0源碼文件較多,導入過程會持續較長一段時間,大概10幾分鐘左右。
注意導入源碼前一定要取消Eclipse的自動編譯選項(通過菜單欄Project->BuildProject Automatically設置)。另外,源碼導入完畢后,讀者千萬不要清理(clean)這個工程。清理會刪除之前源碼編譯所生成的文件,導致后續又得重新編譯Android系統了。
4. 創建并運行模擬器
單擊Eclipse菜單欄Window->AVD Manager,創建模擬器,如圖1-13所示。
:-: 
圖1-13 模擬器創建示意圖
模擬器創建完畢后即可啟動它。
5. 調試SystemServer
調試SystemServer的步驟如下:
- 首先編譯Android源碼工程。編譯過程中會有很多警告。如果有錯誤,大部分原因是.classpath文件將不需要的模塊包含了進來。讀者可根據Eclipse的提示做相應處理。筆者配置的幾臺機器基本都是一次配置就成功了。
- 在Android源碼工程上單擊右鍵,依次單擊Debug As->Debug Configurations,彈出如圖1-14所示的對話框,然后從左邊找到RemoteJava Application一欄。
:-: 
圖1-14 Debug配置框示意圖
- 單擊圖1-14中黑框中的新建按鈕,然后按圖1-15中的黑框中的內容來設置該對話框。
:-: 
圖1-15 Remote Java Application配置示意圖
由圖1-15所示,需要選擇Remote調試端口號為8600,Host類型為localhost。8600是SystemServer進程的調試端口號。Eclipse一旦連接到該端口,即可通過JDWP協議來調試SystemServer。
- 配置完畢后,單擊圖1-15右下角的Debug按鈕,即可啟動SystemServer的調試。
圖1-16所示為筆者調試startActivity流程的示意圖。
:-: 
圖1-16 SystemServer調試效果圖
- 前言
- 第1章 搭建Android源碼工作環境
- 1.1 Android系統架構
- 1.2 搭建開發環境
- 1.2.1 下載源碼
- 1.2.2 編譯源碼
- 1.2.3 利用Eclipse調試system_process
- 1.3 本章小結
- 第2章 深入理解Java Binder和MessageQueue
- 2.1 概述
- 2.2 Java層中的Binder架構分析
- 2.2.1 Binder架構總覽
- 2.2.2 初始化Java層Binder框架
- 2.2.3 addService實例分析
- 2.2.4 Java層Binder架構總結
- 2.3 心系兩界的MessageQueue
- 2.3.1 MessageQueue的創建
- 2.3.2 提取消息
- 2.3.3 nativePollOnce函數分析
- 2.3.4 MessageQueue總結
- 2.4 本章小結
- 第3章 深入理解SystemServer
- 3.1 概述
- 3.2 SystemServer分析
- 3.2.1 main函數分析
- 3.2.2 Service群英會
- 3.3 EntropyService分析
- 3.4 DropBoxManagerService分析
- 3.4.1 DBMS構造函數分析
- 3.4.2 dropbox日志文件的添加
- 3.4.3 DBMS和settings數據庫
- 3.5 DiskStatsService和DeviceStorageMonitorService分析
- 3.5.1 DiskStatsService分析
- 3.5.2 DeviceStorageManagerService分析
- 3.6 SamplingProfilerService分析
- 3.6.1 SamplingProfilerService構造函數分析
- 3.6.2 SamplingProfilerIntegration分析
- 3.7 ClipboardService分析
- 3.7.1 復制數據到剪貼板
- 3.7.2 從剪切板粘貼數據
- 3.7.3 CBS中的權限管理
- 3.8 本章小結
- 第4章 深入理解PackageManagerService
- 4.1 概述
- 4.2 初識PackageManagerService
- 4.3 PKMS的main函數分析
- 4.3.1 構造函數分析之前期準備工作
- 4.3.2 構造函數分析之掃描Package
- 4.3.3 構造函數分析之掃尾工作
- 4.3.4 PKMS構造函數總結
- 4.4 APK Installation分析
- 4.4.1 adb install分析
- 4.4.2 pm分析
- 4.4.3 installPackageWithVerification函數分析
- 4.4.4 APK 安裝流程總結
- 4.4.5 Verification介紹
- 4.5 queryIntentActivities分析
- 4.5.1 Intent及IntentFilter介紹
- 4.5.2 Activity信息的管理
- 4.5.3 Intent 匹配查詢分析
- 4.5.4 queryIntentActivities總結
- 4.6 installd及UserManager介紹
- 4.6.1 installd介紹
- 4.6.2 UserManager介紹
- 4.7 本章學習指導
- 4.8 本章小結
- 第5章 深入理解PowerManagerService
- 5.1 概述
- 5.2 初識PowerManagerService
- 5.2.1 PMS構造函數分析
- 5.2.2 init分析
- 5.2.3 systemReady分析
- 5.2.4 BootComplete處理
- 5.2.5 初識PowerManagerService總結
- 5.3 PMS WakeLock分析
- 5.3.1 WakeLock客戶端分析
- 5.3.2 PMS acquireWakeLock分析
- 5.3.3 Power類及LightService類介紹
- 5.3.4 WakeLock總結
- 5.4 userActivity及Power按鍵處理分析
- 5.4.1 userActivity分析
- 5.4.2 Power按鍵處理分析
- 5.5 BatteryService及BatteryStatsService分析
- 5.5.1 BatteryService分析
- 5.5.2 BatteryStatsService分析
- 5.5.3 BatteryService及BatteryStatsService總結
- 5.6 本章學習指導
- 5.7 本章小結
- 第6章 深入理解ActivityManagerService
- 6.1 概述
- 6.2 初識ActivityManagerService
- 6.2.1 ActivityManagerService的main函數分析
- 6.2.2 AMS的 setSystemProcess分析
- 6.2.3 AMS的 installSystemProviders函數分析
- 6.2.4 AMS的 systemReady分析
- 6.2.5 初識ActivityManagerService總結
- 6.3 startActivity分析
- 6.3.1 從am說起
- 6.3.2 AMS的startActivityAndWait函數分析
- 6.3.3 startActivityLocked分析
- 6.4 Broadcast和BroadcastReceiver分析
- 6.4.1 registerReceiver流程分析
- 6.4.2 sendBroadcast流程分析
- 6.4.3 BROADCAST_INTENT_MSG消息處理函數
- 6.4.4 應用進程處理廣播分析
- 6.4.5 廣播處理總結
- 6.5 startService之按圖索驥
- 6.5.1 Service知識介紹
- 6.5.2 startService流程圖
- 6.6 AMS中的進程管理
- 6.6.1 Linux進程管理介紹
- 6.6.2 關于Android中的進程管理的介紹
- 6.6.3 AMS進程管理函數分析
- 6.6.4 AMS進程管理總結
- 6.7 App的 Crash處理
- 6.7.1 應用進程的Crash處理
- 6.7.2 AMS的handleApplicationCrash分析
- 6.7.3 AppDeathRecipient binderDied分析
- 6.7.4 App的Crash處理總結
- 6.8 本章學習指導
- 6.9 本章小結
- 第7章 深入理解ContentProvider
- 7.1 概述
- 7.2 MediaProvider的啟動及創建
- 7.2.1 Context的getContentResolver函數分析
- 7.2.2 MediaStore.Image.Media的query函數分析
- 7.2.3 MediaProvider的啟動及創建總結
- 7.3 SQLite創建數據庫分析
- 7.3.1 SQLite及SQLiteDatabase家族
- 7.3.2 MediaProvider創建數據庫分析
- 7.3.3 SQLiteDatabase創建數據庫的分析總結
- 7.4 Cursor 的query函數的實現分析
- 7.4.1 提取query關鍵點
- 7.4.2 MediaProvider 的query分析
- 7.4.3 query關鍵點分析
- 7.4.4 Cursor query實現分析總結
- 7.5 Cursor close函數實現分析
- 7.5.1 客戶端close的分析
- 7.5.2 服務端close的分析
- 7.5.3 finalize函數分析
- 7.5.4 Cursor close函數總結
- 7.6 ContentResolver openAssetFileDescriptor函數分析
- 7.6.1 openAssetFileDescriptor之客戶端調用分析
- 7.6.2 ContentProvider的 openTypedAssetFile函數分析
- 7.6.3 跨進程傳遞文件描述符的探討
- 7.6.4 openAssetFileDescriptor函數分析總結
- 7.7 本章學習指導
- 7.8 本章小結
- 第8章 深入理解ContentService和AccountManagerService
- 8.1 概述
- 8.2 數據更新通知機制分析
- 8.2.1 初識ContentService
- 8.2.2 ContentResovler 的registerContentObserver分析
- 8.2.3 ContentResolver的 notifyChange分析
- 8.2.4 數據更新通知機制總結和深入探討
- 8.3 AccountManagerService分析
- 8.3.1 初識AccountManagerService
- 8.3.2 AccountManager addAccount分析
- 8.3.3 AccountManagerService的分析總結
- 8.4 數據同步管理SyncManager分析
- 8.4.1 初識SyncManager
- 8.4.2 ContentResolver 的requestSync分析
- 8.4.3 數據同步管理SyncManager分析總結
- 8.5 本章學習指導
- 8.6 本章小結