調(diào)試Android Java源碼
草帽的后花園——Neo
寫在之前的話:這里主要是以調(diào)試Java源碼為主,應該說是在system_process之后的源碼,這對于調(diào)試和修改frameworks層的人來說真是一個利器,但至于為什么在system_process之后,我還在分析,如果有結(jié)果我會更新此文章,并正在嘗試調(diào)試C++的代碼,就是native中的代碼,如果這個可行那將會大大的減少我們這些以修改源碼為主的工作人員就輕松多了,目前還未開始,如果可行我會盡快發(fā)布,方法并非原創(chuàng),僅僅是我成功測試了,所以分享。轉(zhuǎn)載請注明來源,謝謝。(經(jīng)過測試,如果系統(tǒng)編譯成user版本的似乎不能調(diào)試)
1. 配置SDK開發(fā)環(huán)境
這個關(guān)于配置開發(fā)環(huán)境我就不多說了,由于工作時間原因,我會在后面加入關(guān)于windows下和linux下的開發(fā)環(huán)境配置的教程。這里的工作環(huán)境是windows xp,Eclipse 4.2,
SDK情況如下圖:

2. 導入Android源碼
我這里使用的代碼是Android 4.1.2(主要是目前我公司暫時在開發(fā)4.1.2的平板),我就以4.1.2的源碼為主,模擬器演示,真機就不演示了,原理是一樣的。在這里,首先要確保一件事情就是你的源碼要能編譯通過才行,編譯源碼的教程網(wǎng)上有很多,后面我也會再做一份自己理解的教程。
2.1. 啟動Eclipse
這個就不詳述了,免得羅嗦,直接點圖標。啟動后如圖所示:

2.2. 新建Java工程
點擊左上角的FileàNewàJavaProject,新建一個Java的工程。首先說明下,我的代碼之前就可以編譯通過,根目錄路徑為:U:\neo\android_4.1.2\4.1.2。

然后會進入下面的這個界面

2.3. 選擇導入的源碼
在導入之前我們需要做一個事情,就是減少源碼導入的量過大,我們可以把源碼中的一個文件拷貝到源碼根目錄下,該文件的路徑是:(U:\neo\android_4.1.2\4.1.2\development\ide\eclipse\.classpath),看不到的話就把所有隱藏的文件顯示出來,如圖所示:

復制過去:

現(xiàn)在我們需要選擇要導入的源碼,location處為我們所要導入的源碼路徑(這里注意是根目錄哦,源碼根目錄~~),輸入project name:Android4.1.2,去掉Use defaultlocation的勾,結(jié)果如圖所示:

然后點next,就會導入了,導入大概需要十幾分鐘吧,等待等待,呵呵。
導入完畢之后的圖:

Finish之后就OK了。
工程代碼:

3. 設(shè)置連接的端口
其實就是通過遠程來調(diào)試,設(shè)置一個socket的端口,操作過程如圖:


進入debugConfigurations時雙擊Remote Java Application新建一個遠程調(diào)試并將端口號改為8600(這里需要做的是輸入你要調(diào)試的進程的端口號,這里我附上一張后面的圖,以便解釋,每個進程啟動后都有一個端口號,如圖,若要針對調(diào)試就需要設(shè)置好端口號才會進入,后面的圖,例如要調(diào)settings,那么就把端口號設(shè)置為8604),且common欄中的debug打鉤。



點擊Apply即可。
4. 啟動真機或者模擬器
連接真機或者模擬器,我只連接模擬器了,真機也已經(jīng)測試,是可行的。
首先要新建一個模擬器(平板效果圖的模擬器),步驟如圖所示:


在window->AVDManager中,選擇新建

填滿內(nèi)容,這里要注意:Resolution設(shè)置為1280x800的,下面的AbstractedLCD density要設(shè)置成160,這樣才顯示的是平板。

點Create AVD即可。啟動剛才建立的模擬器。

模擬器已經(jīng)在啟動

5. 設(shè)置斷點
模擬器啟動比較慢,我們先設(shè)置好斷點,根據(jù)啟動流程(這個需要自己理解下了),我在所有服務啟動之前加入了斷點,斷點設(shè)置在frameworks/base/services/java/com/android/server/SystemServer.java的第775行,即在run()啟動的第一句話,后面的代碼都是為了啟動各種服務。


設(shè)置好斷點后,開始連接模擬器。
6. 開始調(diào)試
接下來就是進行調(diào)試了,啟動過程中我們在DDMS中可以看到,設(shè)備剛開始是offline的,等設(shè)備處于online狀態(tài)時,我們啟動剛才設(shè)置好的debug。



點了debug后,這時會看到有只小蟲子粘在了system_process進程上,這說明已經(jīng)可以調(diào)試了。

稍等會就會進入到我們剛才設(shè)置的斷點處了。

效果就是這樣,調(diào)試的步驟這個就不多說了,也可以在這里查看變量的值,以及修改內(nèi)存中的值,以便調(diào)試。(其實說實話解釋型的語言更好調(diào)試,編譯型的好不爽,好歹還能修改下內(nèi)存的值)。

調(diào)試過程就是如此了,這里只做了一個小小的演示,相信多的不用再說了,做為IT新手的我不可能寫的太詳細,如有疏漏請見諒。其實通過這個還看觀察到系統(tǒng)的部分啟動過程,可以調(diào)launcher、Setting等frameworks下面的東東,如果大家有好方法請互相共享,謝謝。