2011年2月9日 星期三

Android Source core與 Eclipse 整合

老師及各位同學新年快樂!
前一陣子因工作的關係發文頻率比較少了些,因此利用了過年假期中測試了Android Source core與 Eclipse 整合,分享一下心得。

Android Source core與 Eclipse 整合可以:

1. 除錯(Debugging) -- 除了可以在原始碼中設定中斷點後進行debug功能外,還可以在修改原始碼後直接觀察到修改後在模擬器執行的畫面及程序內容。
2. 追蹤Android原始碼 -- 可以追蹤模擬器所執行的android process所對應到的原始碼及相關對應到的變數值。

本文安裝及測試環境先提供參考:

CPU: Intel® Core i5-760 Processor
(建議CPU越快越好、i5-760 在編譯原始檔時間可以控制在19~25分鐘完成)

Mem: 4G以上
(測試過因最近記憶體便宜加到8G比較妥,至少在編譯原始檔時間兩者的差異可以減少約5分鐘,不過要注意的是如果使用32bit 作業系統的話最多只能用到3.2G,Ubuntu如果要使用到8G則核心要改用PAE版本的;64位元則無此問題。)

硬碟:WD 500G SATA2 HDD
(測試過程沒做RAID也沒SATA 3,因主機板沒有RAID及SATA 3功能所以目前無法比較確認時間能快慢多少)

作業系統:Ubuntu 10.10 或 10.04
(32bit及64bit皆測試過可以使用,兩者在編譯時間上時間大同小異,由於目前android所釋出比較新的原始碼需要64bit來進行編譯所以可以考慮使用64位元作業系統,
另外由於要進行原始碼的下載及編譯,所以不建議使用在XP或Win7上,因為使用上不是很方便。)

Android原始碼: Froyo(android-2.2.2_r1)

JAVA版本: JAVA JDK 1.5.0_22

Eclipse版本: 3.5.2
(3.6.1經測試也可以使用的)

設定的步驟如下:
首先下載原始碼,在下載原始碼過程前須先安裝套件部分,先前文章有說明過(Android Proting 首部曲)或是參考官網Ubuntu Linux (64-bit)部分說明:
http://source.android.com/source/download.html

重點在於因為使用Froyo所以配合的JAVA版本為JDK 1.5.0_22,
接著安裝其他相關套件如下:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev

另外Eclipse事先要先安裝好,並且把eclipse.ini中參數修改成官網建議值以上,參考官網中Increase Eclipse's Memory Settings部分說明進行設定:
http://source.android.com/source/using-eclipse.html
也可以參考之前文章:優化Eclipse 開發工具

開始安裝:
1.下載原始碼:

$ mkdir bin
$ cd bin
在~/bin目錄下執行:
$ curl http://android.git.kernel.org/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

回到Home目錄,建立一個目錄;該目錄名稱可以自行取名:(我取名為Froyo)
$ cd
$ mkdir Froyo
$ cd Froyo/
$ ~/bin/repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.2.2_r1
$ ~/bin/repo
至此,開始下載Android Source,以目前來說我下載的 Android 2.2.2 release 1原始碼大約有158個project,下載後大約4.4G,所以須等好一陣子時間。

2.編譯原始碼及SDK

下載完成後接著執行開始編譯原始碼:
$ make -j 4
上述參數中,-j 4 代表進行編譯時使用四核心進行編譯(含HT在內),假如您的CPU只有雙核使用-j 2 ,因i5-760 CPU為四核心所以使用-j 4。


完成後,繼續編譯SDK:(以下指令所有 "." 的部分都要輸入)
$ . build/envsetup.sh
$ lunch 1
$ make PRODUCT-sdk-sdk 或者 make -j 4 PRODUCT-sdk-sdk

然後直接執行emulator確認SDK編譯無誤在執行ddms確認可以正確抓到模擬器中android的相關資訊。
$ emulator &
$ ddms



3.整合SDK
先將原始碼中development/ide/eclipse/目錄下的.classpath拷貝到原始碼跟目錄(Froyo/)下:(以下指令所有 "." 的部分都要輸入)
$ cp development/ide/eclipse/.classpath .
更改讀寫權限供Eclipse使用:
$ chmod u+w .classpath

編輯.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"/>
存檔。

