如何使用Eclipse開發Android源碼

來源:互聯網
上載者:User
文章目錄
  • 下面系統地講述Android開發環境建立以及開發工具的使用
  • 從官方文檔和實踐可以總結出幾點:
使用Eclipse開發Android源碼

說明:這篇文章是介紹如何開發Android源碼,包括各平台的源碼而非僅僅Google釋放的源碼,我採用的是MSM7267.

        前提不需要SDK,不需要ADT,通過整個工程的編譯都可以產生。為了在Eclipse中調試源碼如Phone、MMS、Contact……

        由於以前都沒接觸過Java、Eclipse、ADT... 這些,在網上看了N多的文章,就這篇詳細,所以貼出來共用,同時 加入了、

        自己在配置中 的TroubShooting。如果你是剛接觸Android, 那配置這些可能一時半會搞不定,要做好心理準備。

        官方配置網址:http://source.android.com/source/using-eclipse.html

帶著問題出發

1、Android的檔案系統結構是怎樣的,我們安裝的程式放在那裡?
編譯Android源碼之後,在out/target/product/generic一些檔案:
ramdisk.img、system.img、userdata.img、 system、 data、root
其中, system.img是由 system打包壓縮得到的, userdata.img是由 data打包壓縮得到的。

 

ramdisk.img是模擬器的檔案系統,把ramdisk.img解壓出來可知道,ramdisk.img裡的檔案跟root檔案夾的檔案基本一樣。
模擬器裝載ramdisk.img並解壓到記憶體,接著分別把system.img和userdata.img掛載到 ramdisk下的system和data目錄。我們編譯出來的應用程式就是放在system/app下的。使用者安裝的程式則是放在data/app下。

2、Android SDK和android源碼能為我們提供什麼工具?
Android SDK提供有很多工具,如adb,ddms,emulator,aapt等,並提供kernel-qemu、ramdisk.img、 system.img、userdata.img。因此,只要有android SDK,我們就可以在模擬器上把android跑起來。
Android源碼可以編譯出android SDK、adb等工具、android檔案系統,以及ADT外掛程式,也就是說,我們可以從android源碼編譯出所有android相關的東西。

3、 把Android源碼”make”之後會產生許多工具和android檔案系統(system.img等),我們又可以使用“make sdk”來產生android SDK,android SDK也包括有工具和android檔案系統(system.img等),而原來安裝的時候我們也安裝了android SDK,那麼我們在開發時應該使用那些工具和android檔案系統呢?
這個問題在後面回答。

4、官方推薦我們使用 eclipse+adt進入開發應用程式,我們的HelloActivity程式也是這裡開發的。當我們把Android源碼/packages /apps/下的工程匯入eclipse時,一般都會出現找不到包的錯誤。那麼我們怎樣修改、編譯、調試android源碼呢?Google又是用什麼工 具來開發android的?
這個問題在後面回答。

下面系統地講述Android開發環境建立以及開發工具的使用

一、Android SDK和eclipse的安裝以及android開發環境建立
Android工具鏈比較完善,需要外部的工具比較少。具體的安裝過程可參考官方文檔或<<android模擬器在Ubuntu8.10的安裝>>和<<android源碼的編譯>>。
這 裡需要注意的是,用”make”來編譯Android源碼時,我們可以使用JDK5或JDK6;用”make sdk”來編譯時間,會用到javadoc來產生文檔,javadoc就必須使用JDK5的javadoc,否則編譯是通不過的。因此,我們可以把JDK5 和JDK6都裝上,然後只把javadoc和javadoc.1.gz指向JDK5相應的工具,其它工具還是用JDK6的。當然,我們可以只安裝JDK5 或只用JDK5的工具。具體操作可以參考<<android源碼的編譯>>

二、使用eclipse來開發Android源碼
這裡主要參考官方文檔

https://sites.google.com/a/Android.com/opensource/using-eclipse

下面,從官方文檔總結出具體怎樣用eclipse來開發Android源碼

1、建立基本的Android開發環境
請參考官方文檔或<<Android模擬器在Ubuntu8.10的安裝>>

2、編譯Android源碼
Android源碼根目錄下通過make進行編譯,請注意一些配置,具體可參考<<android源碼的編譯>>

3、把eclipse工程設定檔複製到Android源碼根目錄下
cp development/ide/eclipse/.classpath ./
chmod u+w .classpath # Make the copy writable
4、修改eclipse程式的配置
1)、增大eclipse記憶體設定
把eclipse.ini(在eclipse軟體的安裝目錄下)的3個值改為下面的值:
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m
2)、把Android-formatting.xml和android.importorder匯入eclipse(可選)
Android-formatting.xml、.classpath和android.importorder都放在development/ide/eclipse/下
Android-formatting.xml用來配置eclipse編輯器的代碼風格;android.importorder用來配置eclipse的import的順序和結構。
在window->preferences->java->Code style->Formatter中匯入Android-formatting.xml
在window->preferences->java->Code style->Organize Imports中匯入Android.importorder
3)、安裝anyedit外掛程式(可選)
在http://andrei.gmxhome.de/anyedit/下載並匯入eclipse中

