Status Update
Comments
za...@gmail.com <za...@gmail.com> #2
ag...@google.com <ag...@google.com>
ag...@google.com <ag...@google.com>
ze...@google.com <ze...@google.com> #3
In my opinion, at least one of the two should change with regards to the behavior of Excusing an assignment:
1. Any original score returned to the student should be erased from the submission entirely. This should make the returned grade empty/null, so the API response does not need any special indicator for an excused grade.
2. If a returned grade should still be associated with a submission (but not count towards the overall grade like the Google Classroom UI calculates), then this same flag/indicator should be exposed via the API so that a similar overall grade calculation can be performed from the API response.
ze...@google.com <ze...@google.com> #4
Thanks for providing feedback around supporting excused assignments in the Classroom API! I've made a note of your comments and transferred them internally. Any updates about this will be communicated here.
ze...@google.com <ze...@google.com> #5
We are an SIS that consumes Classroom data via the API.
What we are observing:
- we don't get StudentSubmissions where student was never scored and was excused, so parents are confused thinking that work is not done when it should be excused when looking in our platform.
- When a student is scored, grades are synced, then excused, we don't get the update that the assignment was excused. So now the student has a score (0 or otherwise) that doesn't reflect what's in Google Classroom, creating discrepancies between Classroom assignment grades and SIS assignment grades.
ze...@google.com <ze...@google.com> #6
Thanks for providing supporting feedback. I'd love to learn a bit more about your comment:
"we don't get StudentSubmissions where student was never scored and was excused, so parents are confused thinking that work is not done when it should be excused when looking in our platform."
Can you provide more information on the API call you are making here so I can try to figure out the issue? I'm not able to reproduce this at the moment; when reading student submissions by calling ListStudentSubmissions, I'm able to retrieve submissions that are marked as excused in the UI.
"When a student is scored, grades are synced, then excused, we don't get the update that the assignment was excused. So now the student has a score (0 or otherwise) that doesn't reflect what's in Google Classroom, creating discrepancies between Classroom assignment grades and SIS assignment grades."
Trying to understand this issue a bit further - if I understand correctly, there may be grade discrepancies between Classroom and SIS in the event that a teacher modifies a grade after the grades have been synced with the SIS. Do you have a mechanism today by which you monitor these types of grade changes? If not, is being alerted about excused assignments more important than other types of submission changes?
za...@gmail.com <za...@gmail.com> #7
We use a platform (Schoolytics) that mines the data from Classroom via the API to give parents and students updates and reports about their students' progress. Unfortunately, excused assignments (e.g. because the student was not yet enrolled at our school) are being misidentified as missing.
We use Aeries as our SIS and gradebooks.
cl...@mobilepay.dk <cl...@mobilepay.dk> #8
However, I am not sure if there is some other situation when {} gets added to the `submissionHistory` as well and thus breaking this workaround. I did not encounter any other situation when this happens.
UPDATE: As noticed by 34...@gmail.com, marking solution as complete by the teacher also adds empty object which breaks this solution unfortunately.
ze...@google.com <ze...@google.com> #9
zs...@salesforce.com <zs...@salesforce.com> #10
ze...@google.com <ze...@google.com> #11
To revive it, I had ChatGPT look at this important issue, and effectively stumped it. Specifically, I gave it quite a bit of output from the log consisting of paired assignment/submission objects in JSON. I manually marked the EXCUSED entries and asked it to compare these to the unmarked ones to find patterns helpful for detecting excused assignments programmatically. I thought ChatGPT's (rather bleak) assessment was pretty spot on, so I'll share:
Short Answer: Unfortunately, Google Classroom’s API does not expose “Excused” in its returned data, even though Classroom’s front-end UI does let a teacher mark certain student assignments “Excused.” There is no separate field
excused
in the JSON you receive.Because of that, there’s no sure-fire pattern in the API data alone (e.g. grade = 0 or missing) that tells you “this was marked as Excused in Classroom.” The only way to see that directly is from the teacher’s perspective in the web UI, or by manually adding your own flag in any software you build around the Classroom API.
Why We Can’t Detect “Excused” from the Classroom API
- Google’s Docs Omit Excused The official Classroom API docs don’t mention any field to store or return an “Excused” status. The states we can see are things like
CREATED
,TURNED_IN
, orRETURNED
, plus numeric grades ordraftGrade
, but “Excused” never appears as a separate field.- No Hints in the JSON If you look over the raw JSON for each submission, you’ll notice no consistent or even hidden property that flips from false to true for “excused.” Some submissions have no grades, others do. Some are turned in, others aren’t—none of it correlates reliably to “excused.”
- Google’s UI vs. Under-the-Hood The Classroom GUI is effectively toggling an internal “excused” marker that Google does not share in the public API. This is similar to how some SIS features in Classroom do not appear in the standard data feed.
Bottom Line
Right now, the official Classroom API simply does not expose the “Excused” status. Your only options are to keep tagging “excused” in your own records—or file a feature request with Google to add it to the Classroom API. But there is no built-in field or pattern in the raw submission JSON that reveals whether a teacher checked the “Excused” box in the Classroom web interface.`
My bottom line: Seems like a pretty simple solution to add a boolean attribute to the submission object called Excused
.
sg...@google.com <sg...@google.com> #12
The reason for the strange desugared-library-identifiers
value of desugared-library-identifiers":["com.tools.android:desugar_jdk_libs:0.11.1"]
in com.tools.android:desugar_jdk_libs:1.0.5
has a dependency on com.tools.android:desugar_jdk_libs_configuration:0.11.1
, and the marker take the version from com.tools.android:desugar_jdk_libs_configuration
and combines it with com.tools.android:desugar_jdk_libs
.
Opened
cl...@mobilepay.dk <cl...@mobilepay.dk> #13
find . -name \*wrapper\*Spliterator\$-WRP.smali
./smali_classes3/j$/$r8$wrapper$java$util$Spliterator$-WRP.smali
./smali_classes5/$r8$wrapper$java$util$Spliterator$-WRP.smali
./smali_classes2/$r8$wrapper$java$util$Spliterator$-WRP.smali
ze...@google.com <ze...@google.com> #14
We have confirmed the issue is due to the duplicate classes in the non-j$ top-level package. The VM behavior duplicate classes is undefined and on some older VMs leads to errors (likely due to direct class constant references, but that is not verified). The compilers are assuming that a final merge step with D8 which will correctly de-duplicate these, but in the debug build that merge is not done for libraries which are instead appended as addition classesX.dex files.
Any release build (with or without R8) should not have this issue as the final merge step is always done for that. Is that consistent with your observations?
CC Ivan, regarding the build aspects of this issue.
zs...@salesforce.com <zs...@salesforce.com> #15
Confirmed that if I set isDebuggable
to false for my debug build, it works on an API 23 device. Also, if it's of any interest, I tried with the desugar_jdk_libs_configuration
dependency only and got a slightly different error in the above repro project
06-03 23:45:25.329 6519-6519/io.sweers.catchup.debug E/AndroidRuntime: FATAL EXCEPTION: main
Process: io.sweers.catchup.debug, PID: 6519
java.lang.NoClassDefFoundError: androidx.collection.ArrayMap
at com.google.firebase.FirebaseApp.<clinit>(com.google.firebase:firebase-common@@19.3.0:102)
at com.google.firebase.FirebaseApp.initializeApp(com.google.firebase:firebase-common@@19.3.0:240)
at com.google.firebase.provider.FirebaseInitProvider.onCreate(com.google.firebase:firebase-common@@19.3.0:51)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1748)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1723)
at com.google.firebase.provider.FirebaseInitProvider.attachInfo(com.google.firebase:firebase-common@@19.3.0:45)
at android.app.ActivityThread.installProvider(ActivityThread.java:5153)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4748)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688)
at android.app.ActivityThread.-wrap1(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
ze...@google.com <ze...@google.com> #16
I've not been able to reproduce the issue on a headless 6.0.1 VM. The proper fix is to simply not have duplicates, which we can ensure without an exact regression.
ga...@google.com <ga...@google.com> #17
Is $r8$wrapper$java$util$Spliterator$-WRP.smali
created by L8? If so, we can make sure to have a single L8 invocation for both desugar_jdk_libs_configuration
and android:desugar_jdk_libs
. If it is coming from user code, it becomes more tricky as it introduces dependencies between (right now) independent D8 invocations.
ze...@google.com <ze...@google.com> #18
The present issue can be avoided by only generating a single such conversion wrapper and placing it in the core library file. Currently these are created on-demand for the program inputs.
lo...@gmail.com <lo...@gmail.com> #19
That's a private issue that we cannot follow @
ze...@google.com <ze...@google.com> #20
ap...@google.com <ap...@google.com> #21
Branch: master
commit f03be11f11b8405b69876d05337e917a5519e52a
Author: Ian Zerny <zerny@google.com>
Date: Fri Jun 12 11:35:52 2020
Generate conversion wrappers in the desugared library.
Bug: 157681341
Bug: 158645207
Change-Id: I558fcb4a53c4ae97cb1a27629f7d0572c41fbb1c
M src/main/java/com/android/tools/r8/L8.java
M src/main/java/com/android/tools/r8/dex/ApplicationReader.java
M src/main/java/com/android/tools/r8/dex/CodeToKeep.java
M src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
M src/main/java/com/android/tools/r8/graph/analysis/DesugaredLibraryConversionWrapperAnalysis.java
M src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
M src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryConfiguration.java
M src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryConfigurationParser.java
M src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
M src/main/java/com/android/tools/r8/shaking/Enqueuer.java
M src/main/java/com/android/tools/r8/utils/AndroidApp.java
M src/main/java/com/android/tools/r8/utils/InternalOptions.java
A src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibaryChecksumsTest.java
M src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
M src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
M src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/FunctionConversionTest.java
M src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperMergeTest.java
ze...@google.com <ze...@google.com> #22
buildscript {
repositories {
maven {
url "
}
}
dependencies {
classpath 'com.android.tools:r8:f03be11f11b8405b69876d05337e917a5519e52a' // Must be before the Gradle Plugin for Android.
classpath 'com.android.tools.build:gradle:X.Y.Z' // Your current AGP version.
}
}
FYI, this fix is not ready to be merged to release branches as we want to further change the setup to have an exact list of wrapper types.
zs...@salesforce.com <zs...@salesforce.com> #23
Trying now!
Sidenote - I get a warning from somewhere in AGP about using this, dunno if it matters
Cannot parse shrinker version, assuming 0.0.0
zs...@salesforce.com <zs...@salesforce.com> #24
We get a different failure trying that commit, but just during build time and seems unrelated to library desugaring. Looks to be originating from the coroutines android artifact:
[2020-06-15T19:24:17.306Z] > com.android.tools.r8.CompilationFailedException: Compilation failed to complete, position: Lkotlinx/coroutines/internal/MainDispatcherLoader;loadMainDispatcher()Lkotlinx/coroutines/MainCoroutineDispatcher;, origin: /mnt/jenkinsslave/gradle_home/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.3.7/8e2eb78158638b33793d204ffef0b65c4a578e1c/kotlinx-coroutines-core-1.3.7.jar:kotlinx/coroutines/internal/MainDispatcherLoader.class
[2020-06-15T19:24:17.306Z]
[2020-06-15T19:24:17.306Z] * Try:
[2020-06-15T19:24:17.306Z] Run with --info or --debug option to get more log output. Run with --scan to get full insights.
[2020-06-15T19:24:17.306Z]
[2020-06-15T19:24:17.306Z] * Exception is:
[2020-06-15T19:24:17.307Z] org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:minifyExternalReleaseWithR8'.
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:207)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:205)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
[2020-06-15T19:24:17.307Z] at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
[2020-06-15T19:24:17.307Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
[2020-06-15T19:24:17.307Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
[2020-06-15T19:24:17.307Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
[2020-06-15T19:24:17.307Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
[2020-06-15T19:24:17.307Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
[2020-06-15T19:24:17.307Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
[2020-06-15T19:24:17.307Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
[2020-06-15T19:24:17.307Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
[2020-06-15T19:24:17.307Z] Caused by: org.gradle.internal.UncheckedException: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, position: Lkotlinx/coroutines/internal/MainDispatcherLoader;loadMainDispatcher()Lkotlinx/coroutines/MainCoroutineDispatcher;, origin: /mnt/jenkinsslave/gradle_home/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.3.7/8e2eb78158638b33793d204ffef0b65c4a578e1c/kotlinx-coroutines-core-1.3.7.jar:kotlinx/coroutines/internal/MainDispatcherLoader.class
[2020-06-15T19:24:17.307Z] at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:67)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:41)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:107)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:726)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:693)
[2020-06-15T19:24:17.307Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:569)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
[2020-06-15T19:24:17.307Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:84)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
[2020-06-15T19:24:17.308Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:554)
[2020-06-15T19:24:17.308Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:537)
[2020-06-15T19:24:17.308Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
[2020-06-15T19:24:17.308Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:278)
[2020-06-15T19:24:17.308Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:267)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CacheStep.executeAndStoreInCache(CacheStep.java:135)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CacheStep.lambda$executeWithCache$2(CacheStep.java:112)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CacheStep.lambda$executeWithCache$3(CacheStep.java:112)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.Try$Success.map(Try.java:162)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CacheStep.executeWithCache(CacheStep.java:81)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:71)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
[2020-06-15T19:24:17.308Z] at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:194)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
[2020-06-15T19:24:17.309Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
[2020-06-15T19:24:17.309Z] at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
[2020-06-15T19:24:17.309Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
[2020-06-15T19:24:17.309Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
[2020-06-15T19:24:17.309Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
[2020-06-15T19:24:17.309Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
[2020-06-15T19:24:17.309Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
[2020-06-15T19:24:17.309Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
[2020-06-15T19:24:17.309Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
[2020-06-15T19:24:17.309Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
[2020-06-15T19:24:17.309Z] Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, position: Lkotlinx/coroutines/internal/MainDispatcherLoader;loadMainDispatcher()Lkotlinx/coroutines/MainCoroutineDispatcher;, origin: /mnt/jenkinsslave/gradle_home/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.3.7/8e2eb78158638b33793d204ffef0b65c4a578e1c/kotlinx-coroutines-core-1.3.7.jar:kotlinx/coroutines/internal/MainDispatcherLoader.class
[2020-06-15T19:24:17.309Z] at Version.fakeStackEntry(Version_master.java:0)
[2020-06-15T19:24:17.309Z] at com.android.tools.r8.utils.ExceptionUtils.failCompilation(ExceptionUtils.java:121)
[2020-06-15T19:24:17.309Z] at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:73)
[2020-06-15T19:24:17.309Z] at com.android.tools.r8.utils.ExceptionUtils.withR8CompilationHandler(ExceptionUtils.java:59)
[2020-06-15T19:24:17.309Z] at com.android.tools.r8.R8.runForTesting(R8.java:242)
[2020-06-15T19:24:17.309Z] at com.android.tools.r8.R8.run(R8.java:174)
[2020-06-15T19:24:17.309Z] at com.android.builder.dexing.R8Tool.runR8(r8Tool.kt:247)
[2020-06-15T19:24:17.309Z] at com.android.build.gradle.internal.tasks.R8Task$Companion.shrink(R8Task.kt:472)
[2020-06-15T19:24:17.309Z] at com.android.build.gradle.internal.tasks.R8Task.doTaskAction(R8Task.kt:334)
[2020-06-15T19:24:17.309Z] at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(AndroidVariantTask.kt:74)
[2020-06-15T19:24:17.309Z] at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(AndroidVariantTask.kt:34)
[2020-06-15T19:24:17.309Z] at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:91)
[2020-06-15T19:24:17.309Z] at com.android.build.gradle.internal.tasks.NonIncrementalTask.taskAction(NonIncrementalTask.kt:57)
[2020-06-15T19:24:17.309Z] at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
[2020-06-15T19:24:17.310Z] ... 96 more
[2020-06-15T19:24:17.310Z] Caused by: java.lang.NullPointerException
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.graph.DexEncodedMethod.isStatic(DexEncodedMethod.java:442)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.analysis.ClassInitializationAnalysis$InstructionUtils.enqueueInitializedClassesOnNormalExit(ClassInitializationAnalysis.java:556)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.analysis.ClassInitializationAnalysis$InstructionUtils.isTypeInitializedBy(ClassInitializationAnalysis.java:531)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.analysis.ClassInitializationAnalysis$InstructionUtils.forInvokeStatic(ClassInitializationAnalysis.java:354)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.code.InvokeStatic.definitelyTriggersClassInitialization(InvokeStatic.java:160)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.isClassDefinitelyLoadedBeforeInstruction(ClassInitializationAnalysis.java:127)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.optimize.DefaultInliningOracle.isTargetClassInitialized(DefaultInliningOracle.java:374)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.optimize.DefaultInliningOracle.computeForInvokeStatic(DefaultInliningOracle.java:334)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.code.InvokeStatic.computeInlining(InvokeStatic.java:143)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.optimize.DefaultInliningOracle.computeInlining(DefaultInliningOracle.java:289)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.optimize.Inliner.performInliningImpl(Inliner.java:990)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.optimize.Inliner.performInlining(Inliner.java:897)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.optimize.Inliner.performInlining(Inliner.java:870)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.conversion.IRConverter.optimize(IRConverter.java:1300)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.conversion.IRConverter.rewriteCodeInternal(IRConverter.java:1152)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.conversion.IRConverter.lambda$rewriteCode$15(IRConverter.java:1121)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.utils.ExceptionUtils.withOriginAndPositionAttachmentHandler(ExceptionUtils.java:220)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.conversion.IRConverter.rewriteCode(IRConverter.java:1118)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.conversion.IRConverter.processMethod(IRConverter.java:1097)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.conversion.IRConverter.lambda$optimize$7(IRConverter.java:709)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.ir.conversion.PrimaryMethodProcessor.lambda$forEachMethod$1(PrimaryMethodProcessor.java:137)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.utils.ThreadUtils.lambda$processItemsWithResults$2(ThreadUtils.java:51)
[2020-06-15T19:24:17.310Z] Suppressed: java.lang.RuntimeException: java.util.concurrent.ExecutionException: com.android.tools.r8.utils.ExceptionUtils$OriginAttachmentException: java.lang.NullPointerException
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.utils.ExceptionUtils.unwrapExecutionException(ExceptionUtils.java:195)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.R8.run(R8.java:876)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.R8.run(R8.java:255)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.R8.lambda$runForTesting$1(R8.java:246)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:70)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.utils.ExceptionUtils.withR8CompilationHandler(ExceptionUtils.java:59)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.R8.runForTesting(R8.java:242)
[2020-06-15T19:24:17.310Z] at com.android.tools.r8.R8.run(R8.java:174)
[2020-06-15T19:24:17.310Z] at com.android.builder.dexing.R8Tool.runR8(r8Tool.kt:247)
[2020-06-15T19:24:17.310Z] at com.android.build.gradle.internal.tasks.R8Task$Companion.shrink(R8Task.kt:472)
[2020-06-15T19:24:17.310Z] at com.android.build.gradle.internal.tasks.R8Task.doTaskAction(R8Task.kt:334)
[2020-06-15T19:24:17.310Z] at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(AndroidVariantTask.kt:74)
[2020-06-15T19:24:17.310Z] at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(AndroidVariantTask.kt:34)
[2020-06-15T19:24:17.310Z] at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:91)
[2020-06-15T19:24:17.310Z] at com.android.build.gradle.internal.tasks.NonIncrementalTask.taskAction(NonIncrementalTask.kt:57)
[2020-06-15T19:24:17.310Z] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[2020-06-15T19:24:17.310Z] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[2020-06-15T19:24:17.310Z] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[2020-06-15T19:24:17.310Z] at java.lang.reflect.Method.invoke(Method.java:498)
[2020-06-15T19:24:17.310Z] at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
[2020-06-15T19:24:17.310Z] at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
[2020-06-15T19:24:17.310Z] at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
[2020-06-15T19:24:17.310Z] at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
[2020-06-15T19:24:17.310Z] at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:726)
[2020-06-15T19:24:17.310Z] at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:693)
[2020-06-15T19:24:17.310Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:569)
[2020-06-15T19:24:17.310Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
[2020-06-15T19:24:17.310Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
[2020-06-15T19:24:17.310Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
[2020-06-15T19:24:17.310Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
[2020-06-15T19:24:17.310Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
[2020-06-15T19:24:17.310Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:84)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
[2020-06-15T19:24:17.311Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:554)
[2020-06-15T19:24:17.311Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:537)
[2020-06-15T19:24:17.311Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
[2020-06-15T19:24:17.311Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:278)
[2020-06-15T19:24:17.311Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:267)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
[2020-06-15T19:24:17.311Z] at java.util.Optional.orElseGet(Optional.java:267)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CacheStep.executeAndStoreInCache(CacheStep.java:135)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CacheStep.lambda$executeWithCache$2(CacheStep.java:112)
[2020-06-15T19:24:17.311Z] at java.util.Optional.orElseGet(Optional.java:267)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CacheStep.lambda$executeWithCache$3(CacheStep.java:112)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.Try$Success.map(Try.java:162)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CacheStep.executeWithCache(CacheStep.java:81)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:71)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
[2020-06-15T19:24:17.311Z] at java.util.Optional.map(Optional.java:215)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
[2020-06-15T19:24:17.311Z] at java.util.Optional.orElseGet(Optional.java:267)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
[2020-06-15T19:24:17.311Z] at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:194)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
[2020-06-15T19:24:17.312Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
[2020-06-15T19:24:17.312Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
[2020-06-15T19:24:17.312Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
[2020-06-15T19:24:17.312Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
[2020-06-15T19:24:17.312Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
[2020-06-15T19:24:17.312Z] at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
[2020-06-15T19:24:17.312Z] at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
[2020-06-15T19:24:17.312Z] at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
[2020-06-15T19:24:17.312Z] at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
[2020-06-15T19:24:17.312Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
[2020-06-15T19:24:17.312Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
[2020-06-15T19:24:17.312Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
[2020-06-15T19:24:17.312Z] at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
[2020-06-15T19:24:17.312Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
[2020-06-15T19:24:17.312Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
[2020-06-15T19:24:17.312Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
[2020-06-15T19:24:17.312Z] at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
[2020-06-15T19:24:17.312Z] at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
[2020-06-15T19:24:17.312Z] at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
[2020-06-15T19:24:17.312Z] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[2020-06-15T19:24:17.312Z] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[2020-06-15T19:24:17.312Z] at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
[2020-06-15T19:24:17.312Z] at java.lang.Thread.run(Thread.java:748)
[2020-06-15T19:24:17.312Z] Caused by: java.util.concurrent.ExecutionException: com.android.tools.r8.utils.ExceptionUtils$OriginAttachmentException: java.lang.NullPointerException
[2020-06-15T19:24:17.312Z] at java.util.concurrent.ForkJoinTask.get(ForkJoinTask.java:1006)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.utils.ThreadUtils.awaitFuturesWithResults(ThreadUtils.java:138)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.utils.ThreadUtils.processItemsWithResults(ThreadUtils.java:53)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.utils.ThreadUtils.processItemsWithResults(ThreadUtils.java:32)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.ir.conversion.PrimaryMethodProcessor.forEachMethod(PrimaryMethodProcessor.java:134)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.ir.conversion.IRConverter.optimize(IRConverter.java:707)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.R8.run(R8.java:579)
[2020-06-15T19:24:17.312Z] ... 121 more
[2020-06-15T19:24:17.312Z] Caused by: com.android.tools.r8.utils.ExceptionUtils$OriginAttachmentException: java.lang.NullPointerException
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.utils.ExceptionUtils$OriginAttachmentException.wrap(ExceptionUtils.java:232)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.utils.ExceptionUtils.withOriginAndPositionAttachmentHandler(ExceptionUtils.java:222)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.ir.conversion.IRConverter.rewriteCode(IRConverter.java:1118)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.ir.conversion.IRConverter.processMethod(IRConverter.java:1097)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.ir.conversion.IRConverter.lambda$optimize$7(IRConverter.java:709)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.ir.conversion.PrimaryMethodProcessor.lambda$forEachMethod$1(PrimaryMethodProcessor.java:137)
[2020-06-15T19:24:17.312Z] at com.android.tools.r8.utils.ThreadUtils.lambda$processItemsWithResults$2(ThreadUtils.java:51)
[2020-06-15T19:24:17.313Z] at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
[2020-06-15T19:24:17.313Z] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
[2020-06-15T19:24:17.313Z] at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
[2020-06-15T19:24:17.313Z] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
[2020-06-15T19:24:17.313Z] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
[2020-06-15T19:24:17.313Z] [CIRCULAR REFERENCE:java.lang.NullPointerException]
mk...@google.com <mk...@google.com> #25
Filed
ze...@google.com <ze...@google.com> #26
ze...@google.com <ze...@google.com> #27
za...@gmail.com <za...@gmail.com> #28
ap...@google.com <ap...@google.com> #29
Branch: 2.1
commit 17317bda3fe7da697d542b6a03843626a3af4bb9
Author: Ian Zerny <zerny@google.com>
Date: Wed Jun 24 13:26:46 2020
Version 2.1.44
Cherry-pick: "Report unsupported based on desugared library version."
CL:
Cherry-pick: "Backwards compatible desugared library configuration."
CL:
Cherry-pick: "Update test expectation after error message change."
CL:
Cherry-pick: "Specify wrapper types in the desugared library configuration."
CL:
Cherry-pick: "Generate conversion wrappers in the desugared library."
CL:
Cherry-pick: "Test wrapper merging on all VMs and API levels."
CL:
Bug: 157681341
Bug: 158645207
Change-Id: If2c471396179dfd99e18b2f36b8a513cbae12ac4
M .gitignore
M build.gradle
M src/main/java/com/android/tools/r8/GenerateLintFiles.java
M src/main/java/com/android/tools/r8/L8.java
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/dex/ApplicationReader.java
M src/main/java/com/android/tools/r8/dex/CodeToKeep.java
M src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
M src/main/java/com/android/tools/r8/graph/analysis/DesugaredLibraryConversionWrapperAnalysis.java
M src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryAPIConverter.java
M src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryConfiguration.java
M src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryConfigurationParser.java
M src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
M src/main/java/com/android/tools/r8/shaking/Enqueuer.java
M src/main/java/com/android/tools/r8/utils/AndroidApp.java
A src/main/java/com/android/tools/r8/utils/SemanticVersion.java
M src/test/java/com/android/tools/r8/DiagnosticsMatcher.java
M src/test/java/com/android/tools/r8/JvmTestBuilder.java
A src/test/java/com/android/tools/r8/PositionMatcher.java
M src/test/java/com/android/tools/r8/TestCompileResult.java
M src/test/java/com/android/tools/r8/TestCompilerBuilder.java
A src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BackwardsCompatibleSpecificationTest.java
A src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibaryChecksumsTest.java
A src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryConfigurationParsingTest.java
A src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
M src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
M src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ClockAPIConversionTest.java
M src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/FunctionConversionTest.java
D src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperMergeTest.java
A src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/WrapperPlacementTest.java
A src/test/java/com/android/tools/r8/testing/AndroidBuildVersion.java
A src/test/java/com/android/tools/r8/utils/SemanticVersionTests.java
A third_party/r8-releases/2.0.74.tar.gz.sha1
ze...@google.com <ze...@google.com> #30
FYI, there is currently no plan to backport support for this to the APG 4.0 branch as it fairly large.
zs...@salesforce.com <zs...@salesforce.com> #31
Just tried this but we still get the same crashes unfortunately :(
zs...@salesforce.com <zs...@salesforce.com> #32
Well maybe not. I just checked the output mapping file and it seems to still be using an older version of R8. Let me try to get to the bottom of it and will report back
ze...@google.com <ze...@google.com> #33
I can't build the repro project at the checkout I used previously, so I'll try updating to the tip of tree if that is what you are reproducing at?
FYI, I get:
Task :libraries:smmry:kaptReleaseKotlin FAILED
/usr/local/google/home/zerny/ssd/r8-bugs/157681341/CatchUp/libraries/smmry/src/main/kotlin/io/sweers/catchup/smmry/SmmryModule.kt:36: error: incompatible types: NonExistentClass cannot be converted to Annotation
@InstallIn(FragmentComponent::class)
^
FAILURE: Build failed with an exception.
running ./gradlew :app:assembleDebug which used to work and repro the issue.
zs...@salesforce.com <zs...@salesforce.com> #34
Closing the loop here for those following, we talked more offline and identified a related issue that's now tracked here -
ze...@google.com <ze...@google.com> #35
zs...@salesforce.com <zs...@salesforce.com> #36
I've tried this with both 4.1.0-beta04 and 4.2.0-alpha05 and it is still occurring :/. Slightly different error now though
java.lang.NoSuchMethodError: No direct method <init>(Ljava/util/Map;)V in class Lj$/util/m; or its super classes (declaration of 'j$.util.m' appears in /data/app/com.Slack.test-N8ok9kngoWUpMTt_roYrFA==/base.apk!classes2.dex)
at j$.util.DesugarCollections.synchronizedMap(Unknown Source:2)
at slack.telemetry.helper.FrameMetricsPlugin.<init>(FrameMetricsPlugin.kt:3)
at slack.telemetry.helper.FrameMetricsPlugin_Factory.get(FrameMetricsPlugin_Factory.java:2)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:5)
at slack.telemetry.helper.TracePluginsFactoryImpl_Factory.get(TracePluginsFactoryImpl_Factory.java:1)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:5)
at slack.telemetry.TraceProviderImpl_Factory.get(TraceProviderImpl_Factory.java:1)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:5)
at slack.telemetry.TracerImpl_Factory.get(TracerImpl_Factory.java:1)
at dagger.internal.DoubleCheck.get(DoubleCheck.java:5)
zs...@salesforce.com <zs...@salesforce.com> #37
Closing the loop - #36 was another issue with use in androidTest apks
za...@gmail.com <za...@gmail.com> #38
Another thing I've found is that Studio expects libraries to enable core library desugaring, or else it lints their usage as errors. I've filed this issue for that:
Description
This was a bit tricky to track down, and I'm not 100% certain I've pinned this right so I hope this is right.
Env: AGP 4.1.0-alpha09 stable, desugar_jdk_libs 1.0.5. Also reproducible in AGP 4.0.0
Repro case:https://github.com/ZacSweers/CatchUp/tree/91848344e50e15e7b495ce0b22440b22b6445891
Run
./gradlew :app:assembleDebug
and attempt to run on a pre-API-24 device (sdk 21, 22, or 23). Observe it will crash on startup when it attempts to load OkHttp'sHeaders
clas:The trace is a little confusing, but in short it starts to fall over on this line in
Headers.kt:64
This is trying to then load thehttps://github.com/square/okhttp/blob/master/okhttp/src/main/kotlin/okhttp3/Headers.kt
Headers
class, which implementsIterable
. Ref:This is where things get interesting, and requires inspecting the dalvik bytecode in APK analyzer. This project targets Java 8 sources and uses AGP's new library desugaring. The combination of these results in the following dalvik bytecode for
Headers
Ah! D8 has desugared the default
spliterator()
methods fromIterator
. It's actually done it twice, once for L8's version and once for the JDK. I believe the exception above is originating from the presence of the second one, which still returns the Java 8 version. I can't be totally sure though. TheNoClassDefFoundError
doesn't quite make sense because the$r8$wrapper$java$util$Spliterator$-WRP
class is present in the APK.When you run this APK on an API 24 device, it works fine.
When you build the release version (which minifies with R8), the Java 8 method is stripped.
We could, potentially, just use API 24 devices for debug builds to work around this, but it does seem surprising behavior and potentially a big problem for apps not exercising this code path. This is worsed by the ubiquity of a library like OkHttp hitting his on hot paths.