From 0dfea712bb431618e06cb80c6daba1e354fb06ac Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Sun, 24 Nov 2019 22:52:59 -0500 Subject: [PATCH] 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 --- .../main/java/com/squareup/moshi/internal/Util.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/moshi/src/main/java/com/squareup/moshi/internal/Util.java b/moshi/src/main/java/com/squareup/moshi/internal/Util.java index 08c56ee..423b289 100644 --- a/moshi/src/main/java/com/squareup/moshi/internal/Util.java +++ b/moshi/src/main/java/com/squareup/moshi/internal/Util.java @@ -52,13 +52,20 @@ public final class Util { static { Class metadata = null; - Class defaultConstructorMarker = null; try { + //noinspection unchecked metadata = (Class) Class.forName("kotlin.Metadata"); - defaultConstructorMarker = Class.forName("kotlin.jvm.internal.DefaultConstructorMarker"); } catch (ClassNotFoundException ignored) { } 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; }