Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android平台實現開機調試system_process

Android平台實現開機調試system_process

編輯:關於Android編程

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



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved