要在进程中运行 dex,Gradle 守护进程需要更大的堆。它目前大约有 910 MB

Posted

技术标签:

【中文标题】要在进程中运行 dex,Gradle 守护进程需要更大的堆。它目前大约有 910 MB【英文标题】:To run dex in process, the Gradle daemon needs a larger heap. It currently has approximately 910 MB 【发布时间】:2016-09-02 13:48:16 【问题描述】:

每次我运行我的应用程序时都会收到这个 Gradle 错误。错误是:

要在进程中运行 dex,Gradle 守护进程需要更大的堆。 它目前大约有 910 MB。

为了加快构建速度,请将 Gradle 守护程序的最大堆大小增加到 2048 MB 以上。

为此,请在项目 gradle.properties 中设置 org.gradle.jvmargs=-Xmx2048M。 欲了解更多信息,请参阅https://docs.gradle.org/current/userguide/build_environment.html

这是我的 build.gradle (Module:app) 文件:

apply plugin: 'com.android.application'

    android 
        compileSdkVersion 23
        buildToolsVersion "23.0.3"

        defaultConfig 
            applicationId "mobileapp.tech2dsk"
            minSdkVersion 15
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        
        buildTypes 
            release 
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            
        
    

    dependencies 
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.3.0'
        compile 'com.android.support:design:23.3.0'
    

这是我的 build.gradle(Project) 文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript 
    repositories 
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:2.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    


allprojects 
    repositories 
        jcenter()
    


task clean(type: Delete) 
    delete rootProject.buildDir

这是我的 gradle.properties 文件:

# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true

【问题讨论】:

【参考方案1】:

2017 年 6 月 25 日更新

在 Google IO 2017 上,有一些关于这个主题的更新。不再推荐在 dexOptions 上设置 flag,所以如果你有类似 next 的东西,你可以删除它。

dexOptions 
   javaMaxHeapSize "2g"

来源:Speeding Up Your Android Gradle Builds

原答案:

Android Studio 2.1 启用了与 Gradle 共享 VM 的 Dex In Process,以缩短构建时间。因此,有必要增加 Gradle 守护程序的大小以合并这些 Dex 进程。

至少需要 2 个内存,但如果你负担得起的话,你可以尝试 3 个。

gradle.properties.

org.gradle.jvmargs=-Xmx3072m

默认情况下,Java 最大堆大小为 1 gig,但如果您在 build.gradle 文件中对其进行了修改...

build.gradle(应用程序)

dexOptions 
   javaMaxHeapSize "2g"

...您必须相应地调整 Gradle 守护程序的大小(必须更大以适应堆)。

资源

    Official blog post by Reto Meier Official Video in Android Developers DexOptions docs.

注意事项:

请注意上述数字因机器而异。

【讨论】:

使用 Ionic 构建应用的朋友可以org.gradle.jvmargs=-Xmx3072m~/.gradle/gradle.properties 这个答案应该被接受为正确的答案。谢谢,顺便说一句 在 Android Studio 3.0 上删除 javaMaxHeapSize 将我的增量构建时间从 90 秒减少到 7 秒。 多年来,我的 gradle 中有这个,目前为 4g,并且讨厌随着时间的推移它总是必须被倾向于(提升)。现在显然我可以摆脱这种混乱。正如 dell116 所说,消除它极大地减少了我的 gradle 构建时间。【参考方案2】:

添加你的 Build.gradle

android 
 dexOptions 
    javaMaxHeapSize "4g"
  

更多信息 - Android Gradle: What is javaMaxHeapSize "4g"?

【讨论】:

在模块应用程序或项目文件中 build.gradle(模块应用) 如果你不介意能告诉我为什么会出现这些错误 对不起,这也不起作用,在数字中出现同样的错误 您还必须添加 org.gradle.jvmargs=-Xmx2048m 您可以根据您在堆中分配的 ram 更改数字 2048。【参考方案3】:

只需将其留在您的 gradle.properties 中:

org.gradle.jvmargs=-Xmx2048m 

你可以看that article as reference.

【讨论】:

太棒了!这个问题让我发疯了,这立即解决了。谢谢 在cordova项目中,gradle.properties文件应该在platforms/android/gradle.properties中创建 我没有找到那个文件。我只有 project.properties【参考方案4】:

我知道答案为时已晚,但希望对某人有所帮助

我已经尝试了很多东西并进行了很多搜索,但没有什么对我有用,包括关注和 build.gradle (App) 在我的情况下也不起作用

android 
  dexOptions 
    javaMaxHeapSize "4g"
  

您也可以尝试在 gradle.properties 上添加:

org.gradle.jvmargs=-Xmx2048m 

在我的情况下,问题是 cpu 利用率有很多进程在运行,而我构建 apk 我只是杀死了一些进程,如 genymotion、skype、safari 等,而不是使缓存无效/重新启动它对我有用。

【讨论】:

推荐,谢谢,可能是因为整个项目的大小对于默认的 Java 堆大小来说太大了,仍然感谢。继续摇摆兄弟!【参考方案5】:

在以下目录中修改或创建一个名为 gradle.properties 的文件。

