Android编译速度缓慢(使用Eclipse)

33

每当我修改任何 .java 文件并进行构建时,编译过程需要16秒。我不明白为什么会这么慢!?

我已经在 Android 中启用了详细输出。

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!

“processing” .class文件耗时14秒,并且“处理”了所有文件,甚至来自所有链接的.jar文件。我认为这里出了一些问题,因为只更改了一个.java文件。

我该怎么做才能提高编译速度?


1
你的 APK 最终大小是多少?如果太大,即使你只更改一个文件,Eclipse 编译它的时间也会很长。 - Donal Rafferty
1
顺便说一句,对我来说,更大的项目需要更长时间编译这件事没有意义...如果A依赖于B,并且我更改了A,为什么要重新编译B?我猜测(日志中的“处理”代表编译)。我同意,打包可能需要更长时间,但是理论上,当我只更改一个文件时,编译不应该取决于项目的大小。 - alex2k8
我的目标SDK是4级(Android 1.6),一切都很好。当我切换到10级(Android 2.3.3)以包含该版本发布的功能时,我开始注意到这个问题。现在我已经切换回4级,因为速度太慢了(尽管我仍然在Ant中编译我的发布应用程序)。我尝试了可用的4到10级,以查看是在哪个级别引入了此问题,结果发现它始于8级(Android 2.2),因此在8级或更高级别上,您可能需要通过其他方式优化eclipse来提高编译速度。 - ubzack
6个回答

55

我认为这里存在一个误解。正如你所说,只有修改过的类被Eclipse在毫秒级别重新编译;之后,ADT插件通过dx工具将每个已编译的类转换为Dalvik的字节码格式。这个过程的输出是一个名为classes.dex的单一文件,其中包含了你的应用程序中的所有类,包括来自引用库的类。这最后一步“翻译”需要更长时间,因为它非常不优化:ADT插件没有缓存任何内容,它只是在每次构建时重新翻译每个类(而且速度极慢)。对于中大型项目来说,这变得非常令人沮丧...我希望Google会在未来的ADT/SDK版本中改进这一点。


7
顺带一提,你可以在“项目”->“自动构建”中禁用自动构建。这样,它只会在启动应用程序时完全构建,因此每次保存文件时不会拖慢Eclipse界面的代码编写速度。 - jmbouffard
4
禁用“自动构建”的问题是,我无法从资源中获取到更新后的值。这给错误留下了很大空间,并使得自动完成功能变得无用。当你最终进行构建时,会出现错误,需要再次构建,因此并没有节省多少时间。 - Vlad
2
保持自动构建,但禁用后编译器(在 Android > 构建下的首选项中)。这样你只禁用 dexing 阶段。它将仅在启动时按需完成。 - Xavier Ducrohet
我发现禁用自动构建很有用,当我更改资源时,按Ctrl-B启动构建。 - Knossos

9

如果您了解Ant并调用Android的build.xml,则显然没有任何性能优化效果。 - Trinea

4
ADT 21预编译所有库。这意味着常规编译只会重新对项目输出进行dex操作(更快),然后将结果与预先进行dex处理的库合并(相当快速)。

嗨Xav,你是否知道此AAPT瓶颈,你对它有何看法? - yorkw
2
是的。这是通过AOSP提交的,然后在内部合并。它将成为下一个aapt更新的一部分。 - Xavier Ducrohet
太棒了,那我就不需要再从第三方重命名/复制文件了 :) - yorkw

0

正如alex2k8所提到的,我启用了详细输出。罪魁祸首是AdMob jar文件。

我正在使用ADT 22.0。我的应用程序包括AdMob,在运行或调试步骤中,admob jar中的类文件被转换为dex文件,这非常缓慢。

我暂时从项目中删除了admob代码和jar文件,构建过程再次正常。


0
每次保存时,Eclipse会打包和dexing所有文件。但这并不是必要的,因为您不需要每次保存都部署您的应用程序到apk中。
无论如何,解决此问题的关键是取消选中以下选项:
“跳过打包和dexing直到导出或启动。(加快文件保存时的自动构建速度。)”
“窗口-->首选项-->Android-->构建”中。
这将解决您的问题。
干杯

0

增加Eclipse可用的内存似乎会有很大帮助。尝试这样启动它:

eclipse -vmargs -Xms1024m -Xmx2048m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接