5、把Android源碼作為一個工程匯入eclipse
匯入前先檢查.classpath裡的檔案在Android源碼中是否有相應的檔案(檔案夾),否則也會破壞android源碼(一般是多添加檔案/檔案夾),.classpath裡多餘的路徑可刪除
建立Java Project(不是Android project,否則會破壞android源碼),www.linuxidc.com選擇從已存在的工程匯入,工程名任意,完成。
匯入時,eclipse要build工程,比較慢。導完後,一般都沒有錯誤。
這裡也就回答了第4個問題

 


註:

1.建立java 工程步驟不對也會造成解析錯誤,我的eclipse在new java project時無法選擇從已存在的工程匯入,所以採取下面的步驟,先建立再匯入:

建立:New java project

 

      Project name
隨便填

     不使用default location,把Location指定成代碼所在目錄,即

      uncheck “use default location“,Location選擇工程的根目錄(這個一定要選擇,否則package列表會出現錯誤),點擊Finish,  
要花一段時間開始build workspace。。。。。

匯入:File-> Import->select,General 選擇 Exiting projects into workspace,->Next 選擇源碼的根目錄,Finish。

      在eclipse的packageExplorer就會列出所有關聯的源碼。

 

2.如果解析有錯誤就無法debug,我碰到的最大問題出在這裡,eclipse中的problem視窗老實有錯誤,下面是解決辦法

刪除.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"/>

這時還提示CalendarProvider和ContactProvider中EventLogTags有錯誤,再進行下面的修改:

1. 展開packages/providers/CalendarProvider/src
2. 展開包: com.android.providers.calendar
3. 右鍵點擊包com.android.providers.calendar
4. 選擇 "new file"
5. 在對話方塊中選擇點擊  "Advanced >>" 按鈕, 可以看到"Link to file in the file system" checkbox,
6. 勾選上 checkbox.  這時 "Browse..." 可用.
7. 點擊 "Browse..." 按鈕,選擇EventLogTags.java (e.g.,out/target/common/obj/APPS/CalendarProvider_intermediates/src/src/com/android/providers/calendar/EventLogTags.java)
8. 點擊OK
9. 點擊 Finish (in "New File")
 同樣的方式修改com.android.providers.contacts的問題


這樣eclipse解析整個源碼就只有warning了。

 

 

 

6、eclipse上調試Android裡的程式。
為了不讓其它版本的Android工具和android檔案系統影響下面的編譯和調試,需要從環境變數中去除android工具和android檔案系統的路徑:
vim ~/.bashrc
看看有沒有在PATH變數中加入Android工具和android檔案系統的路徑,如果加有,則注釋它。通過下面的方法,我們是不需要在.bashrc中添加android工具和android檔案系統的路徑的
執行:
cd Android源碼目錄

. build/envsetup.sh #設了環境變數之後,會多出mmm等命令,可以通過輸入help來查看
lunch 1   # 把emulator等工具和ramdisk.img等檔案的路徑對應起來,就可以直接調用emulator等工具,也解決了第3個問題
emulator &
ddms &
注意,先啟動ddms,再啟動eclipse,這樣eclipse中就不會說連接埠衝突
然後在eclipse中配置偵錯類型和連接埠:
在Run->Debug Configurations->Remote java application上雙擊,然後,”Host:”設為localhost,”Port:”設為8800,”Connection Type”為Standard(Socket Attach)
然後“Apply”
注意,上面設定的連接埠要與DDMS中設定的連接埠(查看路徑File -->Preference,選左側的Debugger,右側Port of Selected Port)一致,ADT外掛程式使用了8700連接埠,因此上面設定的連接埠是8800。如果出現連不到VM的錯誤時,請注意,要先在DDMS中選中某一進程(對應某一應用程式),才能在eclipse執行 Debug(在Java視圖的情況下,點擊Right-top 位置的Open Perspective,選擇debug,就進入debug 視窗)。

 

 

 

附我的調試經驗:

即時按照上面的做了,經常出現錯誤“Failed to connect to remote VM”,原因是上面的port配置問題。

首先你要在ddms裡選擇一個你要debug的進程。滑鼠點一個進程就可以了,你可以看到在ddms顯示的進程前有一個綠色小蟲表徵圖。
並將此進程的連接埠記下(ddms的最後一欄可以看到),配置到remote java application中的Port。
如用連接埠8700調試表示你將調試當前ddms選中的進程,你還沒有在ddms中選擇任何進程,所以就會彈出ClosedConnectionException。
參見:http://source.android.com/source/using-eclipse.html中:
Note that port 8700 is attached to whatever process is currently selected in the DDMS console, so you need to sure that DDMS has selected the process you want to debug.
(要注意的是 連接埠8700是調試當前在DDMS中被選中的任何進程。所以,必須確認在DDMS已經選中你想要調試的進程。)

 

 