打開Eclipse,NEW --> Java Project(註:是Java Project,並非我們寫程式時所使用的 Android Project)

Project Name自行取名(我取名為Froyo),選擇 Create project from existing source,在Directory中選擇Android原始碼目錄(~/Froyo),然後按Finish。
過了一些時間後,在Package Exporter畫面就可以看到所導入的程式內容。不過,內容中有兩處package是打叉的地方還要修改:
packages/providers/CalendarProvider/src
packages/providers/ContactsProvider/src


先修改packages/providers/CalendarProvider/src錯誤:
展開packages/providers/CalendarProvider/src後,在com.android.providers.calender按下滑鼠右鍵-->NEW-->File-->Advanced,
將Link to file in the file system打勾後在按 "Browse"選擇下列檔案:
out/target/common/obj/APPS/CalendarProvider_intermediates/src/src/com/android/providers/calendar/EventLogTags.java
最後按 "Finish" 即完成修復錯誤。




接著如法炮製修改下一個錯誤,只是 "Browse"選擇不同如下列檔案路徑:
out/target/common/obj/APPS/ContactsProvider_intermediates/src/src/com/android/providers/calendar/EventLogTags.java
剩下的Warnings部分就不用處理了。


然後選擇 Project -->Properties -->Java Code Style -->Formatter,右邊視窗中將Enable project specific settings打勾後按下 "Import"選擇 development/ide/eclipse/android-formatting.xml檔案後按確定-->Apply-->OK。


再選擇 Project -->Properties -->Java Code Style -->Organize Imports,右邊視窗中將Enable project specific settings打勾後按下 "Import"選擇 development/ide/eclipse/android.importorder檔案後按確定,
並將android項目移到最上方-->Apply-->OK。

至此,就完成Android原始碼導入Eclipse的步驟了。

4.測試
請確定按照下列先後次序開啟:
1.在一個Terminal視窗裝執行下列指令,開啟模擬器:
$ . build/envsetup.sh
$ lunch 1
$ emulator

2.在另一個Terminal視窗裝執行下列指令,開啟ddms:
$ . build/envsetup.sh
$ lunch 1
$ ddms
由於Eclipse如果安裝了ADT後也會開啟一個ddms,所以在開啟Eclipse前要先開啟前段文章所編譯好的ddms。

3.開啟Eclipse,因為前面已經開了一個ddms出來,如果出現ddms錯誤告警請按OK。接著打開Froyo專案後選擇 Run --> Debug Configurations... -->Remote Java Application 新增一個:
Name: Froyo
Project: Froyo
Connection Type: Standard(Socket Attact)
Connection Properties:
Host: localhost
Port:8700

按下Apply ,然後到ddms畫面-->Name中選擇隨便選一個測試的process ,你可以看右上方 Threads 的內容來決定你要觀察的process,
例如我想看LocationManagerService的Thread,我的process就要選擇 system_process
接著回到eclipse 按下剛剛還沒按下的Debug Configurations畫面中的 Debug按鈕
然後再按下Eclipse畫面右上方 javal字前方的圖示(Open Perspective)選擇Debug畫面
這時在Debug中可以看到Froyo[Remote Java Application]的processc項目,找到 Thread[LocationManagerService](Running)項目選擇它在按上方暫停圖示
此時(Running)字眼會變成(Suspended)這時就可以看到出現了一些目前模擬器中所執行的參數項目,選擇項目後Eclipse畫面中間靠左的部分就會自動帶出Android原始碼且顯示目前程式執行所在位置。
Eclipse畫面上方靠右有Variables會出現一些相關Name及Value。
最後查詢過了後別忘了目前的process已經被暫停住了,還要按上方開始後模擬器才會繼續進行。
至此,如果出現上述資訊無誤的話,代表測試無誤。
以下畫面是我寫一隻可以讀經緯度的程式,將一個 GPS KML檔案內容透過使用ddms中的 Emulator Control 送到模擬器裡面,然後再Eclipse中觀察。



另外還有其他功能如設定中斷點Debug、單步執行Debug、更改原始碼後直接打包到system.img等功能還在測試中,有心得的話再分享上來。
參考:
http://source.android.com/source/download.html
http://source.android.com/source/using-eclipse.html
補充:
1.測試過程中,IPC部分([native method])似乎無法追蹤,我想應該不是Java code的關係。

沒有留言:

張貼留言