From 8c8c5977a78e5687aa7ddbd1aa1f089c185f9072 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/src/main/java/com/squareup/moshi/internal/Util.java | 7 ++++++- moshi/src/main/resources/META-INF/proguard/moshi.pro | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) 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 b936764..05fe663 100644 --- a/moshi/src/main/java/com/squareup/moshi/internal/Util.java +++ b/moshi/src/main/java/com/squareup/moshi/internal/Util.java @@ -54,7 +54,7 @@ public final class Util { Class metadata = null; try { //noinspection unchecked - metadata = (Class) Class.forName("kotlin.Metadata"); + metadata = (Class) Class.forName(getKotlinMetadataClassName()); } catch (ClassNotFoundException ignored) { } METADATA = metadata; @@ -69,6 +69,11 @@ public final class Util { DEFAULT_CONSTRUCTOR_MARKER = defaultConstructorMarker; } + // Extracted as a method with a keep rule to prevent R8 from keeping Kotlin Metada + private static String getKotlinMetadataClassName() { + return "kotlin.Metadata"; + } + private Util() { } diff --git a/moshi/src/main/resources/META-INF/proguard/moshi.pro b/moshi/src/main/resources/META-INF/proguard/moshi.pro index c4cea38..ed2d9cb 100644 --- a/moshi/src/main/resources/META-INF/proguard/moshi.pro +++ b/moshi/src/main/resources/META-INF/proguard/moshi.pro @@ -14,3 +14,8 @@ ; **[] values(); } + +# Keep helper method to avoid R8 optimisation that would keep all Kotlin Metadata when unwanted +-keepclassmembers class com.squareup.moshi.internal.Util { + private static java.lang.String getKotlinMetadataClassName(); +}