From 916ab2484c6949e8b8d522489053376eb4782f16 Mon Sep 17 00:00:00 2001 From: Tolriq Date: Mon, 20 Apr 2020 14:45:38 +0200 Subject: [PATCH] R8 now have automatic detection of Class.forName and auto generate keep rules. This makes application build with Moshi to keep unwanted Kotlin Metadata that have a huge impact on APK size. After discussion with R8 team, there's currently no solution to avoid this other than using the trick in this PR. Fixes https://github.com/square/moshi/issues/1115 --- moshi/pom.xml | 13 +++++++++++++ .../main/java/com/squareup/moshi/internal/Util.java | 8 +++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/moshi/pom.xml b/moshi/pom.xml index 9361fca716..b9b32817bf 100644 --- a/moshi/pom.xml +++ b/moshi/pom.xml @@ -13,6 +13,11 @@ Moshi + + androidx.annotation + annotation + 1.1.0 + com.squareup.okio okio @@ -34,6 +39,14 @@ + + + google + Google + https://maven.google.com/ + + + 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 b9367645c3..0f4ce82add 100644 --- a/moshi/src/main/java/com/squareup/moshi/internal/Util.java +++ b/moshi/src/main/java/com/squareup/moshi/internal/Util.java @@ -15,6 +15,7 @@ */ package com.squareup.moshi.internal; +import androidx.annotation.Keep; import com.squareup.moshi.JsonAdapter; import com.squareup.moshi.JsonClass; import com.squareup.moshi.JsonDataException; @@ -54,7 +55,7 @@ public final class Util { Class metadata = null; try { //noinspection unchecked - metadata = (Class) Class.forName("kotlin.Metadata"); + metadata = (Class) Class.forName(getKotlinMetadataClassNameForReflection()); } catch (ClassNotFoundException ignored) { } METADATA = metadata; @@ -69,6 +70,11 @@ public final class Util { DEFAULT_CONSTRUCTOR_MARKER = defaultConstructorMarker; } + @Keep /* Kept to avoid optimizing out reflection. */ + private static String getKotlinMetadataClassNameForReflection() { + return "kotlin.Metadata"; + } + private Util() { }