【问题标题】:Gradle build hanging when jackOptions is enabled for Java 1.8当为 Java 1.8 启用 jackOptions 时,Gradle 构建挂起
【发布时间】:2016-09-12 19:08:24
【问题描述】:

我想在我的项目中使用 lambda,所以我决定切换到 Java 1.8。 Android Studio (2.1.3) 强制我启用 jackOptions。此外,我确实在我的 Mac 上安装了 Java 1.8,当我在终端中运行 javac -version 时,我得到 javac 1.8.0_101 并且 android studio 中的 JDK 指向正确的。

当我尝试构建我的项目时,gradle 卡在: :app:compileDebugJavaWithJack

我做了以下,但没有任何效果:

  • gradlew 清洁
  • git clean -fdx 并重新导入项目
  • gradlew --stacktrace assemble

如果我恢复到 Java 1.7,我将失去 lambdas 功能,但项目可以正常构建。

任何想法可能是什么问题?

更新

好的,等了5多分钟终于gradle确实吐出了以下错误:

ERROR: Dex writing phase: classes.dex has too many IDs. Try using multi-dex

com.android.jack.api.v01.CompilationException: Dex writing phase: classes.dex has too many IDs. Try using multi-dex
        at com.android.jack.api.v01.impl.Api01ConfigImpl$Api01CompilationTaskImpl.run(Api01ConfigImpl.java:113)
        at com.android.builder.core.AndroidBuilder.convertByteCodeUsingJackApis(AndroidBuilder.java:1852)
        at com.android.builder.core.AndroidBuilder.convertByteCodeUsingJack(AndroidBuilder.java:1679)
        at com.android.build.gradle.internal.transforms.JackTransform.runJack(JackTransform.java:221)
        at com.android.build.gradle.internal.transforms.JackTransform.transform(JackTransform.java:195)
        at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:178)
        at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:174)
        at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:156)
        at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:173)
        at sun.reflect.GeneratedMethodAccessor412.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.doExecute(AnnotationProcessingTaskFactory.java:245)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:221)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.execute(AnnotationProcessingTaskFactory.java:232)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:210)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:66)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: com.android.jack.JackAbortException: Dex writing phase: classes.dex has too many IDs. Try using multi-dex
        at com.android.jack.backend.dex.DexFileWriter.run(DexFileWriter.java:90)
        at com.android.jack.backend.dex.DexFileWriter.run(DexFileWriter.java:41)
        at com.android.sched.scheduler.ScheduleInstance.runWithLog(ScheduleInstance.java:203)
        at com.android.sched.scheduler.MultiWorkersScheduleInstance$SequentialTask.process(MultiWorkersScheduleInstance.java:466)
        at com.android.sched.scheduler.MultiWorkersScheduleInstance$Worker.run(MultiWorkersScheduleInstance.java:163)
Caused by: com.android.jack.backend.dex.DexWritingException: Dex writing phase: classes.dex has too many IDs. Try using multi-dex
        at com.android.jack.backend.dex.SingleDexWritingTool.write(SingleDexWritingTool.java:59)
        at com.android.jack.backend.dex.DexFileWriter.run(DexFileWriter.java:87)
        ... 4 more
Caused by: com.android.jack.backend.dex.SingleDexOverflowException: classes.dex has too many IDs. Try using multi-dex
        ... 6 more
Caused by: com.android.jack.tools.merger.MethodIdOverflowException: Method ID overflow when trying to merge dex files
        at com.android.jack.tools.merger.ConstantManager.addDexFile(ConstantManager.java:177)
        at com.android.jack.tools.merger.JackMerger.addDexFile(JackMerger.java:69)
        at com.android.jack.backend.dex.DexWritingTool.mergeDex(DexWritingTool.java:149)
        at com.android.jack.backend.dex.SingleDexWritingTool.write(SingleDexWritingTool.java:57)
        ... 5 more
:app:transformJackWithJackForTabletsDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformJackWithJackForTabletsDebug'.
> com.android.build.api.transform.TransformException: com.android.jack.api.v01.CompilationException: Dex writing phase: classes.dex has too many IDs. Try using multi-dex

所以我确实打开了 multidex,但它卡在了 构建 96% > :app:transformJackWithJackForTabletsDebug

【问题讨论】:

  • 我也有同样的问题!请有人回答这个问题:((
  • @HamedGh 我发现了这个link。现在正在经历它,但至少有希望:)
  • TanX,我问了一个类似的问题here,几个小时后找到了解决方案并回答了我自己的问题。它也可能对您有所帮助。
  • @HamedGh 我确实将 AS 更新到 2.2.0,但仍然没有运气。我什至将 jvmargs 设置为 2048,但 build 仍然卡在 Building 95% > :app:transformJackWithJackForTabletsDebug.
  • 不,您应该将 Android 插件版本更新为 2.2.0 并将 Gradle 版本更新为 2.14.1,然后在构建时打开 gradle 控制台,它会显示一个警告,应该将 jvmargs 设置为什么值

标签: java android gradlew


【解决方案1】:

我通过在 app/build.gradle multiDexEnabled = true 中添加一行来解决,如下所示

android{
...
    compileSdkVersion rootProject.compileVersion
    buildToolsVersion rootProject.buildToolsVersion
    defaultConfig {
       multiDexEnabled true
    }

...
}

并在项目 build.gradle 中

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'        
    }
}

allprojects {
    repositories {
        jcenter()

    }

}

ext {
    buildToolsVersion = "24.0.3"
    supportLibVersion = "24.2.1"
}

【讨论】:

  • 还是不行。这是我提交给谷歌的票的link。我什至清除了 ~/.gradle/cache 下 gradle 的缓存文件夹。
【解决方案2】:

解决方案是将堆大小增加到 6gb 而不是 4gb。我正在构建的项目非常大,构建时间需要 30 分钟才能完成。

您可以在 gradle.properties 中增加堆大小

org.gradle.jvmargs=-Xms256m -Xmx6144m

dexOptions {
        javaMaxHeapSize "6g"
}

您还可以查看我向 google 提交的关于此问题的错误报告 here

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 2021-03-27
    • 2016-04-16
    • 1970-01-01
    • 2021-11-06
    • 2015-08-17
    • 2014-03-22
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多