Desugared library: Prefix all synthesized classes
- Disable backporting when generating class files
Bug: 151597610
Change-Id: Ida73f00edd640817540ebe8a3352e717282c4e0d
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 92f194a..9673bc2 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -68,6 +68,7 @@
private boolean intermediate = false;
private DesugarGraphConsumer desugarGraphConsumer = null;
private StringConsumer desugaredLibraryKeepRuleConsumer = null;
+ private String synthesizedClassPrefix = "";
private Builder() {
this(new DefaultD8DiagnosticsHandler());
@@ -168,6 +169,11 @@
return CompilationMode.DEBUG;
}
+ Builder setSynthesizedClassesPrefix(String prefix) {
+ synthesizedClassPrefix = prefix;
+ return self();
+ }
+
@Override
void validate() {
Reporter reporter = getReporter();
@@ -227,6 +233,7 @@
libraryConfiguration,
getAssertionsConfiguration(),
getOutputInspections(),
+ synthesizedClassPrefix,
getThreadCount(),
factory);
}
@@ -238,6 +245,7 @@
private final DesugarGraphConsumer desugarGraphConsumer;
private final StringConsumer desugaredLibraryKeepRuleConsumer;
private final DesugaredLibraryConfiguration libraryConfiguration;
+ private final String synthesizedClassPrefix;
private final DexItemFactory factory;
public static Builder builder() {
@@ -297,6 +305,7 @@
DesugaredLibraryConfiguration libraryConfiguration,
List<AssertionsConfiguration> assertionsConfiguration,
List<Consumer<Inspector>> outputInspections,
+ String synthesizedClassPrefix,
int threadCount,
DexItemFactory factory) {
super(
@@ -317,6 +326,7 @@
this.desugarGraphConsumer = desugarGraphConsumer;
this.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
this.libraryConfiguration = libraryConfiguration;
+ this.synthesizedClassPrefix = synthesizedClassPrefix;
this.factory = factory;
}
@@ -326,6 +336,7 @@
desugarGraphConsumer = null;
desugaredLibraryKeepRuleConsumer = null;
libraryConfiguration = null;
+ synthesizedClassPrefix = null;
factory = null;
}
@@ -372,8 +383,8 @@
internal.dexClassChecksumFilter = getDexClassChecksumFilter();
internal.enableInheritanceClassInDexDistributor = isOptimizeMultidexForLinearAlloc();
- // TODO(134732760): This is still work in progress.
internal.desugaredLibraryConfiguration = libraryConfiguration;
+ internal.synthesizedClassPrefix = synthesizedClassPrefix;
internal.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
// Default is to remove all javac generated assertion code when generating dex.
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index c32fbb7..7741651 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -178,8 +178,10 @@
assert internal.enableInheritanceClassInDexDistributor;
internal.enableInheritanceClassInDexDistributor = false;
- // TODO(134732760): This is still work in progress.
+ assert libraryConfiguration != null;
internal.desugaredLibraryConfiguration = libraryConfiguration;
+ internal.synthesizedClassPrefix =
+ libraryConfiguration.getSynthesizedLibraryClassesPackagePrefix();
// Default is to remove all javac generated assertion code when generating dex.
assert internal.assertionsConfiguration == null;
@@ -289,6 +291,8 @@
R8Command.Builder r8Builder =
R8Command.builder(getReporter())
.addProgramResourceProvider(desugaredLibrary)
+ .setSynthesizedClassesPrefix(
+ libraryConfiguration.getSynthesizedLibraryClassesPackagePrefix())
.setMinApiLevel(getMinApiLevel())
.setMode(getMode())
.setProgramConsumer(getProgramConsumer());
@@ -307,6 +311,8 @@
D8Command.Builder d8Builder =
D8Command.builder(getReporter())
.addProgramResourceProvider(desugaredLibrary)
+ .setSynthesizedClassesPrefix(
+ libraryConfiguration.getSynthesizedLibraryClassesPackagePrefix())
.setMinApiLevel(getMinApiLevel())
.setMode(getMode())
.setProgramConsumer(getProgramConsumer());
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 611bc7a..fea04c7 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -104,6 +104,7 @@
private GraphConsumer mainDexKeptGraphConsumer = null;
private BiFunction<String, Long, Boolean> dexClassChecksumFilter = (name, checksum) -> true;
private final List<FeatureSplit> featureSplits = new ArrayList<>();
+ private String synthesizedClassPrefix = "";
private boolean allowPartiallyImplementedProguardOptions = false;
private boolean allowTestProguardOptions =
@@ -146,6 +147,11 @@
return CompilationMode.RELEASE;
}
+ Builder setSynthesizedClassesPrefix(String prefix) {
+ synthesizedClassPrefix = prefix;
+ return self();
+ }
+
/**
* Disable tree shaking.
*
@@ -572,6 +578,7 @@
featureSplitConfiguration,
getAssertionsConfiguration(),
getOutputInspections(),
+ synthesizedClassPrefix,
getThreadCount());
return command;
@@ -654,6 +661,7 @@
private final StringConsumer desugaredLibraryKeepRuleConsumer;
private final DesugaredLibraryConfiguration libraryConfiguration;
private final FeatureSplitConfiguration featureSplitConfiguration;
+ private final String synthesizedClassPrefix;
/** Get a new {@link R8Command.Builder}. */
public static Builder builder() {
@@ -731,6 +739,7 @@
FeatureSplitConfiguration featureSplitConfiguration,
List<AssertionsConfiguration> assertionsConfiguration,
List<Consumer<Inspector>> outputInspections,
+ String synthesizedClassPrefix,
int threadCount) {
super(
inputApp,
@@ -764,6 +773,7 @@
this.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
this.libraryConfiguration = libraryConfiguration;
this.featureSplitConfiguration = featureSplitConfiguration;
+ this.synthesizedClassPrefix = synthesizedClassPrefix;
}
private R8Command(boolean printHelp, boolean printVersion) {
@@ -784,6 +794,7 @@
desugaredLibraryKeepRuleConsumer = null;
libraryConfiguration = null;
featureSplitConfiguration = null;
+ synthesizedClassPrefix = null;
}
/** Get the enable-tree-shaking state. */
@@ -910,8 +921,8 @@
internal.enableInheritanceClassInDexDistributor = isOptimizeMultidexForLinearAlloc();
- // TODO(134732760): This is still work in progress.
internal.desugaredLibraryConfiguration = libraryConfiguration;
+ internal.synthesizedClassPrefix = synthesizedClassPrefix;
internal.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
assert internal.threadCount == ThreadUtils.NOT_SPECIFIED;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index a0934cd..4ac8995 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -974,12 +974,7 @@
private DexType computeOutlineClassType() {
DexType result;
int count = 0;
- String tempPrefix =
- appView
- .options()
- .desugaredLibraryConfiguration
- .getSynthesizedLibraryClassesPackagePrefix(appView);
- String prefix = tempPrefix.replace('/', '.');
+ String prefix = appView.options().synthesizedClassPrefix.replace('/', '.');
do {
String name =
prefix + OutlineOptions.CLASS_NAME + (count == 0 ? "" : Integer.toString(count));
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 fd0e452..718084c 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
@@ -489,11 +489,9 @@
}
private static DexType dispatchTypeFor(AppView<?> appView, DexMethod method, String suffix) {
- String desugaredLibPrefix =
- appView.options().desugaredLibraryConfiguration.getSynthesizedLibraryClassesPackagePrefix();
String descriptor =
"L"
- + desugaredLibPrefix
+ + appView.options().synthesizedClassPrefix
+ UTILITY_CLASS_NAME_PREFIX
+ '$'
+ method.holder.getName()
@@ -552,37 +550,38 @@
private final Set<DexMethod> emulatedDispatchMethods = Sets.newHashSet();
RewritableMethods(InternalOptions options, AppView<?> appView) {
- DexItemFactory factory = options.itemFactory;
+ if (options.shouldBackportMethods()) {
+ DexItemFactory factory = options.itemFactory;
+ if (options.minApiLevel < AndroidApiLevel.K.getLevel()) {
+ initializeAndroidKMethodProviders(factory);
+ }
+ if (options.minApiLevel < AndroidApiLevel.N.getLevel()) {
+ initializeAndroidNMethodProviders(factory);
+ }
+ if (options.minApiLevel < AndroidApiLevel.O.getLevel()) {
+ initializeAndroidOMethodProviders(factory);
+ }
- if (options.minApiLevel < AndroidApiLevel.K.getLevel()) {
- initializeAndroidKMethodProviders(factory);
- }
- if (options.minApiLevel < AndroidApiLevel.N.getLevel()) {
- initializeAndroidNMethodProviders(factory);
- }
- if (options.minApiLevel < AndroidApiLevel.O.getLevel()) {
- initializeAndroidOMethodProviders(factory);
- }
+ // The following providers are currently not implemented at any API level in Android.
+ // They however require the Optional/Stream class to be present, either through desugared
+ // libraries or natively. If Optional/Stream class is not present, we do not desugar to
+ // avoid confusion in error messages.
+ if (appView.rewritePrefix.hasRewrittenType(factory.optionalType, appView)
+ || options.minApiLevel >= AndroidApiLevel.N.getLevel()) {
+ initializeJava9OptionalMethodProviders(factory);
+ initializeJava10OptionalMethodProviders(factory);
+ initializeJava11OptionalMethodProviders(factory);
+ }
+ if (appView.rewritePrefix.hasRewrittenType(factory.streamType, appView)
+ || options.minApiLevel >= AndroidApiLevel.N.getLevel()) {
+ initializeStreamMethodProviders(factory);
+ }
- // The following providers are currently not implemented at any API level in Android.
- // They however require the Optional/Stream class to be present, either through
- // desugared libraries or natively. If Optional/Stream class is not present,
- // we do not desugar to avoid confusion in error messages.
- if (appView.rewritePrefix.hasRewrittenType(factory.optionalType, appView)
- || options.minApiLevel >= AndroidApiLevel.N.getLevel()) {
- initializeJava9OptionalMethodProviders(factory);
- initializeJava10OptionalMethodProviders(factory);
- initializeJava11OptionalMethodProviders(factory);
+ // These are currently not implemented at any API level in Android.
+ initializeJava9MethodProviders(factory);
+ initializeJava10MethodProviders(factory);
+ initializeJava11MethodProviders(factory);
}
- if (appView.rewritePrefix.hasRewrittenType(factory.streamType, appView)
- || options.minApiLevel >= AndroidApiLevel.N.getLevel()) {
- initializeStreamMethodProviders(factory);
- }
-
- // These are currently not implemented at any API level in Android.
- initializeJava9MethodProviders(factory);
- initializeJava10MethodProviders(factory);
- initializeJava11MethodProviders(factory);
if (!options.desugaredLibraryConfiguration.getRetargetCoreLibMember().isEmpty()) {
initializeRetargetCoreLibraryMembers(appView);
@@ -1896,14 +1895,9 @@
DexItemFactory factory = appView.dexItemFactory();
String unqualifiedName = method.holder.getName();
// Avoid duplicate class names between core lib dex file and program dex files.
- String desugaredLibPrefix =
- appView
- .options()
- .desugaredLibraryConfiguration
- .getSynthesizedLibraryClassesPackagePrefix(appView);
String descriptor =
"L"
- + desugaredLibPrefix
+ + appView.options().synthesizedClassPrefix
+ UTILITY_CLASS_NAME_PREFIX
+ '$'
+ unqualifiedName
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 3527f62..946077d 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
@@ -144,14 +144,9 @@
}
private DexType createWrapperType(DexType type, String suffix) {
- String desugaredLibPrefix =
- appView
- .options()
- .desugaredLibraryConfiguration
- .getSynthesizedLibraryClassesPackagePrefix(appView);
return factory.createType(
"L"
- + desugaredLibPrefix
+ + appView.options().synthesizedClassPrefix
+ WRAPPER_PREFIX
+ type.toString().replace('.', '$')
+ suffix
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 37b38e9..ae119c2 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -287,6 +287,8 @@
public boolean enablePcDebugInfoOutput = false;
+ public String synthesizedClassPrefix = "";
+
// Number of threads to use while processing the dex files.
public int threadCount = DETERMINISTIC_DEBUGGING ? 1 : ThreadUtils.NOT_SPECIFIED;
// Print smali disassembly.
@@ -360,6 +362,10 @@
return desugaredLibraryConfiguration.isLibraryCompilation();
}
+ public boolean shouldBackportMethods() {
+ return !hasConsumer() || isGeneratingDex();
+ }
+
public boolean shouldKeepStackMapTable() {
return isDesugaredLibraryCompilation()
|| getProguardConfiguration().getKeepAttributes().stackMapTable;