Gradle 为 Java 1.8 启用 jackOptions 时构建挂起
Gradle build hanging when jackOptions is enabled for Java 1.8
我想在我的项目中使用 lambda,所以我决定切换到 Java 1.8。 Android Studio (2.1.3) 强制我启用 jackOptions。我也确实在 mac 上安装了 Java 1.8,当我在终端中 运行 javac -version 时,我得到了 javac 1.8.0_101 和 JDK 41=] studio 指向右边那个
当我尝试构建我的项目时,gradle 卡在了:
:app:compileDebugJavaWithJack
我做了以下但没有任何效果:
- gradle干净
- git 清除 -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.call(TransformTask.java:178)
at com.android.build.gradle.internal.pipeline.TransformTask.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.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
我通过在 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"
}
解决方案是将堆大小从 4GB 增加到 6GB。我正在构建的项目非常大,构建时间需要 30 分钟才能完成。
您可以在 gradle.properties
中增加堆大小
org.gradle.jvmargs=-Xms256m -Xmx6144m
或
dexOptions {
javaMaxHeapSize "6g"
}
您还可以查看我向 google 提交的有关此问题 here 的错误报告。
我想在我的项目中使用 lambda,所以我决定切换到 Java 1.8。 Android Studio (2.1.3) 强制我启用 jackOptions。我也确实在 mac 上安装了 Java 1.8,当我在终端中 运行 javac -version 时,我得到了 javac 1.8.0_101 和 JDK 41=] studio 指向右边那个
当我尝试构建我的项目时,gradle 卡在了: :app:compileDebugJavaWithJack
我做了以下但没有任何效果:
- gradle干净
- git 清除 -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.call(TransformTask.java:178)
at com.android.build.gradle.internal.pipeline.TransformTask.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.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
我通过在 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"
}
解决方案是将堆大小从 4GB 增加到 6GB。我正在构建的项目非常大,构建时间需要 30 分钟才能完成。
您可以在 gradle.properties
中增加堆大小org.gradle.jvmargs=-Xms256m -Xmx6144m
或
dexOptions {
javaMaxHeapSize "6g"
}
您还可以查看我向 google 提交的有关此问题 here 的错误报告。