Menu

#738 Error after adding Kotlin to existing Android app

v6.0
closed-fixed
Kotlin (1)
High
2019-12-05
2018-12-05
No

I have added in my app Kotlin support for existing app
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.10"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'

I have tried adding those proguard rules :

-dontwarn kotlin.
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembernames class kotlinx. { *; }
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
static void checkParameterIsNotNull(java.lang.Object, java.lang.String);
}

i have tried to remove those rules too, but everytime proguard throw exception :

Warning: Exception while processing task java.io.IOException: java.util.EmptyStackException
Thread(Tasks limiter_5): destruction

Task :app:transformClassesAndResourcesWithProguardForRelease FAILED

FAILURE: Build failed with an exception.

What went wrong:
Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
Job failed, see logs for detail

I am using latest proguard beta. Not using rxjava or any other starnge libraries.
Just android and kotlin

why i this happening ?

Discussion

  • Eric Lafortune

    Eric Lafortune - 2019-01-14

    With the gradle option --info --stacktrace, you should get more information about the crash. That may not be sufficient though. Do you have a small sample project that reproduces the issue?

     
  • Eric Lafortune

    Eric Lafortune - 2019-01-14
    • status: open --> open-works-for-me
    • assigned_to: Eric Lafortune
     
  • Emin Kokalari

    Emin Kokalari - 2019-01-16

    I don't know why but it is solved by using :

    -dontwarn kotlin.
    -keepclassmembernames class kotlin.
    { ; }
    -assumenosideeffects class kotlin.jvm.internal.Intrinsics { static void checkParameterIsNotNull(java.lang.Object, java.lang.String); }
    -keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
    -keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
    -keepclassmembernames class kotlinx.
    * { volatile <fields>; }</fields>

    if remove this line -keepclassmembernames class kotlin.* { ; } it will throw exception.
    Kotlin doesn't say to use this config in official doc.

     
  • Emin Kokalari

    Emin Kokalari - 2019-03-16

    This is the problem :

    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
    > java.io.IOException: java.util.EmptyStackException
    
    * Try:
    Run with --debug option to get more log output. Run with --scan to get full insights.
    
    * Exception is:
    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.accept(ExecuteActionsTaskExecuter.java:121)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.accept(ExecuteActionsTaskExecuter.java:117)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:184)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ResolveIncrementalChangesTaskExecuter.execute(ResolveIncrementalChangesTaskExecuter.java:84)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:91)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(ResolveBeforeExecutionStateTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
        at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:93)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:45)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:94)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:63)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:46)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    Caused by: java.lang.RuntimeException: java.io.IOException: java.util.EmptyStackException
        at com.android.builder.profile.Recorder$Block.handleException(Recorder.java:55)
        at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:107)
        at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
        at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:73)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$4.run(ExecuteActionsTaskExecuter.java:338)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:327)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:312)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:75)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:158)
        at org.gradle.internal.execution.impl.steps.ExecuteStep.execute(ExecuteStep.java:46)
        at org.gradle.internal.execution.impl.steps.CancelExecutionStep.execute(CancelExecutionStep.java:34)
        at org.gradle.internal.execution.impl.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:69)
        at org.gradle.internal.execution.impl.steps.TimeoutStep.execute(TimeoutStep.java:49)
        at org.gradle.internal.execution.impl.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
        at org.gradle.internal.execution.impl.steps.CreateOutputsStep.execute(CreateOutputsStep.java:49)
        at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:42)
        at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:28)
        at org.gradle.internal.execution.impl.steps.CacheStep.executeWithoutCache(CacheStep.java:133)
        at org.gradle.internal.execution.impl.steps.CacheStep.lambda$execute$5(CacheStep.java:83)
        at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:82)
        at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:37)
        at org.gradle.internal.execution.impl.steps.PrepareCachingStep.execute(PrepareCachingStep.java:33)
        at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:38)
        at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:23)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:95)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:88)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:34)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:109)
        ... 37 more
    Caused by: java.io.IOException: java.util.EmptyStackException
        at com.android.build.gradle.internal.transforms.ProGuardTransform.doMinification(ProGuardTransform.java:261)
        at com.android.build.gradle.internal.transforms.ProGuardTransform.lambda$transform$0(ProGuardTransform.java:180)
        at com.android.build.gradle.internal.tasks.WorkLimiter.limit(WorkLimiter.kt:38)
        at com.android.build.gradle.internal.transforms.ProGuardTransform.transform(ProGuardTransform.java:178)
        at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239)
        at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235)
        at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:105)
        ... 75 more
    Caused by: java.util.EmptyStackException
        at proguard.obfuscate.MappingPrinter.visitLineNumberTableAttribute(MappingPrinter.java:233)
        at proguard.classfile.attribute.LineNumberTableAttribute.accept(LineNumberTableAttribute.java:158)
        at proguard.classfile.attribute.CodeAttribute.attributesAccept(CodeAttribute.java:239)
        at proguard.obfuscate.MappingPrinter.visitCodeAttribute(MappingPrinter.java:136)
        at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:141)
        at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:101)
        at proguard.obfuscate.MappingPrinter.visitProgramMethod(MappingPrinter.java:114)
        at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:93)
        at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:588)
        at proguard.obfuscate.MappingPrinter.visitProgramClass(MappingPrinter.java:79)
        at proguard.classfile.ProgramClass.accept(ProgramClass.java:430)
        at proguard.classfile.ClassPool.classesAcceptAlphabetically(ClassPool.java:144)
        at proguard.obfuscate.Obfuscator.execute(Obfuscator.java:475)
        at proguard.ProGuard.obfuscate(ProGuard.java:456)
        at proguard.ProGuard.execute(ProGuard.java:187)
        at com.android.build.gradle.internal.transforms.BaseProguardAction.runProguard(BaseProguardAction.java:66)
        at com.android.build.gradle.internal.transforms.ProGuardTransform.doMinification(ProGuardTransform.java:255)
        ... 81 more
    
     
  • Emin Kokalari

    Emin Kokalari - 2019-03-16

    I don't know why but the issue doesn't happen if add this rule :

    -keepclassmembernames class kotlin.** { public <methods>; }

    I am using :

    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.21'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'
    
     
  • Pascal Dal Farra

    FYI, I was using Proguard 6.0.3 on my Android java projects (no kotlin).

    Then I updated some dependencies and Proguard 6.0.3 was hanging probably because of https://github.com/square/okio/issues/516 )

    So I bumped to Proguard 6.1.1 and now I have this very same bug.

    As Emin Kokalari, I added

    -keepclassmembernames class kotlin.** { public <methods>; }
    

    and the problem is now solved.

    FYI, dependencies:

    dependencies {
        implementation 'com.google.android.exoplayer:exoplayer:2.10.4'
    
        implementation 'com.google.code.gson:gson:2.8.5'
    
        implementation 'com.squareup.retrofit2:retrofit:2.6.1'
        implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
        implementation 'com.squareup.retrofit2:converter-simplexml:2.6.1'
        implementation 'com.squareup.okhttp3:logging-interceptor:4.1.1'
    
    }
    

    Would this be okhttp / retrofit that causes this issue by bringing some kotlin in the game?
    Possibly through this path up to okio and then kotlin? (version numbers are not correct/checked: I just copied this from another dependenciy tree)

    +--- com.squareup.okhttp3:okhttp:3.11.0
    |    \--- com.squareup.okio:okio:1.14.0 -> 2.1.0
    |         \--- org.jetbrains.kotlin:kotlin-stdlib:1.2.60 -> 1.2.71
    |              +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.2.71
    |              \--- org.jetbrains:annotations:13.0
    
     

    Last edit: Pascal Dal Farra 2019-09-06
  • John Brewot

    John Brewot - 2019-11-13

    Hello. Any news on this issue?
    I'm still able to reproduce it on newest Kotlin 1.3.50 + Proguard 6.2.0 in Android project.
    Also, usage of AspectJ leads to same problems.

    Ignore Koltin classed is not an option for performance reason of our project.
    There is a way to debug ProGuard someway to find where the issue exact.

    Thanks.

     
  • Jakub Broz

    Jakub Broz - 2019-11-26

    We have the same issue with Kotlin 1.3.60 + proguard 6.2.0

     
  • zyz36134

    zyz36134 - 2019-11-28

    This patch fixes the issue. We need check that stack is not empty like few lines above.

    --- core/src/proguard/obfuscate/MappingPrinter.java
    +++ core/src/proguard/obfuscate/MappingPrinter.java
    @@ -230,7 +230,9 @@
    {
    // When exiting a top-level inlined block, the source might be null.
    // See LineNumberLinearizer, line 185, exiting an inlined block.
    - enclosingLineNumbers.pop();
    + if (!enclosingLineNumbers.isEmpty()) {
    + enclosingLineNumbers.pop();
    + }
    }

    But also seems that some logic is missed here and we should not receive such error.
    I beleive that error occurs after inlined method lines printing was added in ProGuard 6.1.

     

    Last edit: zyz36134 2019-11-28
  • T. Neidhart

    T. Neidhart - 2019-12-05
    • status: open-works-for-me --> closed-fixed
     
  • T. Neidhart

    T. Neidhart - 2019-12-05

    This problem has been fixed and will be included in the upcoming release 6.2.1.

     

Log in to post a comment.