一、搭建Eclipse源碼工程
1、 進入源碼目錄下的development/ide/eclipse,把android-formatting.xml
,android.importorder , .classpath拷貝到源碼目錄
Eclipse需要一個目錄列表來搜尋Java檔案,稱作"Java
Build Path”,儲存在.classpath檔案中【eclipse工程的設定檔,方便我們直接把android源碼相應的檔案和JAVA包匯入工程】
匯入development/ide/eclipse下的檔案,讓Eclipse遵從Android的編碼風格:
2、 chmod +x .classpath 賦予執行許可權
3、在eclipse工程菜單
window-->preferences-->java-->Code Style-->Formatter 匯入android- formatting.xml檔案,organize imports匯入android.importorder檔案
4、 建立一個java工程,匯入android源碼
必須注意兩點:
1)、建立的工程必須是java project,不能是android project,否則會破壞android源碼(一般是多添加檔案/檔案夾)。
2)、匯入前最好檢查.classpath裡的檔案在android源碼中是否有相應的檔案(檔案夾),否則也會破壞android源碼(一般是多添加檔案/檔案夾)。
總的來說:
1、用eclipse來編輯代碼、檢查錯誤。
2、不在eclipse上編譯、運行android源碼程式,只能在命令列通過make(或mm或mmm)編譯android源碼。
3、可以在eclipse上調試android源碼程式(原理:eclipse通過ddms伺服器在emulator上進行調試),並可以單步調試、斷點調試。
5、 修改eclipse配置,eclipse目錄下的eclipse.ini檔案,修改-Xms,-Xmx為128和512
-Xms128m
-Xmx512m
Android工程很大,在編譯時間可能造成Eclipse的Java虛擬機器記憶體耗光。我們可以通過修改eclipse.ini避免這一問題,在ubuntu下,eclipse.ini位於eclipse所在目錄
二、調試android源碼
1. 退出Eclipse工程
2. 在android源碼目錄執行 . build/envsetup.sh ,初始化環境變數 【lunch 1 # to build the emulator】
3. 啟動模擬器 emulator &【 you should see a GUI picture of a phone】
4. 等模擬器啟動成功後,啟動ddms ddms & 【 you should get a splufty debugging console】
5. 在ddms上選擇你需要調試的進程,一般如果是調試系統內建的應用,比如連絡人,選中下面進程
6. 開啟Eclipse工程,設定調試連接埠
選擇你的工程,右鍵開啟菜單選擇 Debug AS—Debug configuration 快顯視窗,選擇Remote JAVA Application,右鍵在菜單選擇NEW,彈出下面的視圖,修改Port為8700
7.debug後在選擇的進程上面如果出現了 ,則表示成功進入調試了。
8、比如:調試撥打到電話的功能
在DDMS上選擇com.android.phone這個進程
找到frameworks/base/telephoney/java目錄下的com.android.internal.telephony包,然後找到RIL.java檔案。
在函數 public void dial(String address, int clirMode, UUSInfo uusInfo, Message result)中設定斷點
然後在模擬器中撥打到電話,便可以在設定的斷點處停下,進行查看變數等操作。
====================================
出現的問題:
Project 'gingerbread' is missing required library: 'out/target/common/obj/JAVA_LIBRARIES/google-common_intermediates/javalib.jar'
Project 'gingerbread' is missing required library: 'out/target/common/obj/JAVA_LIBRARIES/gsf-client_intermediates/javalib.jar'
解決:
刪除.classpath中的這兩行路徑
<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/google-common_intermediates/javalib.jar"/>
<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/gsf-client_intermediates/javalib.jar"/>
添加
<classpathentry kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/javalib.jar"/>
<classpathentry
kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/filterfw_intermediates/classes-jarjar.jar"/>
<classpathentry
kind="lib" path="out/target/common/obj/JAVA_LIBRARIES/android-support-v13_intermediates/classes-jarjar.jar"/>
簡要說明:
在以往的調試經驗中,讀者習慣於使用Eclipse命令菜單run/debug來調試一個獨立的Android應用程式,而Framework並不是一個應用程式,那麼如何調試呢?下面做幾點說明:
1、Android的Framework雖然是Android的核心,但其內部也包含一個應用程式,其名稱為:system_process,其對應的TCP連接埠地址一般為:8600,因此也可以對該程式進行調試。
2、Framework中包含的SDK源碼在程式空間中只有一份副本,但是每個應用程式都會調用這部分程式,調用時,該代碼是在應用程式所在的使用者進程中啟動並執行。
基於以上2點,理論上可以對普通應用程式進行調試,並將Android SDK中的源碼附屬到偵錯工具中,那麼就可以單步調試到Framework的源碼了。另一方面,也可以單獨對system_process進行調試。
下面描述3個調試執行個體:
一、普通應用程式調試:
使用功能表命令run/debug,當調試到需要調用Framework代碼的地方,eclipse會提示找不到所需的代碼,此時,可以在提示頁面上單擊“Attach Source...”按鈕,並指到我們Android源碼目錄,其作用就是將Android中的源檔案作為SDK中android.jar的源碼,從而就可以單步運行到相應的Framework源碼中了。
二、系統應用程式調試:
以packages/app/Contacts項目為例,該項目中引用了Framework中的一些特別類,這些類在預設情況下並沒有被包含到SDK中的android.jar包中,因此Eclipse下無法直接編譯該項目並產生Contacts.apk。要產生Contacts.apk可以有2種方法:1、把Contacts項目中所需要的特別檔案打包成一個jar包,並把該jar包包含到Contacts項目中,從而就可以直接在Eclipse中編譯出Contacts.apk,另一種方法是直接在Terminal中使用make
Contacts命令編譯出Contacts.apk,一般多採用後一種方法。