Android平臺實現開機調試system_process

1 首先要理清一下什麼是system_process
1.1 system_process是我們在DDMS可以看到的名稱。設置的地方在ActivityThread.java:

1.2 system_process不是進程的名稱,它是DDM用於區別不同的Java App的標識,對於一般Android程序來說會被設置成包名

1.3 system_process的進程名稱是system_server,就是我們通過ps可以看到的

1.4 system_server進程是zygote進程孵化的第一個Java進程

1.5 zygote進程的程序名稱叫app_process。

它的代碼在frameworks\base\cmds\app_process\app_main.cpp

在init.rc中可以看到它是怎樣啟動起來的:

1.6 system_server的啟動過程如下:
在app_main.cpp的main函數中,有如下的代碼:

runtime.start在正常情況下不會返回
在frameworks\base\core\java\com\android\internal\os\ZygoteInit.java的main中:

startSystemServer中:

args中,有:–nice-name=system_server,這就是進程名system_server的由來

2 接下來我們來看看怎麼去調試這個Android裡Java層的最重要的進程,一般調試和開機調試

3 一般調試:

3.1 這種調試方法就是在Android啟動完後,用adb連接Android,再調試system_process進程,實現起來是比較簡單的,

3.2 無非就是在eclipse裡創建一個名叫system_process的Android程序,然後在DDMS裡選擇system_process即可開始調試。

4 開機調試

4.1 有時我們需要調試一下system_process的初始化過程,因為上面的方法是在system_process已經初始化完之後開始調試的,用上面的方法是無能為力的,這就得另想辦法。

4.2 搜索瞭下網絡,沒有找到比較實用的資源,於是自己研究瞭下。

4.3 其實也不是很麻煩:

找到SystemServer.java裡的main函數,在函數的最開始加上幾行代碼:

4.4 解析下:

首先通過判斷/system/debug是否存在來判斷是否要等待調試器連接

android.os.Debug.waitForDebugger()就是等待調試器來連接,在調試器連接上之前代碼不會往下執行

但是第一行代碼就比較費解瞭,先來解析下什麼叫ddm,ddm就是Dalvik Debug Monitor的縮寫

android.ddm.DdmHandleAppName.setAppName就是要設置Java App在ddm裡的名稱。

如果不設置的話,你在DDMS裡看到的Name一欄就會有一個“?”,這個時候,eclipse找不到對應的工程,所以就沒法調試瞭。

所以這一行代碼很重要

4.5 接下來就是重新編譯代碼並燒錄瞭,這個看自己使用的是什麼平臺。

4.6 呵呵,是不是可以開機後用adb連接,再通過eclipse調試瞭?

5 這種方式的唯一缺陷就是要修改源代碼,這個留著以後再研究,現在要做的是好好享受一下這種調試方法。

發佈留言