对于 Mac, /Users/USER_NAME/.gradle/gradle.properties

对于 Linux, /home/USER_NAME/.gradle/gradle.properties

对于 Windows, C:\Users\USER_NAME.gradle\gradle.properties

并应用上述更改。最后应该是这样的,

org.gradle.daemon=true

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
org.gradle.parallel=true

org.gradle.configureondemand=true

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

请参考此链接 https://tausiq.wordpress.com/2015/02/24/android-speed-up-gradle-build-process-in-android-studio/

【讨论】:

"以上" ?也许您的意思是“关注”之类的? 该位置没有 gradle.properties 文件 谢谢!尝试了一切,这只是一个对我有用的! Java 似乎忽略了 gradle.properties 和 build.gradle 等中列出的所有其他设置。【参考方案6】:

您可以像这样更改build.gradle(就像 Veeresh Charantimath 建议的那样):

android 
 dexOptions 
    javaMaxHeapSize "2g"
 

然后你可能不得不乱用MultiDex stuff(你将需要它用于大型android项目)。 但是您的问题可能更简单。您可能会编译并在项目中包含一些不需要的库。我在我的小项目中遇到了这个问题。这是我为修复它所做的:

我从build.gradle 删除了这个:

dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])

我手动从应用程序根目录中删除了我的构建文件夹。问题解决了。

【讨论】:

【参考方案7】:

是错误还是警告?

有时这只是一个警告,我可以成功构建它:

:transformClassesWithDexForDebug
To run dex in process, the Gradle daemon needs a larger heap.
It currently has approximately 910 MB.
For faster builds, increase the maximum heap size for the Gradle daemon to more than 2048 MB.
To do this set org.gradle.jvmargs=-Xmx2048M in the project gradle.properties.
For more information see https://docs.gradle.org/current/userguide/build_environment.html
:mergeDebugJniLibFolders UP-TO-DATE
:transformNative_libsWithMergeJniLibsForDebug
:processDebugJavaRes UP-TO-DATE
:transformResourcesWithMergeJavaResForDebug
:validateDebugSigning
:packageDebug
:zipalignDebug
:assembleDebug
:cdvBuildDebug

BUILD SUCCESSFUL

Total time: 3 mins 44.991 secs
Built the following apk(s):
(...)

所以可能阻止成功构建的问题可能是另一个问题......

【讨论】:

【参考方案8】:

在 WINDOW'S 中打开 ~\Users\UserName\.gradle 中的 gradle.properties,如下所示:了解更多信息 enter link description here

并确保将其值设置为最小值为 4608M,如下所示以加快构建速度 org.gradle.jvmargs=-Xmx4608M

一旦你这样做了,你就可以看到构建应用程序的速度的昼夜差异......

【讨论】:

C:\Users\USER\.gradle 中没有名称为:gradle.properties 的文件。【参考方案9】:

我很确定 javaMaxHeapSizeorg.gradle.jvmargs 是互斥的。

javaMaxHeapSize 是旧的做法,dex 在进程之外运行。这将是 dex 进程的参数。 org.gradle.jvmargs 是新的做法,在 gradle 进程中使用 dex。这是整个进程(gradle,包括dex)的最大内存

警告的意思是 org.gradle.jvmargs 应该 >= javaMaxHeapSize (what you used previously for dex) + 512M (an estimation of what's needed for gradle own needs)

所以如果你想在进程中使用 dex(这样更快),你不应该关心javaMaxHeapSize。只需将 org.gradle.jvmargs 设置为您的项目/机器的正确值。

【讨论】:

【参考方案10】:

似乎有一个错误:

https://code.google.com/p/android/issues/detail?id=208214

使用com.android.tools.build:gradle:2.1.2 我将org.gradle.jvmargs=-Xmx3415M 设置为dexOptions.javaMaxHeapSize "2g" 并且错误消息消失了。

【讨论】:

【参考方案11】: 请首先检查项目根目录中的 gradle.propertises。

如果不存在,请像这样创建一个文件,然后添加 org.gradle.jvmargs=-Xmx1536m

否则,如果已经存在,请增加大小。

我遇到了同样的问题,我已经通过这种方式解决了。

【讨论】:

【参考方案12】:

例如,在项目根目录的 gradle.properties 中。

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m

【讨论】:

【参考方案13】:

试试这个

defaultConfig 
    ...

    // Enabling multidex support.
    multiDexEnabled true

【讨论】:

您好,您的回答不是解决问题,您正在淹死自己以及 SO 的用户。请删除此答案以恢复您的正面评价。谢谢。

以上是关于要在进程中运行 dex,Gradle 守护进程需要更大的堆。它目前大约有 910 MB的主要内容,如果未能解决你的问题,请参考以下文章

jvmargs=-xmx2048m dex 正在处理cordova

我得到执行异常和大堆错误

20. Gradle编译其他应用代码流程(七) - 守护进程编译

gradle 命令失败,因为它无法启动守护进程

Jenkins 使用 Gradle 守护进程构建失败

启动Gradle守护程序,1个忙碌和6个停止的守护进程无法重用,请使用--status获取详细信息