Enable access modification for desugared library
Fixes: b/288062771
Change-Id: I0e6de43b77146244c6bef1de6d7089b1052d8470
diff --git a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java
index 6a27796..f56bd5c 100644
--- a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java
+++ b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java
@@ -5,11 +5,14 @@
package com.android.tools.r8.optimize.accessmodification;
import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.SystemPropertyUtils;
public class AccessModifierOptions {
// TODO(b/131130038): Do not allow accessmodification when kept.
- private boolean forceModifyPackagePrivateAndProtectedMethods = true;
+ private boolean forceModifyPackagePrivateAndProtectedMethods =
+ SystemPropertyUtils.parseSystemPropertyOrDefault(
+ "com.android.tools.r8.accessmodification.forcePackagePrivateAndProtected", true);
private final InternalOptions options;
@@ -25,10 +28,7 @@
if (isAccessModificationRulePresent()) {
return true;
}
- // TODO(b/288062771): Enable access modification by default for L8.
- return !options.getLibraryDesugaringOptions().isL8()
- && !options.forceProguardCompatibility
- && options.isOptimizing();
+ return !options.forceProguardCompatibility && options.isOptimizing();
}
private boolean isAccessModificationRulePresent() {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java
index 290a3c5..ef02ac6 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java
@@ -18,6 +18,7 @@
import static com.android.tools.r8.utils.FileUtils.JAVA_EXTENSION;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.SingleTestRunResult;
import com.android.tools.r8.TestParameters;
@@ -275,7 +276,7 @@
Assume.assumeFalse(
"getAllFilesWithSuffixInDirectory() seems to find different files on Windows",
ToolHelper.isWindows());
- Assume.assumeTrue(
+ assumeTrue(
"Requires Java base extensions, should add it when not desugaring",
parameters.getApiLevel().getLevel() < AndroidApiLevel.N.getLevel());
@@ -289,19 +290,34 @@
Arrays.stream(JDK_11_STREAM_TEST_COMPILED_FILES)
.filter(file -> !file.toString().contains("lang/invoke"))
.collect(Collectors.toList());
- return testForDesugaredLibrary(
- parameters, libraryDesugaringSpecification, compilationSpecification)
- .addProgramFiles(filesToCompile)
- .applyIf(
- !libraryDesugaringSpecification.hasNioFileDesugaring(parameters),
- b -> b.addProgramFiles(getPathsFiles()))
- .addProgramFiles(getSafeVarArgsFile())
- .addProgramFiles(testNGSupportProgramFiles())
- .addProgramClassFileData(getTestNGMainRunner())
- .addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true)
- .disableL8AnnotationRemoval()
- .compile()
- .withArt6Plus64BitsLib();
+ // Prohibit publicizing LoggingTestCase#setContext. Currently L8 does not support modifying the
+ // InternalOptions for the R8 compilation inside L8, so we use a system property.
+ System.setProperty(
+ "com.android.tools.r8.accessmodification.forcePackagePrivateAndProtected", "0");
+ try {
+ return testForDesugaredLibrary(
+ parameters, libraryDesugaringSpecification, compilationSpecification)
+ .addProgramFiles(filesToCompile)
+ .applyIf(
+ !libraryDesugaringSpecification.hasNioFileDesugaring(parameters),
+ b -> b.addProgramFiles(getPathsFiles()))
+ .addProgramFiles(getSafeVarArgsFile())
+ .addProgramFiles(testNGSupportProgramFiles())
+ .addProgramClassFileData(getTestNGMainRunner())
+ .addL8KeepRules(
+ // Keep LoggingTestCase#setContext so that it is not publicized.
+ // Otherwise, the test runner incorrectly tries to run it as a @Test.
+ "-keepclassmembers class j$.util.stream.LoggingTestCase {",
+ " protected void setContext(java.lang.String, java.lang.Object);",
+ "}")
+ .addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true)
+ .disableL8AnnotationRemoval()
+ .compile()
+ .withArt6Plus64BitsLib();
+ } finally {
+ System.clearProperty(
+ "com.android.tools.r8.accessmodification.forcePackagePrivateAndProtected");
+ }
}
private void runSuccessfulTests(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java
index fe478900..dc0a0ce 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java
@@ -37,6 +37,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
@@ -266,6 +267,17 @@
.applyIf(
!libraryDesugaringSpecification.hasNioFileDesugaring(parameters),
b -> b.addProgramFiles(getPathsFiles()))
+ .apply(
+ b ->
+ // JDK 11 time tests inspect the visibility of private fields and constructors
+ // using reflection.
+ forEachImmutableClass(
+ className ->
+ b.addL8KeepRules(
+ "-keepclassmembers class " + className + " {",
+ " private final <fields>;",
+ " private <init>(...);",
+ "}")))
.compile()
.withArt6Plus64BitsLib();
for (String success : toRun) {
@@ -282,4 +294,21 @@
}
}
}
+
+ private static void forEachImmutableClass(Consumer<String> consumer) {
+ consumer.accept("j$.time.Duration");
+ consumer.accept("j$.time.Instant");
+ consumer.accept("j$.time.LocalDate");
+ consumer.accept("j$.time.LocalDateTime");
+ consumer.accept("j$.time.LocalTime");
+ consumer.accept("j$.time.MonthDay");
+ consumer.accept("j$.time.OffsetDateTime");
+ consumer.accept("j$.time.OffsetTime");
+ consumer.accept("j$.time.Period");
+ consumer.accept("j$.time.Year");
+ consumer.accept("j$.time.YearMonth");
+ consumer.accept("j$.time.ZonedDateTime");
+ consumer.accept("j$.time.ZoneOffset");
+ consumer.accept("j$.time.temporal.ValueRange");
+ }
}
diff --git a/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
index 1c2b231..2128db5 100644
--- a/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
@@ -33,6 +33,7 @@
import com.android.tools.r8.utils.ConsumerUtils;
import com.android.tools.r8.utils.FileUtils;
import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.ThrowingConsumer;
import com.android.tools.r8.utils.codeinspector.VerticallyMergedClassesInspector;
import com.google.common.base.Charsets;
@@ -55,7 +56,7 @@
private final CompilationSpecification compilationSpecification;
private final TestCompilerBuilder<?, ?, ?, ? extends SingleTestRunResult<?>, ?> builder;
private List<ArtProfileForRewriting> l8ArtProfilesForRewriting = new ArrayList<>();
- private String l8ExtraKeepRules = "";
+ private List<String> l8ExtraKeepRules = new ArrayList<>();
private Consumer<InternalOptions> l8OptionModifier = ConsumerUtils.emptyConsumer();
private boolean l8FinalPrefixVerification = true;
private boolean overrideDefaultLibrary = false;
@@ -281,9 +282,9 @@
return this;
}
- public DesugaredLibraryTestBuilder<T> addL8KeepRules(String keepRules) {
+ public DesugaredLibraryTestBuilder<T> addL8KeepRules(String... keepRules) {
if (compilationSpecification.isL8Shrink()) {
- l8ExtraKeepRules += keepRules + "\n";
+ Collections.addAll(l8ExtraKeepRules, keepRules);
}
return this;
}
@@ -465,7 +466,7 @@
l8Builder
.applyIf(
compilationSpecification.isL8Shrink() && !l8ExtraKeepRules.isEmpty(),
- b -> b.addKeepRules(l8ExtraKeepRules))
+ b -> b.addKeepRules(StringUtils.lines(l8ExtraKeepRules)))
.addOptionsModifier(l8OptionModifier);
for (ArtProfileForRewriting artProfileForRewriting : l8ArtProfilesForRewriting) {
l8Builder.addArtProfileForRewriting(
diff --git a/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
index 2fb1cc6..4ca66ed 100644
--- a/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
+++ b/src/test/testbase/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
@@ -180,6 +180,11 @@
return l8Compile.writeToZip();
}
+ public DesugaredLibraryTestCompileResult<T> writeL8ToZip(Path path) throws IOException {
+ l8Compile.writeToZip(path);
+ return this;
+ }
+
public DesugaredLibraryTestCompileResult<T> addRunClasspathFiles(Path... classpathFiles) {
runnableCompiledResult.addRunClasspathFiles(classpathFiles);
return this;