Interpret keeppackagenames as class filter and not package filter RELNOTES: R8 will interpret -keeppackagenames as a class filter and check against both package and class name. This will allow developers to specificy single classes to keep package names for. Bug: b/250671873 Change-Id: Ieba1c18e0b7978f770a14cf3ad1e8bd5688ed67b
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..15e9fdf 100644 --- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java +++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -245,9 +245,9 @@ continue; } // Already processed packages should have been removed. + assert !repackagingConfiguration.isPackageInTargetLocation(pkg); String newPackageDescriptor = repackagingConfiguration.getNewPackageDescriptor(pkg, seenPackageDescriptors); - assert !repackagingConfiguration.isPackageInTargetLocation(pkg); for (DexProgramClass classToRepackage : classesToRepackage) { processClass(classToRepackage, pkg, newPackageDescriptor, mappings); } @@ -351,7 +351,6 @@ // Preserve full package name under destination package when not minifying // (no matter which package obfuscation mode is used). if (newPackageDescriptor.isEmpty() - || proguardConfiguration.getKeepPackageNamesPatterns().matches(pkg) || mayHavePinnedPackagePrivateOrProtectedItem(pkg)) { return pkg.getPackageDescriptor(); } @@ -360,8 +359,7 @@ return newPackageDescriptor; } else if (packageObfuscationMode.isMinification()) { // Always keep top-level classes since their packages can never be minified. - if (pkg.getPackageDescriptor().equals("") - || proguardConfiguration.getKeepPackageNamesPatterns().matches(pkg) + if (pkg.getPackageDescriptor().isEmpty() || mayHavePinnedPackagePrivateOrProtectedItem(pkg)) { return pkg.getPackageDescriptor(); } @@ -386,9 +384,8 @@ if (packageObfuscationMode.isRepackageClasses()) { return pkg.getPackageDescriptor().equals(newPackageDescriptor); } else if (packageObfuscationMode.isMinification()) { - // Always keep top-level classes since there packages can never be minified. - return pkg.getPackageDescriptor().equals("") - || proguardConfiguration.getKeepPackageNamesPatterns().matches(pkg) + // Always keep top-level classes since their packages can never be minified. + return pkg.getPackageDescriptor().isEmpty() || mayHavePinnedPackagePrivateOrProtectedItem(pkg); } else { assert packageObfuscationMode.isFlattenPackageHierarchy();
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingUtils.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingUtils.java new file mode 100644 index 0000000..d8e571d --- /dev/null +++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingUtils.java
@@ -0,0 +1,30 @@ +// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.repackaging; + +import com.android.tools.r8.graph.DexProgramClass; +import com.android.tools.r8.shaking.ProguardClassFilter; +import com.android.tools.r8.utils.InternalOptions; + +public class RepackagingUtils { + + public static boolean isPackageNameKept(DexProgramClass clazz, InternalOptions options) { + String packageDescriptor = clazz.getType().getPackageDescriptor(); + if (packageDescriptor.isEmpty()) { + return true; + } + ProguardClassFilter keepPackageNamesPatterns = + options.getProguardConfiguration().getKeepPackageNamesPatterns(); + if (keepPackageNamesPatterns.isEmpty()) { + return false; + } + if (keepPackageNamesPatterns.matches( + options.dexItemFactory().createType("L" + packageDescriptor + ";"))) { + return true; + } + return !options.isForceProguardCompatibilityEnabled() + && keepPackageNamesPatterns.matches(clazz.getType()); + } +}
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..405060d 100644 --- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java +++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -57,6 +57,7 @@ import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter; import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringSyntheticHelper; import com.android.tools.r8.naming.SeedMapper; +import com.android.tools.r8.repackaging.RepackagingUtils; import com.android.tools.r8.shaking.KeepInfo.Joiner; import com.android.tools.r8.synthesis.CommittedItems; import com.android.tools.r8.utils.CollectionUtils; @@ -1092,6 +1093,9 @@ if (!keepInfo.getInfo(clazz).isRepackagingAllowed(clazz, options())) { return false; } + if (RepackagingUtils.isPackageNameKept(clazz, appView.options())) { + return false; + } SeedMapper applyMappingSeedMapper = appView.getApplyMappingSeedMapper(); if (applyMappingSeedMapper != null && applyMappingSeedMapper.hasMapping(clazz.type)) { return false;
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardClassNameList.java b/src/main/java/com/android/tools/r8/shaking/ProguardClassNameList.java index cc5d00b..5f5ad5f 100644 --- a/src/main/java/com/android/tools/r8/shaking/ProguardClassNameList.java +++ b/src/main/java/com/android/tools/r8/shaking/ProguardClassNameList.java
@@ -295,7 +295,7 @@ @Override public boolean matches(DexType type) { - return classNames.stream().anyMatch(name -> name.matches(type)); + return Iterables.any(classNames, name -> name.matches(type)); } @Override
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java index 36bd397..b4e83f7 100644 --- a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java +++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
@@ -42,8 +42,8 @@ private boolean verbose; private String renameSourceFileAttribute; private final List<String> keepAttributePatterns = new ArrayList<>(); - private final ProguardPackageNameList.Builder keepPackageNamesPatterns = - ProguardPackageNameList.builder(); + private final ProguardClassFilter.Builder keepPackageNamesPatterns = + ProguardClassFilter.builder(); private final ProguardClassFilter.Builder dontWarnPatterns = ProguardClassFilter.builder(); private final ProguardClassFilter.Builder dontNotePatterns = ProguardClassFilter.builder(); protected final Set<ProguardConfigurationRule> rules = Sets.newLinkedHashSet(); @@ -193,8 +193,8 @@ this.rules.add(rule); } - public void addKeepPackageNamesPattern(boolean isNegated, ProguardPackageMatcher pattern) { - keepPackageNamesPatterns.addPackageName(isNegated, pattern); + public void addKeepPackageNamesPattern(ProguardClassNameList pattern) { + keepPackageNamesPatterns.addPattern(pattern); } public void addDontWarnPattern(ProguardClassNameList pattern) { @@ -395,7 +395,7 @@ private final boolean verbose; private final String renameSourceFileAttribute; private final ProguardKeepAttributes keepAttributes; - private final ProguardPackageNameList keepPackageNamesPatterns; + private final ProguardClassFilter keepPackageNamesPatterns; private final ProguardClassFilter dontWarnPatterns; private final ProguardClassFilter dontNotePatterns; protected final ImmutableList<ProguardConfigurationRule> rules; @@ -437,7 +437,7 @@ boolean verbose, String renameSourceFileAttribute, ProguardKeepAttributes keepAttributes, - ProguardPackageNameList keepPackageNamesPatterns, + ProguardClassFilter keepPackageNamesPatterns, ProguardClassFilter dontWarnPatterns, ProguardClassFilter dontNotePatterns, Set<ProguardConfigurationRule> rules, @@ -594,7 +594,7 @@ return keepAttributes; } - public ProguardPackageNameList getKeepPackageNamesPatterns() { + public ProguardClassFilter getKeepPackageNamesPatterns() { return keepPackageNamesPatterns; }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java index 526fc5f..803c78d 100644 --- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java +++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -316,7 +316,7 @@ } else if (acceptString("keepattributes")) { parseKeepAttributes(); } else if (acceptString("keeppackagenames")) { - parsePackageFilter(configurationBuilder::addKeepPackageNamesPattern); + parseClassFilter(configurationBuilder::addKeepPackageNamesPattern); } else if (acceptString("keepparameternames")) { configurationBuilder.setKeepParameterNames(true, origin, getPosition(optionStart)); } else if (acceptString("checkdiscard")) { @@ -1146,6 +1146,8 @@ builder.getModifiersBuilder().setAllowsObfuscation(true); } else if (acceptString("accessmodification")) { builder.getModifiersBuilder().setAllowsAccessModification(true); + } else if (acceptString("repackage")) { + builder.getModifiersBuilder().setAllowsRepackaging(true); } else if (options.isTestingOptionsEnabled()) { if (acceptString("annotationremoval")) { builder.getModifiersBuilder().setAllowsAnnotationRemoval(true);
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleModifiers.java b/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleModifiers.java index 7535a3e..a2619f7 100644 --- a/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleModifiers.java +++ b/src/main/java/com/android/tools/r8/shaking/ProguardKeepRuleModifiers.java
@@ -3,11 +3,14 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.shaking; +import java.util.Objects; + public class ProguardKeepRuleModifiers { public static class Builder { private boolean allowsAccessModification = false; private boolean allowsAnnotationRemoval = false; + private boolean allowsRepackaging = false; private boolean allowsShrinking = false; private boolean allowsOptimization = false; private boolean allowsObfuscation = false; @@ -37,6 +40,14 @@ public Builder setAllowsObfuscation(boolean allowsObfuscation) { this.allowsObfuscation = allowsObfuscation; + if (allowsObfuscation) { + this.allowsRepackaging = true; + } + return this; + } + + public Builder setAllowsRepackaging(boolean allowsRepackaging) { + this.allowsRepackaging = allowsRepackaging; return this; } @@ -48,6 +59,7 @@ return new ProguardKeepRuleModifiers( allowsAccessModification, allowsAnnotationRemoval, + allowsRepackaging, allowsShrinking, allowsOptimization, allowsObfuscation, @@ -57,6 +69,7 @@ public final boolean allowsAccessModification; public final boolean allowsAnnotationRemoval; + public final boolean allowsRepackaging; public final boolean allowsShrinking; public final boolean allowsOptimization; public final boolean allowsObfuscation; @@ -65,12 +78,14 @@ private ProguardKeepRuleModifiers( boolean allowsAccessModification, boolean allowsAnnotationRemoval, + boolean allowsRepackaging, boolean allowsShrinking, boolean allowsOptimization, boolean allowsObfuscation, boolean includeDescriptorClasses) { this.allowsAccessModification = allowsAccessModification; this.allowsAnnotationRemoval = allowsAnnotationRemoval; + this.allowsRepackaging = allowsRepackaging; this.allowsShrinking = allowsShrinking; this.allowsOptimization = allowsOptimization; this.allowsObfuscation = allowsObfuscation; @@ -87,6 +102,7 @@ public boolean isBottom() { return allowsAccessModification && allowsAnnotationRemoval + && allowsRepackaging && allowsObfuscation && allowsOptimization && allowsShrinking @@ -101,6 +117,7 @@ ProguardKeepRuleModifiers that = (ProguardKeepRuleModifiers) o; return allowsAccessModification == that.allowsAccessModification && allowsAnnotationRemoval == that.allowsAnnotationRemoval + && allowsRepackaging == that.allowsRepackaging && allowsShrinking == that.allowsShrinking && allowsOptimization == that.allowsOptimization && allowsObfuscation == that.allowsObfuscation @@ -109,12 +126,14 @@ @Override public int hashCode() { - return (allowsAccessModification ? 1 : 0) - | (allowsAnnotationRemoval ? 2 : 0) - | (allowsShrinking ? 4 : 0) - | (allowsOptimization ? 8 : 0) - | (allowsObfuscation ? 16 : 0) - | (includeDescriptorClasses ? 32 : 0); + return Objects.hash( + allowsAccessModification, + allowsAnnotationRemoval, + allowsRepackaging, + allowsShrinking, + allowsOptimization, + allowsObfuscation, + includeDescriptorClasses); } @Override @@ -122,6 +141,7 @@ StringBuilder builder = new StringBuilder(); appendWithComma(builder, allowsAccessModification, "allowaccessmodification"); appendWithComma(builder, allowsAnnotationRemoval, "allowannotationremoval"); + appendWithComma(builder, allowsRepackaging, "allowrepackaging"); appendWithComma(builder, allowsObfuscation, "allowobfuscation"); appendWithComma(builder, allowsShrinking, "allowshrinking"); appendWithComma(builder, allowsOptimization, "allowoptimization");
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..4419a40 100644 --- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java +++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -54,6 +54,7 @@ import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple; import com.android.tools.r8.ir.optimize.membervaluepropagation.assume.AssumeInfo; import com.android.tools.r8.logging.Log; +import com.android.tools.r8.repackaging.RepackagingUtils; import com.android.tools.r8.shaking.AnnotationMatchResult.AnnotationsIgnoredMatchResult; import com.android.tools.r8.shaking.AnnotationMatchResult.ConcreteAnnotationMatchResult; import com.android.tools.r8.shaking.AnnotationMatchResult.MatchedAnnotation; @@ -1637,12 +1638,11 @@ if (appView.options().isMinificationEnabled() && !modifiers.allowsObfuscation) { dependentMinimumKeepInfo .getOrCreateMinimumKeepInfoFor(preconditionEvent, item.getReference()) - .disallowMinification() - .disallowRepackaging(); + .disallowMinification(); context.markAsUsed(); } - if (appView.options().isRepackagingEnabled() && !modifiers.allowsObfuscation) { + if (appView.options().isRepackagingEnabled() && isRepackagingDisallowed(item, modifiers)) { dependentMinimumKeepInfo .getOrCreateMinimumKeepInfoFor(preconditionEvent, item.getReference()) .disallowRepackaging(); @@ -1676,6 +1676,14 @@ } } + private boolean isRepackagingDisallowed( + ProgramDefinition item, ProguardKeepRuleModifiers modifiers) { + if (!modifiers.allowsRepackaging) { + return true; + } + return RepackagingUtils.isPackageNameKept(item.getContextClass(), options); + } + private void evaluateIdentifierNameStringRule( Definition item, ProguardConfigurationRule context, ProguardIfRule ifRule) { // Main dex rules should not contain -identifiernamestring rules.
diff --git a/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java b/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java index bb73c3f..5eb7783 100644 --- a/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java +++ b/src/test/java/com/android/tools/r8/naming/KeepPackageNamesTest.java
@@ -99,4 +99,14 @@ .compile() .inspect(config::inspect); } + + @Test + public void testR8Compat() throws Exception { + testForR8Compat(Backend.DEX) + .addProgramClasses(CLASSES) + .addKeepAllClassesRuleWithAllowObfuscation() + .addKeepRules(config.getKeepRule()) + .compile() + .inspect(config::inspect); + } }
diff --git a/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java b/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java index 309ab55..e7c14ff 100644 --- a/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java +++ b/src/test/java/com/android/tools/r8/naming/keeppackagenames/KeepPackageNameRootTest.java
@@ -9,7 +9,6 @@ import com.android.tools.r8.ProguardVersion; import com.android.tools.r8.TestBase; -import com.android.tools.r8.TestCompileResult; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.TestShrinkerBuilder; @@ -34,22 +33,22 @@ @Test public void testR8Compat() throws Exception { - run(testForR8Compat(Backend.CF)); + run(testForR8Compat(Backend.CF), false); } @Test public void testR8Full() throws Exception { - run(testForR8(Backend.CF)); + run(testForR8(Backend.CF), true); } @Test public void testR8PG() throws Exception { - run(testForProguard(ProguardVersion.V7_0_0).addKeepRules("-dontwarn")); + run(testForProguard(ProguardVersion.V7_0_0).addKeepRules("-dontwarn"), false); } - private TestCompileResult<?, ?> run(TestShrinkerBuilder<?, ?, ?, ?, ?> testBuilder) + private void run(TestShrinkerBuilder<?, ?, ?, ?, ?> testBuilder, boolean isFullMode) throws Exception { - return testBuilder + testBuilder .addProgramClassFileData( transformer(Main.class) .setClassDescriptor("Lfoo/Main;") @@ -64,7 +63,11 @@ assertEquals(1, inspector.allClasses().size()); inspector.forAllClasses( clazz -> { - assertNotEquals("foo", clazz.getDexProgramClass().getType().getPackageName()); + if (isFullMode) { + assertEquals("foo", clazz.getDexProgramClass().getType().getPackageName()); + } else { + assertNotEquals("foo", clazz.getDexProgramClass().getType().getPackageName()); + } }); }); }
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java new file mode 100644 index 0000000..686be1d --- /dev/null +++ b/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java
@@ -0,0 +1,64 @@ +// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.repackage; + +import static org.hamcrest.MatcherAssert.assertThat; + +import com.android.tools.r8.TestParameters; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class RepackageAllowRepackagingTest extends RepackageTestBase { + + public RepackageAllowRepackagingTest( + String flattenPackageHierarchyOrRepackageClasses, TestParameters parameters) { + super(flattenPackageHierarchyOrRepackageClasses, parameters); + } + + @Test + public void testR8() throws Exception { + testForR8(parameters.getBackend()) + .addInnerClasses(getClass()) + .setMinApi(parameters.getApiLevel()) + .addKeepMainRule(Main.class) + .apply(this::configureRepackaging) + .addKeepRules( + "-keep,allowrepackage class " + typeName(ShouldStayInPackage.class) + " { *; }") + .addKeepRules( + "-keep,allowrepackage class " + typeName(ShouldBeRepackaged.class) + " { *; }") + .compile() + .inspect( + inspector -> { + assertThat(ShouldStayInPackage.class, isNotRepackaged(inspector)); + assertThat(ShouldBeRepackaged.class, isRepackaged(inspector)); + }) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines("ShouldStayInPackage::foo", "ShouldBeRepackaged::bar"); + } + + public static class ShouldStayInPackage { + + static void foo() { + System.out.println("ShouldStayInPackage::foo"); + } + } + + public static class ShouldBeRepackaged { + + public static void bar() { + System.out.println("ShouldBeRepackaged::bar"); + } + } + + public static class Main { + + public static void main(String[] args) { + ShouldStayInPackage.foo(); + ShouldBeRepackaged.bar(); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageKeepPackageNameTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageKeepPackageNameTest.java new file mode 100644 index 0000000..bcffb5f --- /dev/null +++ b/src/test/java/com/android/tools/r8/repackage/RepackageKeepPackageNameTest.java
@@ -0,0 +1,73 @@ +// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.repackage; + +import static org.hamcrest.MatcherAssert.assertThat; + +import com.android.tools.r8.R8TestCompileResult; +import com.android.tools.r8.TestParameters; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class RepackageKeepPackageNameTest extends RepackageTestBase { + + public RepackageKeepPackageNameTest( + String flattenPackageHierarchyOrRepackageClasses, TestParameters parameters) { + super(flattenPackageHierarchyOrRepackageClasses, parameters); + } + + @Test + public void testR8() throws Exception { + R8TestCompileResult compileLib = + testForR8(parameters.getBackend()) + .addInnerClasses(getClass()) + .setMinApi(parameters.getApiLevel()) + .addKeepClassAndMembersRulesWithAllowObfuscation( + ShouldStayInPackage.class, ShouldBeRepackaged.class) + .addKeepPackageNamesRule(typeName(ShouldStayInPackage.class)) + .apply(this::configureRepackaging) + .compile() + .inspect( + inspector -> { + assertThat(ShouldStayInPackage.class, isNotRepackaged(inspector)); + assertThat(ShouldBeRepackaged.class, isRepackaged(inspector)); + }); + + testForR8(parameters.getBackend()) + .addProgramClasses(Runner.class) + .addClasspathClasses(ShouldStayInPackage.class, ShouldBeRepackaged.class) + .addApplyMapping(compileLib.getProguardMap()) + .addKeepMainRule(Runner.class) + .setMinApi(parameters.getApiLevel()) + .compile() + .addRunClasspathFiles(compileLib.writeToZip()) + .run(parameters.getRuntime(), Runner.class) + .assertSuccessWithOutputLines("ShouldStayInPackage::foo", "ShouldBeRepackaged::bar"); + } + + public static class ShouldStayInPackage { + + static void foo() { + System.out.println("ShouldStayInPackage::foo"); + } + } + + public static class ShouldBeRepackaged { + + public static void bar() { + System.out.println("ShouldBeRepackaged::bar"); + } + } + + public static class Runner { + + public static void main(String[] args) { + ShouldStayInPackage.foo(); + ShouldBeRepackaged.bar(); + } + } +}
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..6f79b12 100644 --- a/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java +++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithKeepPackagePrivateTest.java
@@ -76,8 +76,8 @@ } private void inspect(CodeInspector inspector) { - assertThat(A.class, isRepackagedIf(inspector, allowAccessModification)); - assertThat(B.class, isRepackagedIf(inspector, allowAccessModification)); + assertThat(A.class, isNotRepackaged(inspector)); + assertThat(B.class, isNotRepackaged(inspector)); } public static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java index 2b8d68b..8149c5b 100644 --- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java +++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -1513,48 +1513,30 @@ testKeepattributes(expected, config); } - private void testKeeppackagenames(ProguardPackageNameList expected, String config) { + private void testKeeppackagenames(String config) { ProguardConfigurationParser parser = new ProguardConfigurationParser(new DexItemFactory(), reporter); parser.parse(createConfigurationForTesting(ImmutableList.of(config))); verifyParserEndsCleanly(); - assertEquals(expected, parser.getConfigRawForTesting().getKeepPackageNamesPatterns()); } @Test public void parseKeeppackagenames() { - ProguardPackageNameList xxxYYY = - ProguardPackageNameList.builder() - .addPackageName(false, new ProguardPackageMatcher("xxx")) - .addPackageName(false, new ProguardPackageMatcher("yyy")) - .build(); - testKeeppackagenames(xxxYYY, "-keeppackagenames xxx,yyy"); - testKeeppackagenames(xxxYYY, "-keeppackagenames xxx, yyy"); - testKeeppackagenames(xxxYYY, "-keeppackagenames xxx ,yyy"); - testKeeppackagenames(xxxYYY, "-keeppackagenames xxx , yyy"); - testKeeppackagenames(xxxYYY, "-keeppackagenames xxx , yyy "); - testKeeppackagenames(xxxYYY, "-keeppackagenames xxx , yyy \n"); - testKeeppackagenames(xxxYYY, "-keeppackagenames \"xxx\",\"yyy\""); + testKeeppackagenames("-keeppackagenames xxx,yyy"); + testKeeppackagenames("-keeppackagenames xxx, yyy"); + testKeeppackagenames("-keeppackagenames xxx ,yyy"); + testKeeppackagenames("-keeppackagenames xxx , yyy"); + testKeeppackagenames("-keeppackagenames xxx , yyy "); + testKeeppackagenames("-keeppackagenames xxx , yyy \n"); + testKeeppackagenames("-keeppackagenames \"xxx\",\"yyy\""); testKeeppackagenames( - ProguardPackageNameList.builder() - .addPackageName(false, new ProguardPackageMatcher("com.**")) - .addPackageName(false, new ProguardPackageMatcher("org.*")) - .build(), "-keeppackagenames com.**, org.*"); testKeeppackagenames( - ProguardPackageNameList.builder() - .addPackageName(false, new ProguardPackageMatcher("c?m.**")) - .addPackageName(false, new ProguardPackageMatcher("?r?.*")) - .build(), "-keeppackagenames c?m.**, ?r?.*"); testKeeppackagenames( - ProguardPackageNameList.builder() - .addPackageName(true, new ProguardPackageMatcher("c?m.**")) - .addPackageName(true, new ProguardPackageMatcher("?r?.*")) - .build(), "-keeppackagenames !c?m.**, !?r?.*"); }