[KeepAnno] Use native interpretation in R8
The replaces the previous rule extraction with direct native
interpretation in R8.
Bug: b/349276075
Change-Id: I2b79521051a1839718770b3f1215b6042fd37cf1
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 3bd0ac5..035f730 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -17,9 +17,6 @@
import com.android.tools.r8.inspector.internal.InspectorImpl;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
import com.android.tools.r8.keepanno.annotations.KeepForApi;
-import com.android.tools.r8.keepanno.asm.KeepEdgeReader;
-import com.android.tools.r8.keepanno.ast.KeepDeclaration;
-import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractor;
import com.android.tools.r8.naming.MapConsumer;
import com.android.tools.r8.naming.ProguardMapStringConsumer;
import com.android.tools.r8.naming.SourceFileRewriter;
@@ -65,7 +62,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import java.util.Deque;
import java.util.List;
import java.util.Optional;
@@ -137,8 +133,7 @@
FeatureSplitConfiguration.builder();
private String synthesizedClassPrefix = "";
private boolean enableMissingLibraryApiModeling = false;
- private boolean enableExperimentalKeepAnnotations =
- System.getProperty("com.android.tools.r8.enableKeepAnnotations") != null;
+ private boolean enableExperimentalKeepAnnotations = false;
public boolean enableStartupLayoutOptimization = true;
private SemanticVersion fakeCompilerVersion = null;
private AndroidResourceProvider androidResourceProvider = null;
@@ -704,10 +699,6 @@
// Add embedded keep rules.
amendWithRulesAndProvidersForInjarsAndMetaInf(reporter, parser);
-
- // Extract out rules for keep annotations and amend the configuration.
- // TODO(b/248408342): Remove this and parse annotations as part of R8 root-set & enqueuer.
- extractKeepAnnotationRules(parser);
ProguardConfiguration configuration = configurationBuilder.build();
getAppBuilder().addFilteredLibraryArchives(configuration.getLibraryjars());
@@ -756,6 +747,7 @@
getSourceFileProvider(),
enableMissingLibraryApiModeling,
enableStartupLayoutOptimization,
+ enableExperimentalKeepAnnotations,
getAndroidPlatformBuild(),
getArtProfilesForRewriting(),
getStartupProfileProviders(),
@@ -836,35 +828,6 @@
}
}
- private void extractKeepAnnotationRules(ProguardConfigurationParser parser) {
- if (!enableExperimentalKeepAnnotations) {
- return;
- }
- try {
- for (ProgramResourceProvider provider : getAppBuilder().getProgramResourceProviders()) {
- for (ProgramResource resource : provider.getProgramResources()) {
- if (resource.getKind() == Kind.CF) {
- List<KeepDeclaration> declarations =
- KeepEdgeReader.readKeepEdges(resource.getBytes());
- if (!declarations.isEmpty()) {
- KeepRuleExtractor extractor =
- new KeepRuleExtractor(
- rule -> {
- ProguardConfigurationSourceStrings source =
- new ProguardConfigurationSourceStrings(
- Collections.singletonList(rule), null, resource.getOrigin());
- parser.parse(source);
- });
- declarations.forEach(extractor::extract);
- }
- }
- }
- }
- } catch (ResourceException e) {
- throw getAppBuilder().getReporter().fatalError(new ExceptionDiagnostic(e));
- }
- }
-
// Internal for-testing method to add post-processors of the proguard configuration.
void addProguardConfigurationConsumerForTesting(Consumer<ProguardConfiguration.Builder> c) {
Consumer<ProguardConfiguration.Builder> oldConsumer = proguardConfigurationConsumerForTesting;
@@ -956,6 +919,7 @@
private final String synthesizedClassPrefix;
private final boolean enableMissingLibraryApiModeling;
private final boolean enableStartupLayoutOptimization;
+ private final boolean enableExperimentalKeepAnnotations;
private final AndroidResourceProvider androidResourceProvider;
private final AndroidResourceConsumer androidResourceConsumer;
private final ResourceShrinkerConfiguration resourceShrinkerConfiguration;
@@ -1049,6 +1013,7 @@
SourceFileProvider sourceFileProvider,
boolean enableMissingLibraryApiModeling,
boolean enableStartupLayoutOptimization,
+ boolean enableExperimentalKeepAnnotations,
boolean isAndroidPlatformBuild,
List<ArtProfileForRewriting> artProfilesForRewriting,
List<StartupProfileProvider> startupProfileProviders,
@@ -1103,6 +1068,7 @@
this.synthesizedClassPrefix = synthesizedClassPrefix;
this.enableMissingLibraryApiModeling = enableMissingLibraryApiModeling;
this.enableStartupLayoutOptimization = enableStartupLayoutOptimization;
+ this.enableExperimentalKeepAnnotations = enableExperimentalKeepAnnotations;
this.androidResourceProvider = androidResourceProvider;
this.androidResourceConsumer = androidResourceConsumer;
this.resourceShrinkerConfiguration = resourceShrinkerConfiguration;
@@ -1131,6 +1097,7 @@
synthesizedClassPrefix = null;
enableMissingLibraryApiModeling = false;
enableStartupLayoutOptimization = true;
+ enableExperimentalKeepAnnotations = false;
androidResourceProvider = null;
androidResourceConsumer = null;
resourceShrinkerConfiguration = null;
@@ -1191,6 +1158,8 @@
assert !internal.enableTreeShakingOfLibraryMethodOverrides;
+ internal.testing.enableEmbeddedKeepAnnotations = enableExperimentalKeepAnnotations;
+
if (!internal.isShrinking()) {
// If R8 is not shrinking, there is no point in running various optimizations since the
// optimized classes will still remain in the program (the application size could increase).
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
index 8b21c8d..b4e7eab 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.keepanno;
+import static org.junit.Assert.assertEquals;
import com.android.tools.r8.ExternalR8TestBuilder;
import com.android.tools.r8.ProguardTestBuilder;
@@ -189,9 +190,11 @@
TestBase.testForR8(temp, parameters().getBackend())
.enableExperimentalKeepAnnotations()
.setMinApi(parameters());
-
- // TODO(b/323816623): Replace the testing flag by the API call.
- builder.addOptionsModification(o -> o.testing.enableEmbeddedKeepAnnotations = isDirect());
+ builder.getBuilder().setEnableExperimentalKeepAnnotations(isDirect());
+ // If the internal reader value does not match we will need to update the extract tests to
+ // also strip the annotations.
+ builder.addOptionsModification(
+ o -> assertEquals(isDirect(), o.testing.enableEmbeddedKeepAnnotations));
}
private boolean isExtractRules() {