Repackaging of classes with members having package dependent visibility RELNOTES: R8 will start to repackage classes, if possible, where the class or members have package dependent visibility. Bug: b/250671873 Change-Id: Icb492d737aeed5aea7260abaae089c6eef44f1f5
diff --git a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java index f292409..d3aee17 100644 --- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java +++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -440,7 +440,7 @@ + simpleName.substring(outerClassSimpleName.length()); repackagedDexType = repackagedDexType.withSimpleName(newSimpleName, dexItemFactory); } else { - assert false + assert options.disableInnerClassSeparatorValidationWhenRepackaging : "Unexpected name for inner class: " + clazz.getType().toSourceString() + " (outer class: "
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java index a8058ac..9e0db7a 100644 --- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java +++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -64,7 +64,6 @@ import com.android.tools.r8.utils.ListUtils; import com.android.tools.r8.utils.PredicateSet; import com.android.tools.r8.utils.ThreadUtils; -import com.android.tools.r8.utils.TraversalContinuation; import com.android.tools.r8.utils.Visibility; import com.android.tools.r8.utils.WorkList; import com.android.tools.r8.utils.collections.ProgramMethodSet; @@ -1089,22 +1088,11 @@ if (!options().isRepackagingEnabled()) { return false; } - if (!keepInfo.getInfo(clazz).isRepackagingAllowed(clazz, options())) { + if (!keepInfo.getInfo(clazz).isRepackagingAllowed(options())) { return false; } SeedMapper applyMappingSeedMapper = appView.getApplyMappingSeedMapper(); - if (applyMappingSeedMapper != null && applyMappingSeedMapper.hasMapping(clazz.type)) { - return false; - } - return clazz - .traverseProgramMembers( - member -> { - if (keepInfo.getInfo(member).isRepackagingAllowed(member, options())) { - return TraversalContinuation.doContinue(); - } - return TraversalContinuation.doBreak(); - }) - .shouldContinue(); + return applyMappingSeedMapper == null || !applyMappingSeedMapper.hasMapping(clazz.type); } public boolean isPinned(DexReference reference) {
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java index 9785028..f504792 100644 --- a/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java +++ b/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java
@@ -7,7 +7,6 @@ import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.ProgramDefinition; import com.android.tools.r8.utils.InternalOptions; import java.util.function.Function; @@ -15,10 +14,10 @@ public final class KeepClassInfo extends KeepInfo<KeepClassInfo.Builder, KeepClassInfo> { // Requires all aspects of a class to be kept. - private static final KeepClassInfo TOP = new Builder().makeTop().build(); + private static final KeepClassInfo TOP = new Builder().makeTop().disallowRepackaging().build(); // Requires no aspects of a class to be kept. - private static final KeepClassInfo BOTTOM = new Builder().makeBottom().build(); + private static final KeepClassInfo BOTTOM = new Builder().makeBottom().allowRepackaging().build(); public static KeepClassInfo top() { return TOP; @@ -32,10 +31,12 @@ return bottom().joiner(); } + private final boolean allowRepackaging; private final boolean checkEnumUnboxed; private KeepClassInfo(Builder builder) { super(builder); + this.allowRepackaging = builder.isRepackagingAllowed(); this.checkEnumUnboxed = builder.isCheckEnumUnboxedEnabled(); } @@ -57,13 +58,18 @@ return new Joiner(this); } - @Override - public boolean isRepackagingAllowed( - ProgramDefinition definition, GlobalKeepInfoConfiguration configuration) { - return configuration.isRepackagingEnabled() - && internalIsRepackagingAllowed() - && (definition.getAccessFlags().isPublic() - || !internalIsAccessModificationRequiredForRepackaging()); + /** + * True if an item may be repackaged. + * + * <p>This method requires knowledge of the global configuration as that can override the concrete + * value on a given item. + */ + public boolean isRepackagingAllowed(GlobalKeepInfoConfiguration configuration) { + return configuration.isRepackagingEnabled() && internalIsRepackagingAllowed(); + } + + boolean internalIsRepackagingAllowed() { + return allowRepackaging; } public boolean isKotlinMetadataRemovalAllowed( @@ -98,6 +104,7 @@ public static class Builder extends KeepInfo.Builder<Builder, KeepClassInfo> { + private boolean allowRepackaging; private boolean checkEnumUnboxed; private Builder() { @@ -106,6 +113,7 @@ private Builder(KeepClassInfo original) { super(original); + allowRepackaging = original.internalIsRepackagingAllowed(); checkEnumUnboxed = original.internalIsCheckEnumUnboxedEnabled(); } @@ -120,6 +128,23 @@ return self(); } + public boolean isRepackagingAllowed() { + return allowRepackaging; + } + + private Builder setAllowRepackaging(boolean allowRepackaging) { + this.allowRepackaging = allowRepackaging; + return self(); + } + + public Builder allowRepackaging() { + return setAllowRepackaging(true); + } + + public Builder disallowRepackaging() { + return setAllowRepackaging(false); + } + public Builder setCheckEnumUnboxed() { return setCheckEnumUnboxed(true); } @@ -151,6 +176,7 @@ @Override boolean internalIsEqualTo(KeepClassInfo other) { return super.internalIsEqualTo(other) + && isRepackagingAllowed() == other.internalIsRepackagingAllowed() && isCheckEnumUnboxedEnabled() == other.internalIsCheckEnumUnboxedEnabled(); } @@ -161,12 +187,12 @@ @Override public Builder makeTop() { - return super.makeTop().unsetCheckEnumUnboxed(); + return super.makeTop().unsetCheckEnumUnboxed().disallowRepackaging(); } @Override public Builder makeBottom() { - return super.makeBottom().unsetCheckEnumUnboxed(); + return super.makeBottom().unsetCheckEnumUnboxed().allowRepackaging(); } } @@ -181,6 +207,11 @@ return self(); } + public Joiner disallowRepackaging() { + builder.disallowRepackaging(); + return self(); + } + @Override public Joiner asClassJoiner() { return this; @@ -190,7 +221,8 @@ public Joiner merge(Joiner joiner) { // Should be extended to merge the fields of this class in case any are added. return super.merge(joiner) - .applyIf(joiner.builder.isCheckEnumUnboxedEnabled(), Joiner::setCheckEnumUnboxed); + .applyIf(joiner.builder.isCheckEnumUnboxedEnabled(), Joiner::setCheckEnumUnboxed) + .applyIf(!joiner.builder.isRepackagingAllowed(), Joiner::disallowRepackaging); } @Override
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 d9708ce..092f4ea 100644 --- a/src/main/java/com/android/tools/r8/shaking/KeepInfo.java +++ b/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
@@ -6,7 +6,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexReference; import com.android.tools.r8.graph.EnclosingMethodAttribute; -import com.android.tools.r8.graph.ProgramDefinition; import com.android.tools.r8.shaking.KeepInfo.Builder; import com.android.tools.r8.shaking.KeepReason.ReflectiveUseFrom; import com.android.tools.r8.utils.InternalOptions; @@ -22,31 +21,25 @@ private final boolean allowAnnotationRemoval; private final boolean allowMinification; private final boolean allowOptimization; - private final boolean allowRepackaging; private final boolean allowShrinking; private final boolean allowSignatureRemoval; private final boolean checkDiscarded; - private final boolean requireAccessModificationForRepackaging; private KeepInfo( boolean allowAccessModification, boolean allowAnnotationRemoval, boolean allowMinification, boolean allowOptimization, - boolean allowRepackaging, boolean allowShrinking, boolean allowSignatureRemoval, - boolean checkDiscarded, - boolean requireAccessModificationForRepackaging) { + boolean checkDiscarded) { this.allowAccessModification = allowAccessModification; this.allowAnnotationRemoval = allowAnnotationRemoval; this.allowMinification = allowMinification; this.allowOptimization = allowOptimization; - this.allowRepackaging = allowRepackaging; this.allowShrinking = allowShrinking; this.allowSignatureRemoval = allowSignatureRemoval; this.checkDiscarded = checkDiscarded; - this.requireAccessModificationForRepackaging = requireAccessModificationForRepackaging; } KeepInfo(B builder) { @@ -55,11 +48,9 @@ builder.isAnnotationRemovalAllowed(), builder.isMinificationAllowed(), builder.isOptimizationAllowed(), - builder.isRepackagingAllowed(), builder.isShrinkingAllowed(), builder.isSignatureRemovalAllowed(), - builder.isCheckDiscardedEnabled(), - builder.isAccessModificationRequiredForRepackaging()); + builder.isCheckDiscardedEnabled()); } public static Joiner<?, ?, ?> newEmptyJoinerFor(DexReference reference) { @@ -164,23 +155,6 @@ } /** - * True if an item may be repackaged. - * - * <p>This method requires knowledge of the global configuration as that can override the concrete - * value on a given item. - */ - public abstract boolean isRepackagingAllowed( - ProgramDefinition definition, GlobalKeepInfoConfiguration configuration); - - boolean internalIsRepackagingAllowed() { - return allowRepackaging; - } - - boolean internalIsAccessModificationRequiredForRepackaging() { - return requireAccessModificationForRepackaging; - } - - /** * True if an item may have its access flags modified. * * <p>This method requires knowledge of the global access modification as that will override the @@ -242,7 +216,6 @@ && (allowAnnotationRemoval || !other.internalIsAnnotationRemovalAllowed()) && (allowMinification || !other.internalIsMinificationAllowed()) && (allowOptimization || !other.internalIsOptimizationAllowed()) - && (allowRepackaging || !other.internalIsRepackagingAllowed()) && (allowShrinking || !other.internalIsShrinkingAllowed()) && (allowSignatureRemoval || !other.internalIsSignatureRemovalAllowed()) && (!checkDiscarded || other.internalIsCheckDiscardedEnabled()); @@ -265,12 +238,10 @@ private boolean allowAccessModification; private boolean allowAnnotationRemoval; private boolean allowMinification; - private boolean allowRepackaging; private boolean allowOptimization; private boolean allowShrinking; private boolean allowSignatureRemoval; private boolean checkDiscarded; - private boolean requireAccessModificationForRepackaging; Builder() { // Default initialized. Use should be followed by makeTop/makeBottom. @@ -282,12 +253,9 @@ allowAnnotationRemoval = original.internalIsAnnotationRemovalAllowed(); allowMinification = original.internalIsMinificationAllowed(); allowOptimization = original.internalIsOptimizationAllowed(); - allowRepackaging = original.internalIsRepackagingAllowed(); allowShrinking = original.internalIsShrinkingAllowed(); allowSignatureRemoval = original.internalIsSignatureRemovalAllowed(); checkDiscarded = original.internalIsCheckDiscardedEnabled(); - requireAccessModificationForRepackaging = - original.internalIsAccessModificationRequiredForRepackaging(); } B makeTop() { @@ -295,11 +263,9 @@ disallowAnnotationRemoval(); disallowMinification(); disallowOptimization(); - disallowRepackaging(); disallowShrinking(); disallowSignatureRemoval(); unsetCheckDiscarded(); - requireAccessModificationForRepackaging(); return self(); } @@ -308,11 +274,9 @@ allowAnnotationRemoval(); allowMinification(); allowOptimization(); - allowRepackaging(); allowShrinking(); allowSignatureRemoval(); unsetCheckDiscarded(); - unsetRequireAccessModificationForRepackaging(); return self(); } @@ -336,16 +300,9 @@ && isAnnotationRemovalAllowed() == other.internalIsAnnotationRemovalAllowed() && isMinificationAllowed() == other.internalIsMinificationAllowed() && isOptimizationAllowed() == other.internalIsOptimizationAllowed() - && isRepackagingAllowed() == other.internalIsRepackagingAllowed() && isShrinkingAllowed() == other.internalIsShrinkingAllowed() && isSignatureRemovalAllowed() == other.internalIsSignatureRemovalAllowed() - && isCheckDiscardedEnabled() == other.internalIsCheckDiscardedEnabled() - && isAccessModificationRequiredForRepackaging() - == other.internalIsAccessModificationRequiredForRepackaging(); - } - - public boolean isAccessModificationRequiredForRepackaging() { - return requireAccessModificationForRepackaging; + && isCheckDiscardedEnabled() == other.internalIsCheckDiscardedEnabled(); } public boolean isAccessModificationAllowed() { @@ -368,10 +325,6 @@ return allowOptimization; } - public boolean isRepackagingAllowed() { - return allowRepackaging; - } - public boolean isShrinkingAllowed() { return allowShrinking; } @@ -393,19 +346,6 @@ return setAllowMinification(false); } - public B setAllowRepackaging(boolean allowRepackaging) { - this.allowRepackaging = allowRepackaging; - return self(); - } - - public B allowRepackaging() { - return setAllowRepackaging(true); - } - - public B disallowRepackaging() { - return setAllowRepackaging(false); - } - public B setAllowOptimization(boolean allowOptimization) { this.allowOptimization = allowOptimization; return self(); @@ -445,20 +385,6 @@ return setCheckDiscarded(false); } - public B setRequireAccessModificationForRepackaging( - boolean requireAccessModificationForRepackaging) { - this.requireAccessModificationForRepackaging = requireAccessModificationForRepackaging; - return self(); - } - - public B requireAccessModificationForRepackaging() { - return setRequireAccessModificationForRepackaging(true); - } - - public B unsetRequireAccessModificationForRepackaging() { - return setRequireAccessModificationForRepackaging(false); - } - public B setAllowAccessModification(boolean allowAccessModification) { this.allowAccessModification = allowAccessModification; return self(); @@ -608,11 +534,6 @@ return self(); } - public J disallowRepackaging() { - builder.disallowRepackaging(); - return self(); - } - public J disallowOptimization() { builder.disallowOptimization(); return self(); @@ -633,24 +554,15 @@ return self(); } - public J requireAccessModificationForRepackaging() { - builder.requireAccessModificationForRepackaging(); - return self(); - } - public J merge(J joiner) { Builder<B, K> builder = joiner.builder; applyIf(!builder.isAccessModificationAllowed(), Joiner::disallowAccessModification); applyIf(!builder.isAnnotationRemovalAllowed(), Joiner::disallowAnnotationRemoval); applyIf(!builder.isMinificationAllowed(), Joiner::disallowMinification); applyIf(!builder.isOptimizationAllowed(), Joiner::disallowOptimization); - applyIf(!builder.isRepackagingAllowed(), Joiner::disallowRepackaging); applyIf(!builder.isShrinkingAllowed(), Joiner::disallowShrinking); applyIf(!builder.isSignatureRemovalAllowed(), Joiner::disallowSignatureRemoval); applyIf(builder.isCheckDiscardedEnabled(), Joiner::setCheckDiscarded); - applyIf( - builder.isAccessModificationRequiredForRepackaging(), - Joiner::requireAccessModificationForRepackaging); reasons.addAll(joiner.reasons); rules.addAll(joiner.rules); return self();
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java index 62529ed..c78e39a 100644 --- a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java +++ b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
@@ -140,6 +140,10 @@ throw new Unreachable(); } + public final KeepClassInfo getInfo(DexProgramClass clazz) { + return getClassInfo(clazz); + } + public final KeepInfo<?, ?> getInfo(ProgramDefinition definition) { if (definition.isProgramClass()) { return getClassInfo(definition.asProgramClass()); @@ -279,8 +283,7 @@ assert newType == type || !info.isPinned(options) || info.isMinificationAllowed(options) - || info.isRepackagingAllowed( - definitions.definitionFor(newType).asProgramClass(), options); + || info.isRepackagingAllowed(options); KeepClassInfo previous = newClassInfo.put(newType, info); assert previous == null; }); @@ -461,29 +464,6 @@ joinMethod(method, KeepInfo.Joiner::top); } - public void unsetRequireAllowAccessModificationForRepackaging(ProgramDefinition definition) { - if (definition.isProgramClass()) { - DexProgramClass clazz = definition.asProgramClass(); - KeepClassInfo info = getClassInfo(clazz); - keepClassInfo.put( - clazz.getType(), info.builder().unsetRequireAccessModificationForRepackaging().build()); - } else if (definition.isProgramMethod()) { - ProgramMethod method = definition.asProgramMethod(); - KeepMethodInfo info = getMethodInfo(method); - keepMethodInfo.put( - method.getReference(), - info.builder().unsetRequireAccessModificationForRepackaging().build()); - } else if (definition.isProgramField()) { - ProgramField field = definition.asProgramField(); - KeepFieldInfo info = getFieldInfo(field); - keepFieldInfo.put( - field.getReference(), - info.builder().unsetRequireAccessModificationForRepackaging().build()); - } else { - throw new Unreachable(); - } - } - public void joinField(ProgramField field, Consumer<? super KeepFieldInfo.Joiner> fn) { KeepFieldInfo info = getFieldInfo(field); if (info.isTop()) {
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepMemberInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepMemberInfo.java index 2225e14..e77c27e 100644 --- a/src/main/java/com/android/tools/r8/shaking/KeepMemberInfo.java +++ b/src/main/java/com/android/tools/r8/shaking/KeepMemberInfo.java
@@ -4,7 +4,6 @@ package com.android.tools.r8.shaking; import com.android.tools.r8.graph.DexProgramClass; -import com.android.tools.r8.graph.ProgramDefinition; import com.android.tools.r8.shaking.KeepInfo.Builder; /** Immutable keep requirements for a member. */ @@ -15,14 +14,6 @@ super(builder); } - @Override - public boolean isRepackagingAllowed( - ProgramDefinition definition, GlobalKeepInfoConfiguration configuration) { - return configuration.isRepackagingEnabled() - && (definition.getAccessFlags().isPublic() - || !internalIsAccessModificationRequiredForRepackaging()); - } - public boolean isKotlinMetadataRemovalAllowed( DexProgramClass holder, GlobalKeepInfoConfiguration configuration) { // Checking the holder for missing kotlin information relies on the holder being processed
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 3b46564..cc39429 100644 --- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java +++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -1135,6 +1135,7 @@ dependentMinimumKeepInfo .getOrCreateMinimumKeepInfoFor(preconditionEvent, clazz.getReference()) .disallowMinification() + .asClassJoiner() .disallowRepackaging(); } } @@ -1638,14 +1639,14 @@ dependentMinimumKeepInfo .getOrCreateMinimumKeepInfoFor(preconditionEvent, item.getReference()) .disallowMinification() - .disallowRepackaging(); + .applyIf(item.isProgramClass(), joiner -> joiner.asClassJoiner().disallowRepackaging()); context.markAsUsed(); } if (appView.options().isRepackagingEnabled() && !modifiers.allowsObfuscation) { dependentMinimumKeepInfo .getOrCreateMinimumKeepInfoFor(preconditionEvent, item.getReference()) - .disallowRepackaging(); + .applyIf(item.isProgramClass(), joiner -> joiner.asClassJoiner().disallowRepackaging()); context.markAsUsed(); } @@ -1664,10 +1665,6 @@ .addRule(keepRule) .disallowShrinking(); context.markAsUsed(); - - if (item.getAccessFlags().isPackagePrivateOrProtected()) { - minimumKeepInfoForItem.requireAccessModificationForRepackaging(); - } } if (modifiers.includeDescriptorClasses) { @@ -1981,7 +1978,8 @@ getDependentMinimumKeepInfo() .getOrCreateUnconditionalMinimumKeepInfoFor(definition.getReference()) .disallowMinification() - .disallowRepackaging(); + .applyIf( + definition.isProgramClass(), joiner -> joiner.asClassJoiner().disallowRepackaging()); } public boolean verifyKeptFieldsAreAccessedAndLive(AppView<AppInfoWithLiveness> appView) {
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 68c055f..9af4f06 100644 --- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java +++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -804,6 +804,7 @@ public boolean reportMissingClassesInEnclosingMethodAttribute = false; public boolean reportMissingClassesInInnerClassAttributes = false; public boolean disableGenericSignatureValidation = false; + public boolean disableInnerClassSeparatorValidationWhenRepackaging = false; // EXPERIMENTAL flag to get behaviour as close to Proguard as possible. public boolean forceProguardCompatibility = false;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java b/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java index 8b33acb..374fb98 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java
@@ -225,12 +225,16 @@ R8TestCompileResult r8CompileResult = testForR8(parameters.getBackend()) .addKeepMainRule(MAIN_CLASS) - .addKeepRules("-keep,allowobfuscation class * { *; }") - .addKeepRules("-keepattributes InnerClasses,EnclosingMethod") + .addKeepAllClassesRuleWithAllowObfuscation() + .addKeepAttributeInnerClassesAndEnclosingMethod() .addProgramClassFileData(InnerClassNameTestDump.dump(config, parameters)) .allowDiagnosticInfoMessages(hasMalformedInnerClassAttribute()) .minification(minify) - .addOptionsModification(InternalOptions::disableNameReflectionOptimization) + .addOptionsModification( + options -> { + options.disableInnerClassSeparatorValidationWhenRepackaging = true; + options.disableNameReflectionOptimization(); + }) .setMinApi(parameters.getApiLevel()) .compile() .apply(this::checkWarningsAboutMalformedAttribute);
diff --git a/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java b/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java index 487498f..fa9de18 100644 --- a/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java +++ b/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java
@@ -356,13 +356,11 @@ ba.getDexProgramClass().getType().getPackageName(), bb.getDexProgramClass().getType().getPackageName()); - // We cannot repackage c or d since these have package-private members and a - // keep,allowobfuscation. For us to be able to repackage them, we have to use - // -allowaccesmodification. + // We can repackage c and d since these have no external package-private references. List<String> klasses = ImmutableList.of("naming101.c", "naming101.d"); for (String klass : klasses) { ClassSubject k = inspector.clazz(klass); - assertNotEquals("naming101.a", k.getDexProgramClass().getType().getPackageName()); + assertEquals("naming101.a", k.getDexProgramClass().getType().getPackageName()); } // All other classes can be repackaged to naming101.a, but naming101.a.a exists to make a name
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java index a6c9ea3..8152688 100644 --- a/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java +++ b/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java
@@ -45,7 +45,7 @@ .addKeepMainRule(Main.class) .addDontWarn(RepackageProtectedInSamePackageTest.class, NeverClassInline.class) .run(parameters.getRuntime(), Main.class, typeName(RepackageForKeepClassMembers.class)) - .inspect(inspector -> inspect(inspector, true)) + .inspect(this::inspect) .assertSuccessWithOutputLines(EXPECTED); } @@ -61,7 +61,7 @@ .addKeepMainRule(Main.class) .enableNeverClassInliningAnnotations() .run(parameters.getRuntime(), Main.class) - .inspect(inspector -> inspect(inspector, false)) + .inspect(this::inspect) .assertSuccessWithOutputLines(EXPECTED); } @@ -82,16 +82,10 @@ .transform(); } - private void inspect(CodeInspector inspector, boolean isProguard) { + private void inspect(CodeInspector inspector) { ClassSubject clazz = inspector.clazz(RepackageForKeepClassMembers.class); assertThat(clazz, isPresent()); - // TODO(b/250671873): We should be able to repackage the Sub class since the only reference - // to Sub.class is in the same package and we have allowobfuscation. - if (isProguard) { - assertThat(RepackageForKeepClassMembers.class, isRepackaged(inspector)); - } else { - assertThat(RepackageForKeepClassMembers.class, isNotRepackaged(inspector)); - } + assertThat(RepackageForKeepClassMembers.class, isRepackaged(inspector)); assertThat(clazz.uniqueFieldWithOriginalName("hashCodeCache"), isPresentAndNotRenamed()); assertThat(clazz.uniqueMethodWithOriginalName("calculateHashCode"), isPresentAndNotRenamed()); }
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageTest.java index 179845d..9742b6a 100644 --- a/src/test/java/com/android/tools/r8/repackage/RepackageTest.java +++ b/src/test/java/com/android/tools/r8/repackage/RepackageTest.java
@@ -163,18 +163,16 @@ // 3.A, 3.B, 3.C) Accessing a kept method is OK. markShouldAlwaysBeEligible.accept(AccessPublicKeptMethodOnReachableClass.class); - markEligibleWithAllowAccessModification.accept( - AccessPackagePrivateKeptMethodOnReachableClassDirect.class); - markEligibleWithAllowAccessModification.accept( - AccessPackagePrivateKeptMethodOnReachableClassIndirect.class); + markShouldAlwaysBeEligible.accept(AccessPackagePrivateKeptMethodOnReachableClassDirect.class); + markShouldAlwaysBeEligible.accept(AccessPackagePrivateKeptMethodOnReachableClassIndirect.class); // 4) -keepclassmembers,allowobfuscation class ReachableClassWithKeptMethod { <methods>; } // 4.A, 4.B, 4.C) Accessing a kept method is OK. markShouldAlwaysBeEligible.accept(AccessPublicKeptMethodAllowRenamingOnReachableClass.class); - markEligibleWithAllowAccessModification.accept( + markShouldAlwaysBeEligible.accept( AccessPackagePrivateKeptMethodAllowRenamingOnReachableClassDirect.class); - markEligibleWithAllowAccessModification.accept( + markShouldAlwaysBeEligible.accept( AccessPackagePrivateKeptMethodAllowRenamingOnReachableClassIndirect.class); // 5) No keep rule.
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java index 8020e78..fda2011 100644 --- a/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java +++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java
@@ -10,6 +10,7 @@ import com.android.tools.r8.R8TestCompileResult; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.ToolHelper.DexVm.Version; import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.codeinspector.CodeInspector; import com.google.common.collect.ImmutableList; @@ -62,7 +63,12 @@ .compile() .addRunClasspathFiles(compileResult.writeToZip()) .run(parameters.getRuntime(), TestClass.class) - .assertSuccessWithOutputLines("Hello world!"); + .assertFailureWithErrorThatThrowsIf(hasIllegalAccessError(), IllegalAccessError.class) + .assertSuccessWithOutputLinesIf(!hasIllegalAccessError(), "Hello world!"); + } + + private boolean hasIllegalAccessError() { + return !allowAccessModification && !parameters.isDexRuntimeVersion(Version.V8_1_0); } private List<String> getKeepRules() { @@ -76,8 +82,8 @@ } private void inspect(CodeInspector inspector) { - assertThat(A.class, isRepackagedIf(inspector, allowAccessModification)); - assertThat(B.class, isRepackagedIf(inspector, allowAccessModification)); + assertThat(A.class, isRepackaged(inspector)); + assertThat(B.class, isRepackaged(inspector)); } public static class TestClass {