Gradle build hanging when jackOptions is enabled for Java 1.8

柔情痞子 提交于 2019-12-07 12:23:07

问题


I want to use lambdas in my project so I decided to switch to Java 1.8. Android Studio (2.1.3) forced me to enable jackOptions. Also I did install Java 1.8 on my mac and when I run javac -version in terminal I get javac 1.8.0_101 and the JDK in android studio points to the right one.

When I try to build my project, gradle gets stuck on: :app:compileDebugJavaWithJack

I did the following and nothing worked:

  • gradlew clean
  • git clean -fdx and reimport the project
  • gradlew --stacktrace assemble

If I revert back to Java 1.7 I lose the lambdas feature but project builds properly.

Any ideas what could be the problem?

UPDATE

Ok so after waiting for more than 5 minutes finally gradle did spit the following error:

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

So I did turn on multidex and it got stuck on Building 96% > :app:transformJackWithJackForTabletsDebug


回答1:


I solved by add a line to app/build.gradle multiDexEnabled = true as below

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

...
}

and in the project 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"
}



回答2:


The solution was to increase the heap size to 6gb instead of 4gb. The project that I'm building is pretty big and the build time took 30min to finish.

You can increase the heap size in gradle.properties

org.gradle.jvmargs=-Xms256m -Xmx6144m

or

dexOptions {
        javaMaxHeapSize "6g"
}

You can also check out my bug report to google regarding this issue here.



来源:https://stackoverflow.com/questions/39457116/gradle-build-hanging-when-jackoptions-is-enabled-for-java-1-8

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!