When I change any .java file and build, the compilation takes 16 seconds. I don’t understand why it should be so slow!?
I enabled verbose output for Andoroid.
Window > Preferences > Android > Build output > Verbose.
The result output (Console > Android) is:
[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!
The “processing” of .class files took 14 seconds. And it “processed” all files, even from all .jar files linked. I think some thing wrong goes here, as only one .java file was changed.
What can I do to improve the compilation speed?
I think there’s a misunderstanding here. As you say, only the modified classes are recompiled (by Eclipse in a matter of milliseconds); after that, however, the ADT plugin takes every compiled class and translates it into Dalvik’s bytecode format via the dx tool. The output of this process is a single file, classes.dex, which contains all the classes in your application, including the ones coming from referenced libraries. This last “translation” step is the one that takes longer because it’s really poorly optimized: the ADT plugin doesn’t cache anything, it just retranslates every class at every build (and it’s painfully slow). For medium to big projects this gets really frustrating… I hope Google will improve that in a future ADT/SDK release.
One other workaround is:
- disable the Android Package Builder (right-click on project#Properties#Builders)
- use ant for build and deployment of apk
ADT 21 pre-dex all libraries. This means regular compilation only re-dex the output of your project (faster) and then merges the result with the pre-dexed libraries (pretty quick).
Increasing the memory available for Eclipse seems to help a lot. Try launching it like:
eclipse -vmargs -Xms1024m -Xmx2048m
As alex2k8 mentioned I enabled verbose output. The culprit was AdMob jar file.
I’m using ADT 22.0. My application includes AdMob and during the running or debugging step, the class files in admob jar are converted to dex files which was really slow.
I removed the admob code and the jar from my project temporarily and the build process is normal again.
Every time you save, Eclipse package and dexing all files. But this is not necessary because you don’t need to deploy your app in apk each time you save.
Anyway, the key of this problem is to uncheck the option:
“Skip packaging and dexing until export or launch. (Speeds up automatic builds on file save.)”
Inside of “Window –> Preferences –> Android –> Build”
This will fix your problem.