2010-05-21 75 views
33

當我更改任何.java文件並編譯時,編譯需要16秒。我不明白爲什麼它應該這麼慢!?Android編譯速度慢(使用Eclipse)

我啓用了Andoroid的詳細輸出。

Window > Preferences > Android > Build output > Verbose. 

結果輸出(控制檯>的Android)是:

[19:46:10] Refreshing resource folders. 
[19:46:10] Starting incremental Pre Compiler: Checking resource changes. 
[19:46:10] Nothing to pre compile! 
[19:46:10] Starting incremental Package build: Checking resource changes. 
[19:46:10] ignored resource ...\bin\.\classes.dex 
[19:46:10] processing ...\A.class 
[19:46:10] processing ...\B.class 
    ... 
[19:46:21] processing com/google/inject/util/Providers.class... 
[19:46:21] processing com/google/inject/util/Types.class... 
[19:46:24] Using default debug key to sign package 
[19:46:24] Packaging ...\bin\resources.ap_ 
[19:46:24] Packaging classes.dex 
    ... 
[19:46:25] Packaging ...\annotations.jar 
[19:46:25] Build Success! 
[19:46:25] Refreshing resource folders. 
[19:46:25] Starting incremental Pre Compiler: Checking resource changes. 
[19:46:26] Nothing to pre compile! 

的的.class文件 「處理」 用了14秒。它「處理」所有文件,甚至是所有鏈接的.jar文件。我認爲這裏有一些錯誤,因爲只有一個.java文件發生了變化。

我該怎麼做才能提高編譯速度?

+1

什麼尺寸是你的APK結束了。如果它那麼大,那麼即使你只更改一個文件,它也需要Eclipse時間來編譯它。 – 2010-05-21 16:53:57

+0

〜800 KB - 這是大嗎? – alex2k8 2010-05-21 18:09:15

+1

順便說一句,對我而言,更大的項目應該更長時間才能編譯。 ..如果A依賴於B,並且我更改了A,爲什麼要重新編譯B?我猜​​(日誌中的「處理」代表編譯)。我同意,包裝可以更長,但理論上來說,編譯時不應該依賴項目的大小,而只需要更改一個文件。 – alex2k8 2010-05-21 18:21:19

回答

55

我覺得這裏有一個誤區。正如你所說,只有修改後的類纔會重新編譯(由Eclipse在幾毫秒內);然後,ADT插件接受每個編譯類,並通過dx工具將其轉換爲Dalvik的字節碼格式。這個過程的輸出是一個單獨的文件,classes.dex,它包含了應用程序中的所有類,包括來自引用庫的類。這個最後的「翻譯」步驟是需要更長時間的步驟,因爲它的優化效果很差:ADT插件不會緩存任何內容,它只是在每次構建時重新轉換每個類(並且速度很慢)。對於中到大型項目來說,這真的讓人感到沮喪......我希望Google能夠在未來的ADT/SDK版本中改進它。其他

+0

似乎是這樣的:-( – alex2k8 2010-09-21 21:27:23

+7

在旁邊注意,你可以在「項目」 - >「自動構建」中禁用自動構建,然後它只會在應用程序啓動時完全構建,所以它不會減慢Eclipse UI的速度 – jmbouffard 2011-09-02 15:24:31

+4

禁用「自動構建」的問題,是我沒有從資源中獲取更新的值,這給錯誤留下了很大的空間,並使得自動組合無用。然後當你最後構建它,你有錯誤,並且需要重新構建它,所以它不會節省很多時間 – Vlad 2012-08-25 13:47:54

0

增加可用於Eclipse的內存似乎有很大幫助。嘗試啓動它:

eclipse -vmargs -Xms1024m -Xmx2048m 
4

ADT 21 pre-dex all libraries。這意味着定期編譯只會重新規劃項目的輸出(更快),然後將結果與預先dexed庫合併(非常快)。

+0

Hi Xav,你知道嗎[這個AAPT瓶頸](http://forum.xda-developers .com/showthread.php?t = 1907281)以及您對此有何看法? – yorkw 2012-12-12 02:48:15

+2

是的。這是通過AOSP提交的,然後在內部合併。這將成爲下一次aapt更新的一部分。 – 2012-12-13 19:21:06

+0

酷,那麼我不需要重新命名/從第三方複製文件:) – yorkw 2012-12-13 21:18:52

0

由於alex2k8提到我啓用了詳細的輸出。罪魁禍首是AdMob jar文件。

我正在使用ADT 22.0。我的應用程序包括AdMob,並且在運行或調試步驟中,admob jar中的類文件被轉換爲非常慢的dex文件。

我從項目中暫時刪除了admob代碼和jar,並且構建過程再次正常。

0

每次保存,Eclipse包和dexing所有文件。但這不是必須的,因爲每次保存時都不需要在apk中部署應用程序。

無論如何,這個問題的關鍵是要取消對:

「跳過包裝和德興直到出口或推出(速度高達自動建立在文件保存。)」

裏面的「窗口 - >首選項 - > Android的 - >構建」

這將解決您的問題

乾杯