Ignore disallowaccessmodification for package-private/protected methods
Bug: b/132677331
Bug: b/131130038
Change-Id: Ib75045d1230ce0bea5cb66e35d64e4c6c7754056
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignaturePrinter.java b/src/main/java/com/android/tools/r8/graph/GenericSignaturePrinter.java
index cff0d21..b5fc8e9 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignaturePrinter.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignaturePrinter.java
@@ -200,11 +200,13 @@
} else {
DexType enclosingType = classTypeSignature.enclosingTypeSignature.type;
String outerDescriptor = namingLens.lookupDescriptor(enclosingType).toString();
- String innerClassName = DescriptorUtils.getInnerClassName(outerDescriptor, renamedString);
+ String innerClassName =
+ DescriptorUtils.getInnerClassNameFromDescriptor(outerDescriptor, renamedString);
if (innerClassName == null && isTypeMissing.test(classTypeSignature.type)) {
assert renamedString.equals(classTypeSignature.type.toDescriptorString());
innerClassName =
- DescriptorUtils.getInnerClassName(enclosingType.toDescriptorString(), renamedString);
+ DescriptorUtils.getInnerClassNameFromDescriptor(
+ enclosingType.toDescriptorString(), renamedString);
}
if (innerClassName == null) {
// We can no longer encode the inner name in the generic signature.
diff --git a/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java
index bf5e3de..a84af1a 100644
--- a/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java
+++ b/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java
@@ -233,8 +233,8 @@
&& outerClassType != null
&& innerClassAttribute.getInnerName() != null) {
String innerClassName =
- DescriptorUtils.getInnerClassName(
- newOuterClassType.toDescriptorString(), newInnerClassType.toDescriptorString());
+ DescriptorUtils.getInnerClassNameFromSimpleName(
+ newOuterClassType.getSimpleName(), newInnerClassType.getSimpleName());
if (innerClassName != null) {
newInnerName = dexItemFactory.createString(innerClassName);
} else {
diff --git a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java
index cdeb2077..210947a 100644
--- a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java
+++ b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java
@@ -63,9 +63,11 @@
AppView<AppInfoWithLiveness> appView, ExecutorService executorService, Timing timing)
throws ExecutionException {
timing.begin("Access modification");
- new AccessModifier(appView)
- .processStronglyConnectedComponents(executorService)
- .installLens(executorService, timing);
+ if (appView.options().getAccessModifierOptions().isAccessModificationEnabled()) {
+ new AccessModifier(appView)
+ .processStronglyConnectedComponents(executorService)
+ .installLens(executorService, timing);
+ }
timing.end();
}
@@ -254,8 +256,17 @@
private boolean isAccessModificationAllowed(
ProgramDefinition definition, BottomUpTraversalState traversalState) {
- if (!appView.getKeepInfo(definition).isAccessModificationAllowed(options)
- || isFailedResolutionTarget(definition)) {
+ if (!appView.getKeepInfo(definition).isAccessModificationAllowed(options)) {
+ if (!options.getAccessModifierOptions().isForceModifyingPackagePrivateAndProtectedMethods()
+ || !definition.isMethod()
+ || definition.getAccessFlags().isPrivate()) {
+ return false;
+ }
+ }
+ if (!appView.getKeepInfo(definition).isAccessModificationAllowedForTesting(options)) {
+ return false;
+ }
+ if (isFailedResolutionTarget(definition)) {
return false;
}
return definition.isClass()
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 e9b689d..99a0645 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
@@ -8,6 +8,9 @@
public class AccessModifierOptions {
+ // TODO(b/131130038): Do not allow accessmodification when kept.
+ private boolean forceModifyPackagePrivateAndProtectedMethods = true;
+
private InternalOptions options;
public AccessModifierOptions(InternalOptions options) {
@@ -33,4 +36,14 @@
return options.hasProguardConfiguration()
&& options.getProguardConfiguration().isAccessModificationAllowed();
}
+
+ public boolean isForceModifyingPackagePrivateAndProtectedMethods() {
+ return forceModifyPackagePrivateAndProtectedMethods;
+ }
+
+ public void setForceModifyPackagePrivateAndProtectedMethods(
+ boolean forceModifyPackagePrivateAndProtectedMethods) {
+ this.forceModifyPackagePrivateAndProtectedMethods =
+ forceModifyPackagePrivateAndProtectedMethods;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
index 092f4ea..fc0ec2d 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
@@ -18,6 +18,7 @@
public abstract class KeepInfo<B extends Builder<B, K>, K extends KeepInfo<B, K>> {
private final boolean allowAccessModification;
+ private final boolean allowAccessModificationForTesting;
private final boolean allowAnnotationRemoval;
private final boolean allowMinification;
private final boolean allowOptimization;
@@ -27,6 +28,7 @@
private KeepInfo(
boolean allowAccessModification,
+ boolean allowAccessModificationForTesting,
boolean allowAnnotationRemoval,
boolean allowMinification,
boolean allowOptimization,
@@ -34,6 +36,7 @@
boolean allowSignatureRemoval,
boolean checkDiscarded) {
this.allowAccessModification = allowAccessModification;
+ this.allowAccessModificationForTesting = allowAccessModificationForTesting;
this.allowAnnotationRemoval = allowAnnotationRemoval;
this.allowMinification = allowMinification;
this.allowOptimization = allowOptimization;
@@ -45,6 +48,7 @@
KeepInfo(B builder) {
this(
builder.isAccessModificationAllowed(),
+ builder.isAccessModificationAllowedForTesting(),
builder.isAnnotationRemovalAllowed(),
builder.isMinificationAllowed(),
builder.isOptimizationAllowed(),
@@ -171,6 +175,15 @@
return allowAccessModification;
}
+ public boolean isAccessModificationAllowedForTesting(GlobalKeepInfoConfiguration configuration) {
+ return internalIsAccessModificationAllowedForTesting();
+ }
+
+ // Internal accessor for the items access-modification bit.
+ boolean internalIsAccessModificationAllowedForTesting() {
+ return allowAccessModificationForTesting;
+ }
+
public boolean isEnclosingMethodAttributeRemovalAllowed(
GlobalKeepInfoConfiguration configuration,
EnclosingMethodAttribute enclosingMethodAttribute,
@@ -213,6 +226,8 @@
// An item is less, aka, lower in the lattice, if each of its attributes is at least as
// permissive of that on other.
return (allowAccessModification || !other.internalIsAccessModificationAllowed())
+ && (allowAccessModificationForTesting
+ || !other.internalIsAccessModificationAllowedForTesting())
&& (allowAnnotationRemoval || !other.internalIsAnnotationRemovalAllowed())
&& (allowMinification || !other.internalIsMinificationAllowed())
&& (allowOptimization || !other.internalIsOptimizationAllowed())
@@ -236,6 +251,7 @@
protected K original;
private boolean allowAccessModification;
+ private boolean allowAccessModificationForTesting;
private boolean allowAnnotationRemoval;
private boolean allowMinification;
private boolean allowOptimization;
@@ -250,6 +266,7 @@
Builder(K original) {
this.original = original;
allowAccessModification = original.internalIsAccessModificationAllowed();
+ allowAccessModificationForTesting = original.internalIsAccessModificationAllowedForTesting();
allowAnnotationRemoval = original.internalIsAnnotationRemovalAllowed();
allowMinification = original.internalIsMinificationAllowed();
allowOptimization = original.internalIsOptimizationAllowed();
@@ -260,6 +277,7 @@
B makeTop() {
disallowAccessModification();
+ disallowAccessModificationForTesting();
disallowAnnotationRemoval();
disallowMinification();
disallowOptimization();
@@ -271,6 +289,7 @@
B makeBottom() {
allowAccessModification();
+ allowAccessModificationForTesting();
allowAnnotationRemoval();
allowMinification();
allowOptimization();
@@ -297,6 +316,8 @@
boolean internalIsEqualTo(K other) {
return isAccessModificationAllowed() == other.internalIsAccessModificationAllowed()
+ && isAccessModificationAllowedForTesting()
+ == other.internalIsAccessModificationAllowedForTesting()
&& isAnnotationRemovalAllowed() == other.internalIsAnnotationRemovalAllowed()
&& isMinificationAllowed() == other.internalIsMinificationAllowed()
&& isOptimizationAllowed() == other.internalIsOptimizationAllowed()
@@ -309,6 +330,10 @@
return allowAccessModification;
}
+ public boolean isAccessModificationAllowedForTesting() {
+ return allowAccessModificationForTesting;
+ }
+
public boolean isAnnotationRemovalAllowed() {
return allowAnnotationRemoval;
}
@@ -398,6 +423,19 @@
return setAllowAccessModification(false);
}
+ public B setAllowAccessModificationForTesting(boolean allowAccessModificationForTesting) {
+ this.allowAccessModificationForTesting = allowAccessModificationForTesting;
+ return self();
+ }
+
+ public B allowAccessModificationForTesting() {
+ return setAllowAccessModificationForTesting(true);
+ }
+
+ public B disallowAccessModificationForTesting() {
+ return setAllowAccessModificationForTesting(false);
+ }
+
public B setAllowAnnotationRemoval(boolean allowAnnotationRemoval) {
this.allowAnnotationRemoval = allowAnnotationRemoval;
return self();
@@ -524,6 +562,11 @@
return self();
}
+ public J disallowAccessModificationForTesting() {
+ builder.disallowAccessModificationForTesting();
+ return self();
+ }
+
public J disallowAnnotationRemoval() {
builder.disallowAnnotationRemoval();
return self();
@@ -557,6 +600,9 @@
public J merge(J joiner) {
Builder<B, K> builder = joiner.builder;
applyIf(!builder.isAccessModificationAllowed(), Joiner::disallowAccessModification);
+ applyIf(
+ !builder.isAccessModificationAllowedForTesting(),
+ Joiner::disallowAccessModificationForTesting);
applyIf(!builder.isAnnotationRemovalAllowed(), Joiner::disallowAnnotationRemoval);
applyIf(!builder.isMinificationAllowed(), Joiner::disallowMinification);
applyIf(!builder.isOptimizationAllowed(), Joiner::disallowOptimization);
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
index 1797948..8678717 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -1238,7 +1238,7 @@
assert item.isProgramDefinition();
dependentMinimumKeepInfo
.getOrCreateUnconditionalMinimumKeepInfoFor(item.getReference())
- .disallowAccessModification();
+ .disallowAccessModificationForTesting();
context.markAsUsed();
} else if (context instanceof NoFieldTypeStrengtheningRule) {
assert item.isProgramField();
diff --git a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
index 19b4d38..df0ac25 100644
--- a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
@@ -740,7 +740,8 @@
* @param innerDescriptor the inner descriptor, such as Lfoo/bar/Baz$Qux;
* @return the inner name or null, i.e. Qux in the example above
*/
- public static String getInnerClassName(String outerDescriptor, String innerDescriptor) {
+ public static String getInnerClassNameFromDescriptor(
+ String outerDescriptor, String innerDescriptor) {
if (innerDescriptor.length() <= outerDescriptor.length()) {
return null;
}
@@ -752,6 +753,18 @@
return null;
}
+ public static String getInnerClassNameFromSimpleName(
+ String outerSimpleName, String innerSimpleName) {
+ if (innerSimpleName.length() <= outerSimpleName.length()) {
+ return null;
+ }
+ String prefix = outerSimpleName + INNER_CLASS_SEPARATOR;
+ if (innerSimpleName.startsWith(prefix)) {
+ return innerSimpleName.substring(prefix.length());
+ }
+ return null;
+ }
+
public static class ModuleAndDescriptor {
private final String module;
private final String descriptor;
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index c9ad0fe..6aa0a30 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -1597,6 +1597,7 @@
if (configuration != null) {
configuration.accept(options);
}
+ options.getAccessModifierOptions().setForceModifyPackagePrivateAndProtectedMethods(false);
}
@Override
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 35eb6dd..ec3a345 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -1757,6 +1757,11 @@
&& parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N);
}
+ // TODO(b/131130038): Do not allow accessmodification when kept.
+ public boolean isForceAccessModifyingPackagePrivateAndProtectedMethods() {
+ return true;
+ }
+
public Path compileToZip(
TestParameters parameters, Collection<Class<?>> classPath, Class<?>... compilationUnit)
throws Exception {
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationByDefaultTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationByDefaultTest.java
index ebe8d35..cf4b361 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationByDefaultTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationByDefaultTest.java
@@ -37,8 +37,17 @@
}
@Test
- public void test() throws Exception {
- testForR8(parameters.getBackend())
+ public void testR8() throws Exception {
+ runTest(false);
+ }
+
+ @Test
+ public void testR8Compat() throws Exception {
+ runTest(true);
+ }
+
+ private void runTest(boolean isCompat) throws Exception {
+ testForR8Compat(parameters.getBackend(), isCompat)
.addInnerClasses(getClass())
.addKeepMainRule(Main.class)
.addKeepClassRules(B.class)
@@ -52,11 +61,12 @@
inspector -> {
ClassSubject aClassSubject = inspector.clazz(A.class);
assertThat(aClassSubject, isPresent());
- assertThat(aClassSubject, isPublic()); // Always publicized.
+ assertThat(aClassSubject, onlyIf(!isCompat, isPublic())); // Always publicized.
MethodSubject fooMethodSubject = aClassSubject.uniqueMethodWithOriginalName("foo");
assertThat(fooMethodSubject, isPresent());
- assertThat(fooMethodSubject, onlyIf(parameters.isDexRuntime(), isPublic()));
+ assertThat(
+ fooMethodSubject, onlyIf(parameters.isDexRuntime() && !isCompat, isPublic()));
ClassSubject bClassSubject = inspector.clazz(B.class);
assertThat(bClassSubject, isPresent());
@@ -64,15 +74,16 @@
MethodSubject barMethodSubject = bClassSubject.uniqueMethodWithOriginalName("bar");
assertThat(barMethodSubject, isPresent());
- assertThat(barMethodSubject, onlyIf(parameters.isDexRuntime(), isPublic()));
+ assertThat(
+ barMethodSubject, onlyIf(parameters.isDexRuntime() && !isCompat, isPublic()));
ClassSubject cClassSubject = inspector.clazz(C.class);
assertThat(cClassSubject, isPresent());
- assertThat(cClassSubject, isPublic()); // Always publicized.
+ assertThat(cClassSubject, onlyIf(!isCompat, isPublic())); // Always publicized.
MethodSubject bazMethodSubject = cClassSubject.uniqueMethodWithOriginalName("baz");
assertThat(bazMethodSubject, isPresent());
- assertThat(bazMethodSubject, isPublic()); // Always publicized.
+ assertThat(bazMethodSubject, onlyIf(!isCompat, isPublic())); // Always publicized.
})
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("A.foo()", "B.bar()", "C.baz()");
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java
index 7b02aea..156a17d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java
@@ -203,7 +203,11 @@
public static class FeatureAPI {
private static String featureClassName() {
- return FeatureAPI.class.getPackage().getName() + ".B149971007$FeatureClass";
+ String packageName =
+ System.currentTimeMillis() > 0
+ ? "com.android.tools.r8.ir.optimize.outliner.b149971007"
+ : null;
+ return packageName + ".B149971007$FeatureClass";
}
public static boolean hasFeature() {
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
index ac6b939..4505562 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
@@ -77,6 +77,7 @@
.enableExperimentalKeepAnnotations()
.addProgramClasses(getInputClasses())
.addKeepMainRule(TestClass.class)
+ .allowAccessModification()
.setMinApi(parameters)
.run(parameters.getRuntime(), TestClass.class)
.assertSuccessWithOutput(EXPECTED)
@@ -235,6 +236,11 @@
int mod = method.getModifiers();
if (!Modifier.isPublic(mod) && !Modifier.isProtected(mod)) {
privateOrPackagePrivateMethods.add(method.getName());
+ } else {
+ // TODO(b/131130038): The package-private method should not be publicized.
+ if (method.getName().equals("packagePrivateMethod")) {
+ privateOrPackagePrivateMethods.add(method.getName());
+ }
}
}
printSorted(privateOrPackagePrivateMethods);
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java
index b8c55aa..9d064d7 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java
@@ -29,6 +29,7 @@
public class KeepMethodsEmptyAccessFlagsTest extends TestBase {
static final String EXPECTED = StringUtils.lines("hello", "world");
+ static final String EXPECTED_ACCESS_MODIFICATION = StringUtils.lines("hello", "old", "world");
private final TestParameters parameters;
@@ -57,7 +58,11 @@
.addKeepMainRule(TestClass.class)
.setMinApi(parameters)
.run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutput(EXPECTED)
+ // TODO(b/131130038): Should not publicize kept method old().
+ .assertSuccessWithOutput(
+ parameters.isAccessModificationEnabledByDefault() && parameters.isDexRuntime()
+ ? EXPECTED_ACCESS_MODIFICATION
+ : EXPECTED)
.inspect(this::checkOutput);
}
@@ -111,7 +116,7 @@
static class TestClass {
- public static void main(String[] args) throws Exception {
+ public static void main(String[] args) {
new A().foo();
}
}
diff --git a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
index c70796d..8db8492 100644
--- a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
+++ b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
@@ -6,6 +6,7 @@
import static com.android.tools.r8.utils.codeinspector.Matchers.isPackagePrivate;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPublic;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
@@ -112,7 +113,7 @@
@Test
public void test_keepAll() throws Exception {
Assume.assumeFalse(shrinker.generatesDex() && vmVersionIgnored());
- Class mainClass = TestMain.class;
+ Class<?> mainClass = TestMain.class;
String keep = !minify ? "-keep" : "-keep,allowobfuscation";
List<String> config = ImmutableList.of(
"-printmapping",
@@ -144,7 +145,11 @@
// Test the totally unused method.
MethodSubject staticMethod = testClass.uniqueMethodWithOriginalName("unused");
assertThat(staticMethod, isPresent());
- assertThat(staticMethod, isPackagePrivate());
+ assertThat(
+ staticMethod,
+ isForceAccessModifyingPackagePrivateAndProtectedMethods()
+ ? isPublic()
+ : isPackagePrivate());
assertEquals(minify, staticMethod.isRenamed());
// Test an indirectly referred method.
@@ -152,10 +157,23 @@
assertThat(staticMethod, isPresent());
assertEquals(minify, staticMethod.isRenamed());
boolean publicizeCondition =
- shrinker.isProguard() && minify && repackagePrefix != null && allowAccessModification;
+ isForceAccessModifyingPackagePrivateAndProtectedMethods()
+ || (shrinker.isProguard()
+ && minify
+ && repackagePrefix != null
+ && allowAccessModification);
assertEquals(publicizeCondition, staticMethod.getMethod().isPublic());
}
+ @Override
+ public boolean isForceAccessModifyingPackagePrivateAndProtectedMethods() {
+ if (!super.isForceAccessModifyingPackagePrivateAndProtectedMethods()) {
+ return false;
+ }
+ return (shrinker.isCompatR8() && allowAccessModification)
+ || (shrinker.isFullModeR8() && (shrinker.isR8Dex() || allowAccessModification || minify));
+ }
+
@Test
public void test_keepNonPublic() throws Exception {
Assume.assumeFalse(shrinker.generatesDex() && vmVersionIgnored());
@@ -191,7 +209,11 @@
// Test the totally unused method.
MethodSubject staticMethod = testClass.uniqueMethodWithOriginalName("unused");
assertThat(staticMethod, isPresent());
- assertThat(staticMethod, isPackagePrivate());
+ assertThat(
+ staticMethod,
+ isForceAccessModifyingPackagePrivateAndProtectedMethods()
+ ? isPublic()
+ : isPackagePrivate());
assertEquals(minify, staticMethod.isRenamed());
// Test an indirectly referred method.
@@ -199,7 +221,11 @@
assertThat(staticMethod, isPresent());
assertEquals(minify, staticMethod.isRenamed());
boolean publicizeCondition =
- shrinker.isProguard() && minify && repackagePrefix != null && allowAccessModification;
+ isForceAccessModifyingPackagePrivateAndProtectedMethods()
+ || (shrinker.isProguard()
+ && minify
+ && repackagePrefix != null
+ && allowAccessModification);
assertEquals(publicizeCondition, staticMethod.getMethod().isPublic());
}
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java
index f1965fe..b1c34e2 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java
@@ -6,6 +6,7 @@
import static org.hamcrest.MatcherAssert.assertThat;
+import com.android.tools.r8.NoAccessModification;
import com.android.tools.r8.TestParameters;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -30,6 +31,7 @@
"-keep,allowrepackage class " + typeName(ShouldStayInPackage.class) + " { *; }")
.addKeepRules(
"-keep,allowrepackage class " + typeName(ShouldBeRepackaged.class) + " { *; }")
+ .enableNoAccessModificationAnnotationsForMembers()
.compile()
.inspect(
inspector -> {
@@ -42,6 +44,7 @@
public static class ShouldStayInPackage {
+ @NoAccessModification
static void foo() {
System.out.println("ShouldStayInPackage::foo");
}
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
index f8b580c..7af5d20 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
@@ -176,7 +176,11 @@
assertThat(methodSubject, not(isPresent()));
methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
assertThat(methodSubject, isPresent());
- assertThat(methodSubject, isPackagePrivate());
+ assertThat(
+ methodSubject,
+ shrinker.isR8() && isForceAccessModifyingPackagePrivateAndProtectedMethods()
+ ? isPublic()
+ : isPackagePrivate());
});
}
@@ -255,7 +259,11 @@
assertThat(methodSubject, not(isPresent()));
methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
assertThat(methodSubject, isPresent());
- assertThat(methodSubject, isPackagePrivate());
+ assertThat(
+ methodSubject,
+ shrinker.isR8() && isForceAccessModifyingPackagePrivateAndProtectedMethods()
+ ? isPublic()
+ : isPackagePrivate());
});
}
}
diff --git a/src/test/java/com/android/tools/r8/shaking/innerclassattributes/MissingOuterClassTest.java b/src/test/java/com/android/tools/r8/shaking/innerclassattributes/MissingOuterClassTest.java
index c16510e..8124058 100644
--- a/src/test/java/com/android/tools/r8/shaking/innerclassattributes/MissingOuterClassTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/innerclassattributes/MissingOuterClassTest.java
@@ -82,8 +82,9 @@
assertEquals(outerClassSubject.getDexProgramClass().getType(), innerClassAttribute.getOuter());
if (parameters.isCfRuntime() || hostClassSubject == innerClassSubject) {
assertEquals(
- DescriptorUtils.getInnerClassName(
- outerClassSubject.getFinalDescriptor(), innerClassSubject.getFinalDescriptor()),
+ DescriptorUtils.getInnerClassNameFromSimpleName(
+ outerClassSubject.getDexProgramClass().getSimpleName(),
+ innerClassSubject.getDexProgramClass().getSimpleName()),
innerClassAttribute.getInnerName().toSourceString());
} else {
assertEquals(DexItemFactory.unknownTypeName, innerClassAttribute.getInnerName());