app和SystemPRocess調試方案
1 簡要說明 4 2 環境要求 4 3 SettingsApp演示調試 4 4 SystemProcess演示調試 8
1 簡要說明 為了解決應用問題,有時我們需要調試應用。相比打印log來說,聯調的優勢在于,它能夠實時的去觀測變量的變化,去更加直觀,更加便捷的看出問題所在,此文便是解決此問題產生。 主要分為兩部分來講解,一部分為app調試,一部分為系統SystemProcess(主要調試 AMS WMS等系統服務代碼)
2環境要求 開發手機一部,eng版本。 eclipse 調試環境 代碼
3SettingsApp演示調試 首先,我們打開 eclipse,新建一個工程,應用名為test,我們可以看到包名為 com.example.test 我們修改下代碼: 將activity_main.xml改為: 
MainActivity.java 加入: 
下來我們來在settext上面打上斷點,手機連上電腦,右鍵左側的工程名(test)選擇debug As 選擇第一個應用程序,選中手機設備。 隨后我們便會發現我們斷點打在了text_id.setText(“test app “); 這一行。 我們點擊F5選擇跟入, 會發現系統提示我們找不到TextView.java代碼。
我們這里點擊Attach Source,進行選擇代碼位置:
我們在settext函數設置斷點。 然后我們點擊工程名,右鍵選擇debug As 選擇應用程序即可,找到連接的手機,開始調試。 我們會發現代碼斷點起作用,停在settext那行,然后我們點擊F5進行跟入。 會有個界面: 
我們點擊Attact Source 去找到TextView代碼。
這里有一個需要注意的地方: 我們來看下TextView.java的對應包名,package android.widget; 所以我們在選擇路徑的時候,要選擇在android/widget的父類,如此以來,系統才會從給出的路徑,去找對應的包路徑下的TextView.java。 演示的為:
然后我們點擊OK,會發現代碼出來了。
然后你繼續跟進就可以了。
這個就是一個簡單的調試,解決的是可以編譯過的app.然而我們系統的app基本放在eclipse無法編譯過的。下來我們來說這個怎么調試。
先說下調試依據:
eclipse調試代碼,是不依賴代碼是否編譯過的,只依賴兩個參數:一個是app包名,一個 是代碼,我們就來演示測試下如何來調試系統settings里面的TextView.java
新建一個工程,將包名寫為:com.android.settings 
下一步下一步即可。 我們將我們工程里面的textView.java 復制過來,如下目錄放置好(目錄為包路徑)

我們可以看到,這個是報錯的,我們不管。我們在它的構造函數處打斷點。(700多行) 下來我們直接去調試Settings即可。 在ec的菜單項找到Window,點擊Show view 然后再點擊最后的other,

選擇這個,然后我們能看到這個列表: 
我們找到Settings包,然后選中,點擊右上面的那個蟲子,因為我們有com.android.Settings包名的項目,因此便調試上了。
我們來啟動Settings,看下是否能在TextView源碼上。 事實如此,可以調試Settings代碼了。系統里面的控件View都是可以直接打斷的(因為這些控件View都是運行在Settings進程內部的)
好了,就到這里,應用調試就是如此簡單。
4SystemProcess演示調試 我們演示下調試activity的啟動過程即可.因為SystemProcess不是app進程,不能使用上面的方式調試,我們需要使用端口直接聯調,下來我們開始操作。
新建一個java工程(這里強調,是個java 工程),名字隨意,這里我寫為Systemserver。
創建完成后,我們將 frameworks/base/services/core/java/com/android/server/am 復制到本地,在Systemserver這個工程下,創建一個目錄,為am里面的包名(重點,包名)

最終顯示如上,然后我們找到ActivityStarter.java,在里面的startActivityLocked函數打上斷點。
關鍵部分來了: 我們在DDMS里面找到system_process(AMS運行在這個進程),去看下它的進程調試端口.
這里為8602,然后我們回到項目這邊來,選中項目,點擊右鍵,出來的選擇debug as 繼續選擇debug Configurations,找到最后的Remote java application, 點擊它:
這里需要改下port 為我們上面記住的system process的端口號,這里為8602。 然后選擇勾上Allow te……of remote VM
然后此時我們去DDMS去看,會發現我們的
前面有個蟲子,則是調試上了。
此時我們運行隨便啟動一個activity,則會發現我們斷點起作用了,被攔住。

此文就到這里。
新聞熱點
疑難解答