在 IntelliJ IDEA 中加快 Android 项目构建时间

Posted

技术标签:

【中文标题】在 IntelliJ IDEA 中加快 Android 项目构建时间【英文标题】:Speed up Android project build time in IntelliJ IDEA 【发布时间】:2012-10-31 09:39:05 【问题描述】:

我想知道,如果有任何方法,如何在 IntelliJ IDEA 中设置 skip packaging and dexing,就像在 Eclipse 和 ADT 中一样。 IntelliJ Preferencesandroid DX 编译器部分中有Additional VM Options 字段,也许这可能是一种方法,如何设置它。我也很感激另一个技巧,如何加快 IntelliJ Android 项目的构建。

【问题讨论】:

动机是什么?运行“junit”运行配置时,IntelliJ 不会执行 dexing 和打包。 我不确定,我应该如何添加“junit”运行配置以及junit是否可以与Android一起使用。 eclipse如何跳过打包和dexing?当你构建一个应用程序时,你必须在编译 apk 之前对其进行 dex。 @toadzky 它只在自动构建期间跳过,而不是用于导出或启动。几乎没有意义,IMO 你能告诉我们一些在 IDEA 和 Eclipse 中构建 apk 的统计数据吗? IDEA 慢了多少? skip packaging and dexing 选项对 IDEA 没有意义,因为它不需要编译代码来检查错误。 Eclipse 使用编译器,IDEA 动态分析错误,主要区别在于 IntelliJ IDEA 中某些 Eclipse 特定选项已过时。 【参考方案1】:

我正在使用 IntelliJ 12。我赢得了部署和运行 Android 应用程序的时间,使 IntelliJ 能够“自动制作项目”。要启用它,只需转到 Preferences -> Compiler 并选中“Make project automatically”。在同一窗口中选中“并行编译独立模块”。

启用“自动制作项目”允许您在 Android 应用程序启动之前跳过“制作”任务。您可以在“运行/调试配置”中删除它,选择您的 Android 应用程序并在“启动前”部分中删除“制作”任务。

【讨论】:

我认为这是 OP 试图描述的问题的解决方案。在新的 Android Studio 上为我工作。将我的构建时间从 2 多分钟缩短到几秒钟 这是 OP 问题的正确答案。大大减少了我的项目的编译时间。 “自动制作项目”似乎从 Android Studio 0.1.8+ 起什么也没做。你在最新版本上运行了吗? 任何人都可以确认这部分答案对您有用吗? >> “启用“自动制作项目”允许您在启动 Android 应用程序之前跳过“制作”任务。” 我可以确认不能简单地从运行配置中删除“制作”步骤。看起来旧的 APK 被执行并且没有反映新的更改。我在 IntelliJ IDEA 13.0.1 上。【参考方案2】:

在 Eclipse 首选项中,您所指的 skip packaging and dexing 的完整名称是 Skip packaging and dexing until export or launch. (Speeds up automatic builds on file save),这是自 ADT 12 以来添加的一个功能,目的是解决 Eclipse 增量编译问题(这会减慢 Eclipse 上的开发速度),请查看Revisions 12.0.0 (July 2011) 和 this link 了解更多详细信息,请注意,无论您使用哪种 IDE(或非 IDE),打包和 dexing 都是调试/运行项目时的基本步骤。

正如 CrazyCoder 在他的 cmets 中提到的,IntelliJ 默认不支持Eclipse-like incremental compilation and Problems pane,换句话说,它不会在文件更改时自动编译您的项目。所以这在 IntelliJ 中真的不是问题,也不是特性。

您的构建过程瓶颈可能来自其他地方。 AFAIK 在一个中型项目中,构建过程花费最多的时间是编译资源(AAPT 命令,查看build process diagram)。来自 xdadevelopers 的一些聪明人发现了瓶颈并创建了 AAPT 的修复版本:

http://forum.xda-developers.com/showthread.php?t=1907281

我自己使用它,我会说在 Eclipse 中可以感觉到速度提升,请注意它只提升 AAPT 步骤,而不是打包广告 dexing。如果您使用 InteliJ,它可能没有太大帮助,因为它不需要经常编译项目。

【讨论】:

