[ApiModel] Only outline methods with known api level
Bug: 216297604
Change-Id: I5667e933fde943fa2333e3bfd5f2d5c52582662e
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
index fc60cb9..cd3a6b1 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
@@ -103,7 +103,8 @@
apiLevelCompute.computeApiLevelForLibraryReference(
cfInvoke.getMethod(), ComputedApiLevel.unknown());
if (appView.computedMinApiLevel().isGreaterThanOrEqualTo(methodApiLevel)
- || isApiLevelLessThanOrEqualTo9(methodApiLevel)) {
+ || isApiLevelLessThanOrEqualTo9(methodApiLevel)
+ || methodApiLevel.isUnknownApiLevel()) {
return appView.computedMinApiLevel();
}
// Compute the api level of the holder to see if the method will be stubbed.
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
index 8531ceb..7e6d2a5 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
@@ -97,8 +97,10 @@
.inspect(
inspector -> {
// No need to check further on CF.
+ // TODO(b/216314378): If this changes then we will have more classes here at some
+ // point.
+ assertEquals(3, inspector.allClasses().size());
if (parameters.isCfRuntime()) {
- assertEquals(3, inspector.allClasses().size());
return;
}
Method testMethod = TestClass.class.getDeclaredMethod("test");
@@ -115,13 +117,13 @@
.findFirst();
assertFalse(synthesizedMissingNotReferenced.isPresent());
verifyThat(inspector, parameters, addedOn23).isNotOutlinedFrom(testMethod);
- verifyThat(inspector, parameters, addedOn27)
- .isOutlinedFromUntil(testMethod, AndroidApiLevel.O_MR1);
+ // TODO(b/216314378): We should consider if addedOn27 should not be inlined again.
+ verifyThat(inspector, parameters, addedOn27).isNotOutlinedFrom(testMethod);
verifyThat(
inspector,
parameters,
LibraryClass.class.getDeclaredMethod("missingAndReferenced"))
- .isOutlinedFrom(testMethod);
+ .isNotOutlinedFrom(testMethod);
if (parameters.getApiLevel().isLessThan(AndroidApiLevel.O_MR1)) {
assertEquals(5, inspector.allClasses().size());
} else {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodUnknownTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodUnknownTest.java
index f7e25c6..f8b3bf7 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodUnknownTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodUnknownTest.java
@@ -14,7 +14,6 @@
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.testing.AndroidBuildVersion;
import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -55,9 +54,8 @@
.inspect(
inspector -> {
// Assert that we did not outline any methods.
- // TODO(b/216297604): Ensure we do not outline.
assertEquals(
- BooleanUtils.intValue(parameters.isDexRuntime()),
+ 0,
inspector.allClasses().stream()
.filter(FoundClassSubject::isCompilerSynthesized)
.count());