Check for missing classes when repackaging class
Bug: 196406764
Change-Id: I0a641c568de090445da6188cc5c3ea37e72793a5
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 188e749..6a2c76d 100644
--- a/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
+++ b/src/main/java/com/android/tools/r8/repackaging/Repackaging.java
@@ -320,12 +320,12 @@
public static class DefaultRepackagingConfiguration implements RepackagingConfiguration {
- private final AppView<?> appView;
+ private final AppView<AppInfoWithLiveness> appView;
private final DexItemFactory dexItemFactory;
private final ProguardConfiguration proguardConfiguration;
private final MinificationPackageNamingStrategy packageMinificationStrategy;
- public DefaultRepackagingConfiguration(AppView<?> appView) {
+ public DefaultRepackagingConfiguration(AppView<AppInfoWithLiveness> appView) {
this.appView = appView;
this.dexItemFactory = appView.dexItemFactory();
this.proguardConfiguration = appView.options().getProguardConfiguration();
@@ -427,17 +427,19 @@
}
// Ensure that the generated name is unique.
DexType finalRepackagedDexType = repackagedDexType;
- for (int i = 1; isRepackageTypeUsed(finalRepackagedDexType, mappings, appView); i++) {
+ for (int i = 1; isRepackageTypeUsed(finalRepackagedDexType, mappings); i++) {
finalRepackagedDexType = repackagedDexType.addSuffix(i + "", dexItemFactory);
}
return finalRepackagedDexType;
}
- }
- private static boolean isRepackageTypeUsed(
- DexType type, BiMap<DexType, DexType> mappings, AppView<?> appView) {
- return mappings.inverse().containsKey(type)
- || (appView.hasLiveness() && appView.withLiveness().appInfo().wasPruned(type));
+ private boolean isRepackageTypeUsed(DexType type, BiMap<DexType, DexType> mappings) {
+ if (mappings.inverse().containsKey(type)) {
+ return true;
+ }
+ return appView.appInfo().wasPruned(type)
+ || appView.appInfo().getMissingClasses().contains(type);
+ }
}
/** Testing only. */
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageMissingTypeCollisionTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageMissingTypeCollisionTest.java
index 4dc7f1f..2fc2cb0 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageMissingTypeCollisionTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageMissingTypeCollisionTest.java
@@ -5,8 +5,6 @@
package com.android.tools.r8.repackage;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assume.assumeTrue;
@@ -66,10 +64,12 @@
inspector -> {
ClassSubject clazz = inspector.clazz(getNewATypeName());
assertThat(clazz, isPresentAndRenamed());
- assertEquals(getNewMissingTypeName(), clazz.getFinalName());
+ assertEquals(
+ getRepackagePackage() + (isFlattenPackageHierarchy() ? ".a.b" : ".b"),
+ clazz.getFinalName());
})
.run(parameters.getRuntime(), Main.class)
- .assertFailureWithErrorThatMatches(not(containsString("NoClassDefFoundError")));
+ .assertFailureWithErrorThatThrows(NoClassDefFoundError.class);
}
@Test