Allow repackaging if referencing Array.clone
Bug: 197482897
Change-Id: Icabcb287998e69eb628cada46c578e9a2b6be1bb
diff --git a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
index 03627d7..702d1fd 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
@@ -66,10 +66,6 @@
return false;
}
- public boolean isFailedResolution() {
- return false;
- }
-
public DexClass getInitialResolutionHolder() {
return null;
}
diff --git a/src/main/java/com/android/tools/r8/graph/MemberResolutionResult.java b/src/main/java/com/android/tools/r8/graph/MemberResolutionResult.java
index c3f3c42..e5467ff 100644
--- a/src/main/java/com/android/tools/r8/graph/MemberResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/MemberResolutionResult.java
@@ -25,6 +25,15 @@
return isAccessibleFrom(context, appView.appInfo());
}
+ /**
+ * Returns true if resolution failed.
+ *
+ * <p>Note the disclaimer in the doc of {@code MethodResolutionResult.isSingleResolution()}.
+ */
+ public boolean isFailedResolution() {
+ return false;
+ }
+
public boolean isFieldResolutionResult() {
return false;
}
diff --git a/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java b/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
index f1e8ae1..c2cb1d4 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
@@ -59,15 +59,6 @@
return null;
}
- /**
- * Returns true if resolution failed.
- *
- * <p>Note the disclaimer in the doc of {@code isSingleResolution()}.
- */
- public boolean isFailedResolution() {
- return false;
- }
-
public boolean isIncompatibleClassChangeErrorResult() {
return false;
}
@@ -84,6 +75,10 @@
return false;
}
+ public boolean isArrayCloneMethodResult() {
+ return false;
+ }
+
/** Returns non-null if isFailedResolution() is true, otherwise null. */
public FailedResolutionResult asFailedResolution() {
return null;
@@ -808,6 +803,11 @@
public boolean isVirtualTarget() {
return true;
}
+
+ @Override
+ public boolean isArrayCloneMethodResult() {
+ return true;
+ }
}
/** Base class for all types of failed resolutions. */
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
index 2e7b6b5..a0ac6e8 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
@@ -128,6 +128,7 @@
}
MethodResolutionResult methodResult = resolutionResult.asMethodResolutionResult();
if (methodResult.isClassNotFoundResult()
+ || methodResult.isArrayCloneMethodResult()
|| methodResult.isNoSuchMethodErrorResult(context.getContextClass(), appInfo)) {
return;
}
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageCloneTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageCloneTest.java
index 7c138ee..722a9cc 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageCloneTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageCloneTest.java
@@ -39,10 +39,9 @@
.compile()
.inspect(
inspector -> {
- // TODO(b/197482897) This should be repackaged.
- assertThat(A.class, isNotRepackaged(inspector));
+ assertThat(A.class, isRepackaged(inspector));
assertThat(B.class, isRepackaged(inspector));
- assertThat(C.class, isNotRepackaged(inspector));
+ assertThat(C.class, isRepackaged(inspector));
})
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("foo", "null");