感谢您的解释和提示!【参考方案3】:

我没有解决方案,但我解释了为什么 Eclipse 和 IntelliJ 之间存在巨大的编译时间差异。因为有。每当您依赖外部模块或库时:IntellIJ 总是 DEX 的依赖模块。 Eclipse 似乎正在缓存它们。

我也曾在我的一个项目中经历过这种巨大的差异。我做了一些基本的计时测试,发现我在 IntellIJ 中用 40 秒构建的项目在 Eclipse 中只用了 20 秒。很多时间都花在了 IntelliJ 状态为 Executing DEX 的过程中,所以这就是我发现这个问题的方式。然后我试图做一个更彻底和可重复的实验,这就是我发现的。

项目设置

来自 Eclipse 中 New Android Application 模板的 Hello World 项目。 对AndEngine开源Android游戏引擎项目的依赖*。 Eclipse: AndEngine 项目定义为“Android 库”。添加为 Android 选项卡下的参考和 Java 构建路径/项目选项卡下的所需项目。 IntelliJ: AndEngine 定义为“模块”。设置为主模块 HelloWorld 的依赖项,并选中导出复选框 not(我认为这并不重要)。

*) 我可以在这里使用任何模块,但这是一个很好的例子,因为它 a) 相当大,b) 是一个 Android 模块,这意味着我必须将它作为一个 Android 项目链接,而不仅仅是作为一个 JAR dbm 建议在上面的帖子中。

我在MainActivity.java(HelloWorld 的启动活动)的onCreate 方法中添加了日志代码,该方法也调用了AndEngine 中的一个方法,该方法也记录了一行。 (我修改了SoundManager的构造函数输出一行,并从MainActivity.java调用构造函数)。这让我可以看到应用程序何时完成部署以及它也已正确部署。

然后我进行了以下更改,并在每个 IDE 中对它们中的每一个进行了 3 次计时:

A:只修改了主模块中的日志行 A+B:修改了主模块和 AndEngine 模块中的日志行。

我使用标准秒表进行手动计时,然后向上/向下四舍五入到最接近的秒数。我在每种情况下做了三个计时并计算了算术平均值。

结果:

注意:我没有在 Eclipse 中为“Executing DEX”添加单独的子列,因为它只是在整个构建过程中输出“make”或“refreshing workspace”。

从 Eclipse 运行时,您可以从数字中看到我只修改主模块时节省了时间——这与预期的一样。但是在 IntelliJ 中,两种情况下的编译时间是相同的!

结论:

IntelliJ 做了很多不必要的 DEX'ing。如果有人知道这是否是可配置的,我想我们会解决认为问题的根本原因。

【讨论】:

注意:IntelliJ 结果可能对使用不同构建系统的 Android Studio 无效。 你说的很有道理,我也看到了同样的情况:一个 very 缓慢的 DEXing 阶段,这在 Eclipse 中的同一个项目中还可以。也许您应该向 JetBrains 报告这个错误,并提供所有这些漂亮的图表和研究:)【参考方案4】:

有时当我将大型外部 JAR 添加到我的 (Eclipse) 项目中时,它似乎会显着减慢构建过程。

然而,我注意到,与其像往常一样添加 jar (Project -> Properties -> Java Build Path -> Libraries -> Add External JARs...),还可以添加用户库 (Project -> Properties -> Java Build Path -> Libraries -> Add Library... -> User Library) 并将外部 JAR 添加到此库中。

到目前为止,这始终解决了我的大型 JAR 构建时间问题。一些聪明人也向我解释了为什么会这样,但不幸的是我不记得这个解释了。我在 IntelliJ 方面没有经验 - 我不知道这是否适用于您的情况,但是,您可能会从这里获得更多的想法......

【讨论】:

以上是关于在 IntelliJ IDEA 中加快 Android 项目构建时间的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ IDEA 缓存和索引介绍

IntelliJ IDEA 缓存和索引介绍和清理方法

IntelliJ IDEA 2023.1 版本可以安装了

Intellij IDEA 怎么设置JVM 内存

IntelliJ IDEA (Mac) 运行速度优化

IntelliJ IDEA 通过GsonFormat插件将JSONObject格式的String 解析成实体