4

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

Karim Fikani
  • 356
  • 3
  • 23
  • I have the same problem! plz somebody answer this question :(( – Hamed Ghadirian Sep 21 '16 at 07:35
  • 1
    @HamedGh I found this [link](https://source.android.com/source/jack.html#jack_troubleshooting). Going through it now, but at least there is hope :) – Karim Fikani Sep 21 '16 at 18:35
  • TanX, I asked a similar question [here](http://stackoverflow.com/questions/39610749/upgrade-android-project-to-use-java-8-and-get-gc-overhead-limit-exceeded) and after a few hours found a solution and answer my own question. It may help you too. – Hamed Ghadirian Sep 21 '16 at 20:40
  • @HamedGh I did update AS to 2.2.0 but still no luck. I even set jvmargs to 2048 but build still gets stuck at Building 95% > :app:transformJackWithJackForTabletsDebug. – Karim Fikani Sep 21 '16 at 21:58
  • no, you should update Android Plugin version to 2.2.0 & Gradle Version to 2.14.1 and then open gradle console at build time, it will show you a warning that should set jvmargs to what value – Hamed Ghadirian Sep 22 '16 at 05:22
  • @HamedGh yeh when you update Android Studio to 2.2 it forces you to upgrade gradle to 2.2.0. I don't get the warning about jvmargs because I already have it set to Xmx2048m. Already posted that bug to google. – Karim Fikani Sep 22 '16 at 21:10

2 Answers2

4

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"
}
Robert Limanto
  • 2,068
  • 4
  • 17
  • 27
Yu Jiaao
  • 4,444
  • 5
  • 44
  • 57
  • still it doesn't work. Here is my [link](https://code.google.com/p/android/issues/detail?id=223354) to the ticket that I submitted to google. I even cleared gradle's cache folder under ~/.gradle/cache. – Karim Fikani Nov 08 '16 at 01:42
3

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.

Karim Fikani
  • 356
  • 3
  • 23