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());