yigit / android-priority-jobqueue

A Job Queue specifically written for Android to easily schedule jobs (tasks) that run in the background, improving UX and application stability.
3.4k stars 395 forks source link

Build failed using ProGuard and Gradle #341

Open burton999dev opened 7 years ago

burton999dev commented 7 years ago

I'm using ProGuard v5.3.2. I resolved this issue to add the proguard settings.

-keep interface com.birbit.android.jobqueue.** { *; }

I'm not sure this solution is best. It would be great if the proguard file is officially provided.

Stacktrace:

 org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesAndResourcesWithProguardForFreeProductRelease'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:84)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
    at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228)
    at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:228)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58)
    at org.gradle.execution.taskgraph.ParallelTaskPlanExecutor.process(ParallelTaskPlanExecutor.java:50)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:113)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
    at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:196)
    at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:193)
    at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:193)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:119)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:102)
    at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:71)
    at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
    at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:44)
    at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:29)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:47)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
    at org.gradle.util.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:50)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
 Caused by: java.lang.RuntimeException: Job failed, see logs for details
    at com.android.build.gradle.internal.transforms.ProGuardTransform.transform(ProGuardTransform.java:196)
    at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:185)
    at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:181)
    at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
    at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:176)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:163)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:95)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:76)
    ... 70 more
 Caused by: java.io.IOException: java.lang.IllegalArgumentException: Stack size becomes negative after instruction [149] invokestatic #42 in [com/birbit/android/jobqueue/Job.safeRun(Lcom/birbit/android/jobqueue/JobHolder;ILcom/birbit/android/jobqueue/timer/Timer;)I]
    at com.android.build.gradle.internal.transforms.ProGuardTransform.doMinification(ProGuardTransform.java:283)
    at com.android.build.gradle.internal.transforms.ProGuardTransform.access$000(ProGuardTransform.java:63)
    at com.android.build.gradle.internal.transforms.ProGuardTransform$1.run(ProGuardTransform.java:173)
    at com.android.builder.tasks.Job.runTask(Job.java:48)
    at com.android.build.gradle.tasks.SimpleWorkQueue$EmptyThreadContext.runTask(SimpleWorkQueue.java:41)
    at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:225)
 Caused by: java.lang.IllegalArgumentException: Stack size becomes negative after instruction [149] invokestatic #42 in [com/birbit/android/jobqueue/Job.safeRun(Lcom/birbit/android/jobqueue/JobHolder;ILcom/birbit/android/jobqueue/timer/Timer;)I]
    at proguard.classfile.attribute.visitor.StackSizeComputer.evaluateInstructionBlock(StackSizeComputer.java:349)
    at proguard.classfile.attribute.visitor.StackSizeComputer.visitExceptionInfo(StackSizeComputer.java:277)
    at proguard.classfile.attribute.CodeAttribute.exceptionsAccept(CodeAttribute.java:153)
    at proguard.classfile.attribute.visitor.StackSizeComputer.visitCodeAttribute0(StackSizeComputer.java:166)
    at proguard.classfile.attribute.visitor.StackSizeComputer.visitCodeAttribute(StackSizeComputer.java:125)
    at proguard.classfile.editor.StackSizeUpdater.visitCodeAttribute(StackSizeUpdater.java:49)
    at proguard.classfile.editor.MemberReferenceFixer.visitCodeAttribute(MemberReferenceFixer.java:322)
    at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:101)
    at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:81)
    at proguard.classfile.editor.MemberReferenceFixer.visitProgramMember(MemberReferenceFixer.java:285)
    at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:92)
    at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:73)
    at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:516)
    at proguard.classfile.editor.MemberReferenceFixer.visitProgramClass(MemberReferenceFixer.java:82)
    at proguard.classfile.ProgramClass.accept(ProgramClass.java:358)
    at proguard.classfile.ClassPool.classesAccept(ClassPool.java:124)
    at proguard.optimize.Optimizer.execute(Optimizer.java:578)
    at proguard.ProGuard.optimize(ProGuard.java:328)
    at proguard.ProGuard.execute(ProGuard.java:127)
    at com.android.build.gradle.internal.transforms.BaseProguardAction.runProguard(BaseProguardAction.java:54)
    at com.android.build.gradle.internal.transforms.ProGuardTransform.doMinification(ProGuardTransform.java:254)
    ... 5 more
aried3r commented 7 years ago

It would be great if the proguard file is officially provided.

I'd love that as well! https://developer.android.com/studio/projects/android-library.html#Considerations mentions how you can use consumerProguardFiles to provide Proguard rules with your library.

yigit commented 7 years ago

yea, this should be added.

guillerodriguez commented 6 years ago

With android-priority-jobqueue 2.0.1 and Proguard v5.3.3, the build fails with this:

Warning: com.birbit.android.jobqueue.scheduling.GcmJobSchedulerService: can't find superclass or interface com.google.android.gms.gcm.GcmTaskService
Warning: com.birbit.android.jobqueue.scheduling.GcmJobSchedulerService: can't find referenced class com.google.android.gms.gcm.GcmTaskService
Warning: com.birbit.android.jobqueue.scheduling.GcmJobSchedulerService: can't find referenced class com.google.android.gms.gcm.GcmNetworkManager
Warning: com.birbit.android.jobqueue.scheduling.GcmJobSchedulerService: can't find referenced class com.google.android.gms.gcm.GcmTaskService
Warning: com.birbit.android.jobqueue.scheduling.GcmJobSchedulerService: can't find referenced class com.google.android.gms.gcm.TaskParams
Warning: com.birbit.android.jobqueue.scheduling.GcmJobSchedulerService: can't find referenced class com.google.android.gms.gcm.TaskParams
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.GcmNetworkManager
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.GcmNetworkManager
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.GcmNetworkManager
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.Task
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.TaskParams
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.GcmNetworkManager
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.TaskParams
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.TaskParams
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.GcmNetworkManager
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.OneoffTask$Builder
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.TaskParams
Warning: com.birbit.android.jobqueue.scheduling.GcmScheduler: can't find referenced class com.google.android.gms.gcm.TaskParams

I fixed this by adding the following Proguard rules:

-dontwarn com.birbit.android.jobqueue.scheduling.Gcm*
guillerodriguez commented 6 years ago

BTW I did not need to add -keep interface com.birbit.android.jobqueue.** { *; } ; my build does not fail if I leave that out.