田海立@CSDN
2012-9-29
本文講解如何在Eclipse中匯入Android原始碼(包括Framework和Application的代碼),然後通過模擬器或真機跟蹤/調試Android的Java代碼,區別於一般基於Android SDK的純應用開發,這裡可以跟蹤/調試Framework中的代碼。
一、準備工作
確保機器上已經安裝並配置下列軟體環境:JDK/ Eclipse / Android SDK / ADT
即,機器上已經安裝了Eclipse下Android應用開發所需的環境。如果還未配置,移步《搭建Windows下Android應用開發環境——Eclipse/Android/ADT》。
另外,為了跟蹤調試Android源碼,你還需要有Android源碼,並有源碼的編譯環境,可以是:
- 虛擬機器環境 虛擬機器中安裝Linux,Linux下編譯Android源碼。此環境下,如果要在宿主機的Eclipse中調試,還需要把Android的源碼路徑共用出來,宿主機可訪問到;
- 有單獨的可編譯Android的網路環境 在你的用戶端的機器上訪問伺服器共用出來的Android的源碼路徑;
- Linux環境下直接通過Eclipse跟蹤調試本機上的Android源碼。
注意:不管哪種工作方式,Android源碼要都是已經編譯過的,且編譯時間採用的是Eng模式(vs User mode)。編譯Android Platform和Kernel的過程,可參考《Ubuntu10.10下編譯Android2.2平台》及《Ubuntu10.10下編譯Android2.2核心》。
二、基本設定
準備工作完畢之後,現在做一些基本的設定。
1. 把Android源碼路徑<Android_ROOT>下的development\ide\eclipse中的.classpath檔案複製到<Android_ROOT>下;
2. 修改Eclipse的設定
修改eclipse.ini檔案,更改下列內容:
-Xms40m-Xmx384m
改為:
-Xms128m-Xmx512m
這裡增大最小Java堆大小到128MB,增大最大Java堆大小到512MB。
三、Eclipse中建立工程
1. File > New > Java Project
2. 輸入項目名
3. 取消Use default location,並在Location中輸入或選擇Android源碼路徑<Android_ROOT>
4. 選擇Next > Finish。會有一個漫長的等待過程
建立的工程可能會有錯誤,根據錯誤提示,加入或者刪除項目中配置的程式包。
四、調試環境配置
1. 右擊剛剛在#3中建立的項目;
2. 選擇:Debug As > Debug Configurations…;
3. 右擊“Remote Java Application”,選擇New。或者直接雙擊“Remote Java Application”建立一個新的Remote Application。
4. 填入Name;Project選擇剛剛建立的項目Android2.3.7;連接埠填寫8700(不一定是8700,到DDMS Perspective下的Device View中看所需的連接埠號碼)。
5. Apply儲存,然後退出。
五、調試
可以通過模擬器或者真機調試。
無論模擬器還是真機,都要:
- 先啟動機器(模擬器啟動,或真機開啟,並通過USB與PC正常串連),也就是要在DDMS Perspective的Devices視圖中看到有機器串連;
- 確保運行中的代碼與你要調試的代碼是一樣的。
假如,我們想要跟蹤鎖屏解鎖的調用情況。
我們知道解鎖的實現是在LockScreen.java的onGrabbedStateChange()函數,運行在system_process進程中。
那麼,
1. 在onGrabbedStateChange()中要調試的地方設定斷點;
2. 在Device View中,選中system_process,並點擊小爬蟲表徵圖;
3. 用Section#4建立的Debug配置,Debug;
4. 在模擬器或真機上,執行到解鎖操作時,代碼就會停在斷點處;
這樣你就可以,
- 把滑鼠放在某個變數上,看它的值。也可以Eclipse中的各種調試手段調試你的代碼。
- 通過Step Into / Step Over / Resume / Suspend / Terminate等在Debug View中控製程序的執行。
總結
通過本文可以:
- 本文講解是基於Windows環境的,但是不僅適用於Windows環境,同樣適用於Mac OS和Linux系統,只是一些路徑和使用方式有差別;
- 可以跟蹤/調試所有Android中Java的源碼(無論Framework的代碼,還是App中的代碼),並不能Debug Framework中的c/c++ code;
- 為了使整個項目在Eclipse中都能編譯過,.classpath中也包含了out/裡編譯產生的內容,所以必須保證Android源碼是已經編譯過的。
- 跟蹤/調試的前提是要在所要調試代碼處設定斷點,並知道該處代碼執行在哪個進程中。