Fixed
Status Update
Comments
ag...@google.com <ag...@google.com>
ch...@google.com <ch...@google.com> #2
Thanks for the report. This looks a bit as if the application is trying to access an annotation of an annotation type that is not present in the application. Would it be possible for you to share the generated APK, along with steps to reproduce the above exception, for us to verify if this is indeed the issue?
Also, would it be possible for you to share an Android Studio 4.1 project where this reproduces? If you prefer to share it privately you can send it to
za...@parsida.se <za...@parsida.se> #3
I compared the apks and noticed one of the class members is renamed. Let me say like this:
I made a release build (1.8.83) with AS 3.8. Progaurd renamed the class C's member to X. Assume the user saves an object of this class in local DB .
Then I upgraded to AS 4 and made another release build (1.9.10)- with no changes to class C. Progaurd renames the same member to Y.
If the user tries to read the object from the local DB, the app will crash because of incompatible class change.
I'm not sure why the crash only happens on Android 6 and Android 5.
The crash is happening in the FolioReader library which we use in our project (https://github.com/zjamshidi/FolioReader-Android )
I don't think I can share the source of our project with you. The progaurd file and also the app bundles are ok to share, if it helps.
I made a release build (1.8.83) with AS 3.8. Progaurd renamed the class C's member to X. Assume the user saves an object of this class in local DB .
Then I upgraded to AS 4 and made another release build (1.9.10)- with no changes to class C. Progaurd renames the same member to Y.
If the user tries to read the object from the local DB, the app will crash because of incompatible class change.
I'm not sure why the crash only happens on Android 6 and Android 5.
The crash is happening in the FolioReader library which we use in our project (
I don't think I can share the source of our project with you. The progaurd file and also the app bundles are ok to share, if it helps.
mk...@google.com <mk...@google.com> #4
This seems to be a duplicate of kotlin.l
is the minified name of kotlin.Metadata
?
ap...@google.com <ap...@google.com> #5
Project: r8
Branch: master
commit 967475a14010e0a9d9bb3392c80745ad49843851
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Wed Aug 05 08:56:13 2020
Only emit kotlin metadata values for non-pruned annotation members
Bug: 161230424
Bug: 162900580
Change-Id: Ib74e75e89577626b0b1e511011f4e018bb9c9795
M src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
M src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java
https://r8-review.googlesource.com/52667
Branch: master
commit 967475a14010e0a9d9bb3392c80745ad49843851
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Wed Aug 05 08:56:13 2020
Only emit kotlin metadata values for non-pruned annotation members
Bug: 161230424
Bug: 162900580
Change-Id: Ib74e75e89577626b0b1e511011f4e018bb9c9795
M src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
M src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java
ap...@google.com <ap...@google.com> #6
Project: r8
Branch: master
commit 61e42be9c70aef3960fa640c6eb8dcc92129eba2
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Wed Aug 05 08:56:03 2020
Add reproduction of removed fields in kotlin.Metadata
Bug: 161230424
Change-Id: I666ca2f39f230c82e53608f2af7bb45b4773bec3
A src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java
A src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Main.java
A src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Methods.kt
https://r8-review.googlesource.com/52666
Branch: master
commit 61e42be9c70aef3960fa640c6eb8dcc92129eba2
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Wed Aug 05 08:56:03 2020
Add reproduction of removed fields in kotlin.Metadata
Bug: 161230424
Change-Id: I666ca2f39f230c82e53608f2af7bb45b4773bec3
A src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java
A src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Main.java
A src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Methods.kt
ap...@google.com <ap...@google.com> #7
Project: r8
Branch: 2.1
commit 457065d1a288b3fedcc032104587cd280dae7915
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Wed Aug 05 11:36:06 2020
Version 2.1.57
Cherry-pick: Close stream of input source when dumping
CL:https://r8-review.googlesource.com/52560
Cherry-pick: Move synchronization of class initializer from DexClass to MethodColl
CL:https://r8-review.googlesource.com/52544
Cherry-pick: Add reproduction of removed fields in kotlin.Metadata
CL:https://r8-review.googlesource.com/52666
Cherry-pick: Only emit kotlin metadata values for non-pruned
annotation members
CL:https://r8-review.googlesource.com/52667
Bug: 160901582
Bug: 159194018
Bug: 161230424
Bug: 162900580
Bug: 152476580
Change-Id: I3e506acaba9333ed6bd31d7229f5982bab215696
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/graph/DexClass.java
M src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
M src/main/java/com/android/tools/r8/graph/MethodCollection.java
M src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
M src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
M src/main/java/com/android/tools/r8/utils/AndroidApp.java
M src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
A src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java
A src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Main.java
A src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Methods.kt
https://r8-review.googlesource.com/52674
Branch: 2.1
commit 457065d1a288b3fedcc032104587cd280dae7915
Author: Morten Krogh-Jespersen <mkroghj@google.com>
Date: Wed Aug 05 11:36:06 2020
Version 2.1.57
Cherry-pick: Close stream of input source when dumping
CL:
Cherry-pick: Move synchronization of class initializer from DexClass to MethodColl
CL:
Cherry-pick: Add reproduction of removed fields in kotlin.Metadata
CL:
Cherry-pick: Only emit kotlin metadata values for non-pruned
annotation members
CL:
Bug: 160901582
Bug: 159194018
Bug: 161230424
Bug: 162900580
Bug: 152476580
Change-Id: I3e506acaba9333ed6bd31d7229f5982bab215696
M src/main/java/com/android/tools/r8/Version.java
M src/main/java/com/android/tools/r8/graph/DexClass.java
M src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
M src/main/java/com/android/tools/r8/graph/MethodCollection.java
M src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
M src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
M src/main/java/com/android/tools/r8/utils/AndroidApp.java
M src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
A src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java
M src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java
A src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Main.java
A src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Methods.kt
Description
-keep class com.folioreader.** { *; }
-keep class org.readium.r2.shared.** { *; }
The app was working fine, till I upgrade to AS 4.0 and AS 4.1. Now the new apk generated with the same library and the same rule keeps crashing on Android 5 and Android 6.
Fatal Exception: java.lang.IncompatibleClassChangeError: Couldn't find
at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:659)
at libcore.reflect.AnnotationAccess.annotationSetToAnnotations(AnnotationAccess.java:633)
at libcore.reflect.AnnotationAccess.getDeclaredAnnotations(AnnotationAccess.java:161)
at java.lang.Class.getDeclaredAnnotations(Class.java:743)
at com.fasterxml.jackson.databind.util.ClassUtil.findClassAnnotations(ClassUtil.java:1095)
at com.fasterxml.jackson.databind.introspect.AnnotatedClassResolver.resolveClassAnnotations(AnnotatedClassResolver.java:153)
at com.fasterxml.jackson.databind.introspect.AnnotatedClassResolver.resolveFully(AnnotatedClassResolver.java:117)
at com.fasterxml.jackson.databind.introspect.AnnotatedClassResolver.resolve(AnnotatedClassResolver.java:69)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector._resolveAnnotatedClass(BasicClassIntrospector.java:282)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.collectProperties(BasicClassIntrospector.java:191)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(BasicClassIntrospector.java:112)
at com.fasterxml.jackson.databind.introspect.BasicClassIntrospector.forDeserialization(BasicClassIntrospector.java:16)
at com.fasterxml.jackson.databind.DeserializationConfig.introspect(DeserializationConfig.java:731)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:324)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:477)
at com.fasterxml.jackson.databind.ObjectReader._prefetchRootDeserializer(ObjectReader.java:1938)
at com.fasterxml.jackson.databind.ObjectReader.forType(ObjectReader.java:677)
at com.fasterxml.jackson.databind.ObjectReader.forType(ObjectReader.java:697)
at com.folioreader.model.locators.ReadLocator$Companion.fromJson(ReadLocator.java:64)
at com.folioreader.model.locators.ReadLocator.fromJson(ReadLocator.java)
at com.storyshots.android.ui.BookDetailActivity.openLocalEpub(BookDetailActivity.java:836)
at com.storyshots.android.ui.BookDetailActivity.openEpub(BookDetailActivity.java:801)
at com.storyshots.android.ui.BookDetailActivity.openEpub(BookDetailActivity.java:785)
at com.storyshots.android.ui.BookDetailActivity.onCreate(BookDetailActivity.java:380)
at android.app.Activity.performCreate(Activity.java:6272)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
at android.app.ActivityThread.access$900(ActivityThread.java:157)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
If I build the old version on new AS, the crash doesn't happen and I cannot reproduce it. But it happens when I upgrade from Google Play builds. I tried adding @keep annotation to the class, it doesn't help. Any idea where is the problem and how could we fix it?