在多Dex应用中加速Gradle构建

22

我的应用程序使用了许多必要的库,这就是为什么我被迫使用 multidex 支持库,并且它运行得很好。但问题出在 gradle 构建速度上。构建平均需要 2 分钟的时间,当我在开发和测试时,这相当烦人。

有没有办法加快我的调试构建速度?


购买更多内存 - 至少16 GB。我之前有8 GB,升级到16 GB后构建时间从60秒减少到30秒。 - ivan.panasiuk
7个回答

60
您可以通过指定最低SDK版本=21来加速开发构建。
官方文档中包含了一个关于这个问题的整个章节。例子 (来源于文档)。
android {
    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 14
        }
    }
          ...
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                                                 'proguard-rules.pro'
        }
    }
}
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

一旦你添加了产品风格,你可以使用devDebug任务(而不是默认的debug任务)进行开发构建:
- 从命令行运行:./gradlew installDevDebug
- 从Android Studio中:打开Build Variants窗口并选择devDebug构建变体。

当然,你应该使用SDK >= 21 的设备进行开发。


对于那些不想使用产品风格的人,也有一个解决方案。如这个代码片段所建议的那样,动态计算minSdkVersion值:

int minSdk = hasProperty('devMinSdk') ? devMinSdk.toInteger() : 14
apply plugin: 'com.android.application'

android {
    ...
    defaultConfig {
        minSdkVersion minSdk
        ...
    }
}
在这个例子中,我们检查是否定义了 devMinSdk 属性,如果为真,则使用它,否则默认为14。
我们如何将 devMinSdk 值传递给构建脚本?有两个选项: 使用命令行:
./gradlew installDebug -PdevMinSdk=21

使用Android Studio首选项:

进入首选项 (Windows下的设置) -> Build, Execution, Deployment -> Compiler -> 在命令行选项文本框中输入-PdevMinSdk=21

Android Studio编译器选项


如果我要为较低的SDK开发,我就无法做到这一点。 - Tadej Vengust
@Tadej 你是什么意思?你完全不支持运行SDK 21的设备(也就是说,你的最大SDK < 21)吗? - Alex Lipov
不,我的意思是我正在使用一台安卓版本较低的设备,所以我无法在其上调试sdk 21。 - Tadej Vengust
将最小SDK设置为21只针对Lolipop,这仅占所有Android设备的12%,这是非常严重的。 - Hugo Gresse
9
在你下投票前请仔细阅读 - 你只需要将最低SDK设置为21用于开发版本。无论如何,你都需要在支持的所有SDK级别上测试你的发布版本,以确保在各种设备上正常运行。 - Alex Lipov
显示剩余7条评论

3

最近,Android Gradle插件团队引入了构建缓存。您可以通过在gradle.properties中添加android.enableBuildCache=true来启用它。

更多信息请参见http://tools.android.com/tech-docs/build-cache

对我来说,它将增加约30秒的增量构建时间。

它不适用于作为支持库一部分引入的旧版multidex(com.android.support:multidex),因此仅适用于minSDK>=21的情况。您只能为开发构建设置它,并使用minSDK<21进行发布构建。

它也可以在未启用multidexing的情况下工作。


1
多 Dex 使用的内存更多。当你接近 Java 的最大堆大小时,你会发现 Java 花费更多时间做 GC 而不是做任何真正的工作,这可能会严重减慢速度。
我强烈建议在使用多 Dex 时增加最大堆大小。将以下内容添加到 build.gradle 文件中的 android 闭包中,以使最大堆大小为 4GB(如果您希望,则可以使其更小):
dexOptions {
    javaMaxHeapSize "4g"
}

+1,即使将MinSdkVersion提高到21,通过将其增加到2g,我也能获得明显的加速。此外,您还需要将Gradle堆大小增加半个千字节(在本例中为2560m),以便(multi)dex在同一进程中运行。 - Adam P. Goucher

1

所以要等稳定版本发布吗?真的希望它也能对多dex应用程序有所帮助。 - Tadej Vengust
你也可以尝试下载它,看看是否能提高构建时间。 - Hugo Gresse
有人能确认AS1.3P3在构建multidex目标时确实比原来快10-30倍吗? - Valerio Santinelli
Android Studio肯定不行,你必须使用Gradle Android插件classpath 'com.android.tools.build:gradle:1.3.0-beta4'来尝试。@ValerioSantinelli - Hugo Gresse
@HugoGresse 我在我的项目中尝试了beta版gradle插件,构建时间减少了约20%。虽然不算多,但仍然有所改善。 - Valerio Santinelli

0

将MinSdk更改为21对我来说使一切恢复正常。现在所有内容都可以在大约6秒内编译完成。


0

最新的Android Studio 3.0已经不再需要这个了。


-1

进入设置,搜索编译器,在命令行选项中输入“--offline”,然后进行编译。


尝试过了,但没有任何区别。 - Tadej Vengust
在编译独立模块并行运行后进行检查。 - Anand Savjani
1
仍然没有明显的差异 :( - Tadej Vengust

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