Always check for DefaultConstructorMarker class (#1038)

Reported by a Googler - We currently gate the lookup of the class on the presence of `Metadata`. However, `Metadata` might be justifiably stripped by Proguard/R8, even though `DefaultConstructorMarker` might still be present. This means Moshi's defaults invocation is likely broken on (at least) R8 builds without this.

Workaround until next release is to keep Metadata annotations
This commit is contained in:
Zac Sweers
2019-11-24 22:52:59 -05:00
committed by GitHub
parent b287596c60
commit 0dfea712bb

View File

@@ -52,13 +52,20 @@ public final class Util {
static { static {
Class<? extends Annotation> metadata = null; Class<? extends Annotation> metadata = null;
Class<?> defaultConstructorMarker = null;
try { try {
//noinspection unchecked
metadata = (Class<? extends Annotation>) Class.forName("kotlin.Metadata"); metadata = (Class<? extends Annotation>) Class.forName("kotlin.Metadata");
defaultConstructorMarker = Class.forName("kotlin.jvm.internal.DefaultConstructorMarker");
} catch (ClassNotFoundException ignored) { } catch (ClassNotFoundException ignored) {
} }
METADATA = metadata; METADATA = metadata;
// We look up the constructor marker separately because Metadata might be (justifiably)
// stripped by R8/Proguard but the DefaultConstructorMarker is still present.
Class<?> defaultConstructorMarker = null;
try {
defaultConstructorMarker = Class.forName("kotlin.jvm.internal.DefaultConstructorMarker");
} catch (ClassNotFoundException ignored) {
}
DEFAULT_CONSTRUCTOR_MARKER = defaultConstructorMarker; DEFAULT_CONSTRUCTOR_MARKER = defaultConstructorMarker;
} }