在eclipse調試時,可以設斷點、單步調試,如何調試可以參考

http://blog.csdn.net/lixnhollycrmcom/archive/2011/03/23/6271853.aspx

估計google團隊也是這樣開發、調試Android應用程式的

7、編譯Android源碼
執行:
cd Android源碼目錄
. build/envsetup.sh
那 麼就會多出mm/mmm等命令,mm/mmm用來編譯模組(包括C、C++、JAVA程式)。我們也可以直接在
Android源碼根目錄下執行“make 模組名”來編譯模組(模組名可以在.mk檔案中找到)。模組編譯後會在out/target/product/generic/system/app下生 成對應的.apk包。但是,用mm/mmm來編譯產生的.apk並不會打包到system.img中,需要我們手動通過make snod把 system檔案夾打包為system.img,不過這就得重新運行模擬器了,這也是很麻煩了。對於我們開發人員來說,我們可以這樣做:
1)把需要修改、調試的模組(比如AlarmClock.apk)從/system/app下移除,然後make snod,這樣system.img就沒有AlarmClock.apk了。
2)運行模擬器,就看不到AlarmClock了
3)修改AlarmClock源碼並用mm/mmm來編譯,在/system/app下產生AlarmClock.apk
4)通過adb把AlarmClock.apk安裝到Android檔案系統中,安裝方法有兩個:
    A、通過adb install xxx/AlarmClock.apk
    B、通過adb push xxx/AlarmClock.apk /data/app
兩 種方法都可以把 AlarmClock安裝到/data/app下,Android會自動把它顯示在主菜單中(只要AlarmClock.apk中有一Activity包 含android.intent.category.LAUNCHER屬性),不過A方法在/data/app產生 com.android.alarmclock.apk,B方法則是 AlarmClock.apk。用A方法時,如果原來已經安裝了 AlarmClock,你還得先adb uninstall 它,而B方法則不用。推薦使用B方法。同樣,卸載可以通過adb
uninstall或adb shell rm xxx/xxx.apk來,也推薦用刪除的方法來卸載

8、如何開發自己的工程
前面主要是講如何在eclipse上開發Android原有的工程。對於自己的工程,我們可以這樣做:
1)建立一個Android工程。
建Android工程的好處就是可以充分使用ADT的功能。
2)匯入需要的包
3)編譯、運行、調試
4)加入到Android源碼相應的目錄下,應用程式一般放在packages/apps下
我們觀察packages/apps原有的工程就會發現,它們的代碼是很“乾淨”的,沒有ADT自動產生的assets、bin等檔案夾和R.java,當然也沒有.classpath和.project
5)編寫Makefile檔案xxx.mk
用Android源碼提供的專用Makefile檔案xxx.mk,它的格式比較簡單
6)把剛加入的工程添加到eclipse的Android工程中
可以在eclipse中添加,也可以在.classpath中直接加入相應路徑。如在.classpath中添加:
<classpathentry kind="src" path="packages/apps/HelloWorld/src"/>
R.java 中編譯時間自動產生的,其實所有工程用到“資源”的,都會用到R.java,這些R.java是放在out/target/common/R下。我們在源碼 根目錄下make全部代碼時,才會對每個模組產生R.java;在make時,已經編譯過並產生有.apk檔案的模組是不會被編譯的。因此,如果新加入的 工程已經(用mm/mmm)編譯過的話,我們先對該工程的“資源”改動一下(必須是改動“資源”,因為R.java是由“資源”產生的),再make,就 在會out/target/common/R對應的包路徑下看到你的工程的R.java。重新整理在eclipse的out/target/common/R
子工程,再在你用到R類的地方加入它的包,如
import com.Android.example.test.inside.helloworld.R;這樣就不會出現找不到R定義的錯誤。
其實,這個錯誤對我們是沒有任何影響的,因為我們是在shell中編譯。
7)在Android源碼目錄下編譯剛加入的工程
可以用mm/mmm或make 模組名
8)用版本控制項工具(svn或git或其它)把該工程上傳到伺服器

 

從官方文檔和實踐可以總結出幾點:

1、可以使用eclipse來編輯JAVA程式、檢查錯誤(主要是類庫包含和文法方面),但是不能在eclipse上編譯運行Android源碼,還是得在shell中make(或mm或mmm)
2、Android源碼檔案夾裡提供有一些eclipse設定檔,
.claapath:eclipse工程的設定檔,方便我們直接把Android源碼相應的檔案和JAVA包匯入工程
Android-formatting.xml和android.importorder:這個很重要,主要是用來規範我們的編碼風格,更容易使我們的代碼風格一致
3、把Android源碼作為一個工程匯入eclipse時,必須注意兩點
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上進行調試),並可以單步調試、斷點調試。
4、需要調試的程式把它從/system/app/移除,安裝到data/app下,這樣更方便
5、安裝、卸載程式通過adb push 和adb shell rm更方便

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.