Desugared lib minification and vivified types
- fix typos in names in desugaredLibUtilitySuffix.
- fix wrappers to be outside of packages.
- fix minifier not to minify kept API with vivified types.
Change-Id: Iedd17801695ead6b2522ab1ac221eafd3e09ad64
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index f6f34e6..be6ffb2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -1304,15 +1304,15 @@
DexItemFactory factory = appView.dexItemFactory();
String unqualifiedName = method.holder.getName();
// Avoid duplicate class names between core lib dex file and program dex files.
- String coreLibUtilitySuffix =
- appView.options().isDesugaredLibraryCompilation() ? "$corelib" : "";
+ String desugaredLibUtilitySuffix =
+ appView.options().isDesugaredLibraryCompilation() ? "$desugaredLib" : "";
String descriptor =
UTILITY_CLASS_DESCRIPTOR_PREFIX
+ '$'
+ unqualifiedName
+ '$'
+ method.proto.parameters.size()
- + coreLibUtilitySuffix
+ + desugaredLibUtilitySuffix
+ '$'
+ methodName
+ ';';
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
index 9c29f64..a8240ce 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
@@ -94,6 +94,7 @@
// }
public class DesugaredLibraryWrapperSynthesizer {
+ public static final String WRAPPER_PREFIX = "$r8$wrapper$";
public static final String TYPE_WRAPPER_SUFFIX = "$-WRP";
public static final String VIVIFIED_TYPE_WRAPPER_SUFFIX = "$-V-WRP";
@@ -145,6 +146,12 @@
this::generateVivifiedTypeWrapper);
}
+ private DexType createWrapperType(DexType type, String suffix) {
+ return factory.createType(
+ DescriptorUtils.javaTypeToDescriptor(
+ WRAPPER_PREFIX + type.toString().replace('.', '$') + suffix));
+ }
+
private DexType getWrapper(
DexType type,
String suffix,
@@ -162,9 +169,7 @@
type,
t -> {
toGenerate.set(true);
- DexType wrapperType =
- factory.createType(
- DescriptorUtils.javaTypeToDescriptor(type.toString() + suffix));
+ DexType wrapperType = createWrapperType(type, suffix);
generatedWrappers.add(wrapperType);
return new Pair<>(wrapperType, null);
});
diff --git a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
index d8fc1c6..7af0752 100644
--- a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.desugar.DesugaredLibraryAPIConverter;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Timing;
@@ -286,6 +287,14 @@
DexString reservedName = strategy.getReservedName(method, holder);
if (reservedName != null) {
state.reserveName(reservedName, method.method);
+ // This is reserving names which after prefix rewriting will actually override a library
+ // method.
+ if (appView.rewritePrefix.hasRewrittenTypeInSignature(method.method.proto)) {
+ state.reserveName(
+ reservedName,
+ DesugaredLibraryAPIConverter.methodWithVivifiedTypeInSignature(
+ method.method, method.method.holder, appView));
+ }
}
}
}
diff --git a/src/test/java/com/android/tools/r8/desugar/corelib/conversionTests/CallBackConversionTest.java b/src/test/java/com/android/tools/r8/desugar/corelib/conversionTests/CallBackConversionTest.java
index f7b0a1e..49ee9af 100644
--- a/src/test/java/com/android/tools/r8/desugar/corelib/conversionTests/CallBackConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/corelib/conversionTests/CallBackConversionTest.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.ToolHelper.DexVm;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
import java.nio.file.Path;
import java.util.List;
@@ -74,23 +75,7 @@
.addLibraryClasses(CustomLibClass.class)
.enableCoreLibraryDesugaring(AndroidApiLevel.B)
.compile()
- .inspect(
- i -> {
- // The j$ method can be optimized, but the java method should be present to be called
- // through the library.
- List<FoundMethodSubject> virtualMethods = i.clazz(Impl.class).virtualMethods();
- assertTrue(
- virtualMethods.stream()
- .anyMatch(
- m ->
- m.getMethod()
- .method
- .proto
- .parameters
- .values[0]
- .toString()
- .equals("java.util.function.Consumer")));
- })
+ .inspect(this::assertLibraryOverridesThere)
.addDesugaredCoreLibraryRunClassPath(
this::buildDesugaredLibraryWithConversionExtension, AndroidApiLevel.B)
.addRunClasspathFiles(customLib)
@@ -98,6 +83,42 @@
.assertSuccessWithOutput(StringUtils.lines("0", "1", "0", "1"));
}
+ @Test
+ public void testCallBackR8Minifying() throws Exception {
+ Path customLib = testForD8().addProgramClasses(CustomLibClass.class).compile().writeToZip();
+ testForR8(Backend.DEX)
+ .addKeepMainRule(Impl.class)
+ .setMinApi(AndroidApiLevel.B)
+ .addProgramClasses(Impl.class)
+ .addLibraryClasses(CustomLibClass.class)
+ .enableCoreLibraryDesugaring(AndroidApiLevel.B)
+ .compile()
+ .inspect(this::assertLibraryOverridesThere)
+ .addDesugaredCoreLibraryRunClassPath(
+ this::buildDesugaredLibraryWithConversionExtension, AndroidApiLevel.B)
+ .addRunClasspathFiles(customLib)
+ .run(new DexRuntime(DexVm.ART_9_0_0_HOST), Impl.class)
+ .assertSuccessWithOutput(StringUtils.lines("0", "1", "0", "1"));
+ }
+
+ private void assertLibraryOverridesThere(CodeInspector i) {
+ // The j$ method can be optimized, but the java method should be present to be called
+ // through the library.
+ List<FoundMethodSubject> virtualMethods = i.clazz(Impl.class).virtualMethods();
+ assertTrue(
+ virtualMethods.stream()
+ .anyMatch(
+ m ->
+ m.getMethod().method.name.toString().equals("foo")
+ && m.getMethod()
+ .method
+ .proto
+ .parameters
+ .values[0]
+ .toString()
+ .equals("java.util.function.Consumer")));
+ }
+
static class Impl extends CustomLibClass {
public int foo(Consumer<Object> o) {