[ApiModel] Enable stubbing and outlining of library references
RELNOTES: To eliminate performance issues on Dalvik and ART, R8 will now introduce library stubs and outline calls to library methods for library classes and methods that may not exist at runtime. Doing so eliminates many verification issues and improves runtime performance. This feature is always enabled.
Bug: 138781768
Bug: 210822155
Change-Id: Ia1b487a5a5e043b85174e149e2a4e0a0466722cd
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 da44c03..8e2f9fb 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
@@ -28,6 +28,7 @@
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
@@ -95,7 +96,8 @@
ComputedApiLevel methodApiLevel =
apiLevelCompute.computeApiLevelForLibraryReference(
cfInvoke.getMethod(), ComputedApiLevel.unknown());
- if (appView.computedMinApiLevel().isGreaterThanOrEqualTo(methodApiLevel)) {
+ if (appView.computedMinApiLevel().isGreaterThanOrEqualTo(methodApiLevel)
+ || isApiLevelLessThanOrEqualTo9(methodApiLevel)) {
return appView.computedMinApiLevel();
}
// Compute the api level of the holder to see if the method will be stubbed.
@@ -106,6 +108,11 @@
: appView.computedMinApiLevel();
}
+ private boolean isApiLevelLessThanOrEqualTo9(ComputedApiLevel apiLevel) {
+ return apiLevel.isKnownApiLevel()
+ && apiLevel.asKnownApiLevel().getApiLevel().isLessThanOrEqualTo(AndroidApiLevel.G);
+ }
+
private Collection<CfInstruction> desugarLibraryCall(
UniqueContext context,
CfInvoke invoke,
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 7ce8109..0bfc079 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1469,10 +1469,14 @@
public Map<ClassReference, AndroidApiLevel> classApiMapping = new HashMap<>();
public BiConsumer<MethodReference, ComputedApiLevel> tracedMethodApiLevelCallback = null;
- public boolean enableApiCallerIdentification = true;
- public boolean checkAllApiReferencesAreSet = true;
- public boolean enableStubbingOfClasses = false;
- public boolean enableOutliningOfMethods = false;
+ public boolean enableApiCallerIdentification =
+ System.getProperty("com.android.tools.r8.disableApiModeling") == null;
+ public boolean checkAllApiReferencesAreSet =
+ System.getProperty("com.android.tools.r8.disableApiModeling") == null;
+ public boolean enableStubbingOfClasses =
+ System.getProperty("com.android.tools.r8.disableApiModeling") == null;
+ public boolean enableOutliningOfMethods =
+ System.getProperty("com.android.tools.r8.disableApiModeling") == null;
public void visitMockedApiLevelsForReferences(
DexItemFactory factory, Consumer<AndroidApiForHashingClass> consumer) {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelClassMergingWithDifferentApiMethodsTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelClassMergingWithDifferentApiMethodsTest.java
index 0eeb405..5730230c 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelClassMergingWithDifferentApiMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelClassMergingWithDifferentApiMethodsTest.java
@@ -52,6 +52,8 @@
}
})
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
.compile()
.addRunClasspathClasses(Api.class)
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
index 8d4e2f1..f351779 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
@@ -52,6 +52,8 @@
.addKeepMainRule(Main.class)
.apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.compile()
.inspect(
inspector -> {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoClassInliningMethodTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoClassInliningMethodTest.java
index 22ecf86..013d98f 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoClassInliningMethodTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoClassInliningMethodTest.java
@@ -48,6 +48,8 @@
.enableNoHorizontalClassMergingAnnotations()
.apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.compile()
.inspect(
inspector -> {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java
index 45d2bec..6e8d3b0 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java
@@ -47,6 +47,8 @@
.setMinApi(parameters.getApiLevel())
.enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.apply(
ApiModelingTestHelper.addTracedApiReferenceLevelCallBack(
(reference, apiLevel) -> {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfDefaultInterfaceMethodsTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfDefaultInterfaceMethodsTest.java
index a580fb1..9f88bbb 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfDefaultInterfaceMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfDefaultInterfaceMethodsTest.java
@@ -48,6 +48,8 @@
.addKeepMainRule(Main.class)
.apply(setMockApiLevelForMethod(apiMethod, L_MR1))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.noMinification()
.compile()
.inspect(
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java
index d39b038..22a7321 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java
@@ -50,6 +50,8 @@
.enableNoHorizontalClassMergingAnnotations()
.apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("A::noApiCall", "ApiCaller::callInterfaceMethod")
.inspect(
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java
index 98aa240..84ce168 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelIntoLowerDirectTest.java
@@ -46,6 +46,8 @@
.apply(setMockApiLevelForMethod(apiLevel21, AndroidApiLevel.L))
.apply(setMockApiLevelForMethod(apiLevel22, AndroidApiLevel.L_MR1))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("A::apiLevel21", "B::apiLevel22")
.inspect(
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticTest.java
index 16f24fa..1b7713d 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelStaticTest.java
@@ -48,6 +48,8 @@
.enableNoHorizontalClassMergingAnnotations()
.apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.compile()
.inspect(
inspector ->
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelVirtualTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelVirtualTest.java
index 2311f12..c4a6c58 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelVirtualTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelVirtualTest.java
@@ -53,6 +53,8 @@
.apply(setMockApiLevelForClass(Api.class, AndroidApiLevel.L_MR1))
.apply(setMockApiLevelForDefaultInstanceInitializer(Api.class, AndroidApiLevel.L_MR1))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.compile()
.inspect(
inspector ->
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfStaticInterfaceMethodsTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfStaticInterfaceMethodsTest.java
index 498ef4c..22714a3 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfStaticInterfaceMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfStaticInterfaceMethodsTest.java
@@ -50,6 +50,8 @@
.apply(setMockApiLevelForMethod(apiMethod22, L_MR1))
.apply(setMockApiLevelForMethod(apiMethod26, O))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.noMinification()
.enableInliningAnnotations()
.compile()
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoMockForOutlineTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoMockForOutlineTest.java
deleted file mode 100644
index a4cbd4b..0000000
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoMockForOutlineTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (c) 2021, 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.apimodel;
-
-import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForClass;
-import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForDefaultInstanceInitializer;
-import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForMethod;
-import static com.android.tools.r8.apimodel.ApiModelingTestHelper.verifyThat;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
-import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assume.assumeFalse;
-
-import com.android.tools.r8.NeverInline;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-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.codeinspector.ClassSubject;
-import com.android.tools.r8.utils.codeinspector.MethodSubject;
-import java.lang.reflect.Method;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class ApiModelNoMockForOutlineTest extends TestBase {
-
- private final AndroidApiLevel classApiLevel = AndroidApiLevel.K;
- private final AndroidApiLevel methodApiLevel = AndroidApiLevel.M;
-
- @Parameter public TestParameters parameters;
-
- @Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters().withAllRuntimesAndApiLevels().build();
- }
-
- @Test
- public void testR8() throws Exception {
- assumeFalse(
- parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
- boolean isMethodApiLevel =
- parameters.isDexRuntime()
- && parameters.getApiLevel().isGreaterThanOrEqualTo(methodApiLevel);
- Method methodOn23 = LibraryClass.class.getDeclaredMethod("methodOn23");
- Method mainMethod = Main.class.getDeclaredMethod("main", String[].class);
- testForR8(parameters.getBackend())
- .addProgramClasses(Main.class)
- .addLibraryClasses(LibraryClass.class)
- .addDefaultRuntimeLibrary(parameters)
- .setMinApi(parameters.getApiLevel())
- .addKeepMainRule(Main.class)
- .addAndroidBuildVersion()
- .apply(setMockApiLevelForClass(LibraryClass.class, classApiLevel))
- .apply(setMockApiLevelForDefaultInstanceInitializer(LibraryClass.class, classApiLevel))
- .apply(setMockApiLevelForMethod(methodOn23, methodApiLevel))
- .apply(ApiModelingTestHelper::enableOutliningOfMethods)
- .apply(ApiModelingTestHelper::enableStubbingOfClasses)
- .enableInliningAnnotations()
- .compile()
- .applyIf(
- parameters.isDexRuntime()
- && parameters
- .getRuntime()
- .maxSupportedApiLevel()
- .isGreaterThanOrEqualTo(classApiLevel),
- b -> b.addBootClasspathClasses(LibraryClass.class))
- .run(parameters.getRuntime(), Main.class)
- .assertSuccessWithOutputLinesIf(!isMethodApiLevel, "Hello World")
- .assertSuccessWithOutputLinesIf(isMethodApiLevel, "LibraryClass::methodOn23", "Hello World")
- .inspect(
- inspector -> {
- assertThat(inspector.method(mainMethod), isPresent());
- verifyThat(inspector, parameters, methodOn23)
- .isOutlinedFromUntil(mainMethod, methodApiLevel);
- verifyThat(inspector, parameters, LibraryClass.class).stubbedUntil(classApiLevel);
- if (parameters.isDexRuntime() && parameters.getApiLevel().isLessThan(classApiLevel)) {
- // We never trace outlined method for stubs so this holds by default.
- ClassSubject mockedLibraryClass = inspector.clazz(LibraryClass.class);
- assertThat(mockedLibraryClass, isPresent());
- MethodSubject mockedMethodOn23 =
- mockedLibraryClass.uniqueMethodWithName("methodOn23");
- assertThat(mockedMethodOn23, isAbsent());
- }
- });
- }
-
- // Only present from api level 19.
- public static class LibraryClass {
-
- public void methodOn23() {
- System.out.println("LibraryClass::methodOn23");
- }
- }
-
- public static class Main {
-
- @NeverInline
- public static Object create() {
- return AndroidBuildVersion.VERSION >= 23 ? new LibraryClass() : null;
- }
-
- public static void main(String[] args) {
- Object libraryClass = create();
- if (libraryClass != null) {
- ((LibraryClass) libraryClass).methodOn23();
- }
- System.out.println("Hello World");
- }
- }
-}
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingSubReferenceApiTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingSubReferenceApiTest.java
index 98b4e92..da967e8 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingSubReferenceApiTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingSubReferenceApiTest.java
@@ -50,6 +50,8 @@
.addKeepMainRule(Main.class)
.apply(setMockApiLevelForMethod(apiMethod, L_MR1))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.enableInliningAnnotations()
.enableNeverClassInliningAnnotations()
.addVerticallyMergedClassesInspector(
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingTest.java
index b7cd0b1..7276937 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoVerticalMergingTest.java
@@ -50,6 +50,8 @@
.addKeepMainRule(Main.class)
.apply(setMockApiLevelForMethod(apiMethod, L_MR1))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.enableInliningAnnotations()
.enableNeverClassInliningAnnotations()
.addVerticallyMergedClassesInspector(
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java
index 0760cad..c4dcd42 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java
@@ -64,6 +64,7 @@
.apply(setMockApiLevelForDefaultInstanceInitializer(LibraryClass.class, classApiLevel))
.apply(setMockApiLevelForMethod(adeddOn23, methodApiLevel))
.apply(ApiModelingTestHelper::enableOutliningOfMethods)
+ .apply(ApiModelingTestHelper::disableStubbingOfClasses)
.enableInliningAnnotations()
.compile()
.applyIf(
@@ -79,7 +80,6 @@
isMethodApiLevel, "LibraryClass::addedOn23", "LibraryClass::addedOn23", "Hello World")
.inspect(
inspector -> {
- // No need to check further on CF.
int classCount =
parameters.isDexRuntime() && parameters.getApiLevel().isLessThan(methodApiLevel)
? 4
@@ -90,7 +90,7 @@
.isOutlinedFromUntil(testMethod, methodApiLevel);
if (parameters.isDexRuntime()
&& parameters.getApiLevel().isLessThan(methodApiLevel)) {
- // Verify that we invoke the synthesized outline addedOn23 twice.
+ // Verify that we invoke the synthesized outline, addedOn23, twice.
Optional<FoundMethodSubject> synthesizedAddedOn23 =
inspector.allClasses().stream()
.flatMap(clazz -> clazz.allMethods().stream())
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineHorizontalMergingTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineHorizontalMergingTest.java
index 2426afb..ce21ee4 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineHorizontalMergingTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineHorizontalMergingTest.java
@@ -80,6 +80,7 @@
setMockApiLevelForMethod(
OtherLibraryClass.class.getMethod("addedOn27"), secondMethodApiLevel))
.apply(ApiModelingTestHelper::enableOutliningOfMethods)
+ .apply(ApiModelingTestHelper::disableStubbingOfClasses)
.enableInliningAnnotations()
.compile()
.applyIf(
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 7755822..8531ceb 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
@@ -71,6 +71,7 @@
.apply(setMockApiLevelForMethod(addedOn23, initialLibraryMockLevel))
.apply(setMockApiLevelForMethod(addedOn27, finalLibraryMethodLevel))
.apply(ApiModelingTestHelper::enableOutliningOfMethods)
+ .apply(ApiModelingTestHelper::disableStubbingOfClasses)
.enableInliningAnnotations()
.compile()
.applyIf(
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeReferenceInvokeTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeReferenceInvokeTest.java
index 25f0c3a..79df3a4 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeReferenceInvokeTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeReferenceInvokeTest.java
@@ -47,6 +47,8 @@
.apply(setMockApiLevelForClass(LibraryClass.class, AndroidApiLevel.M))
.apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.M))
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.addKeepMainRule(Main.class)
.enableInliningAnnotations()
.addAndroidBuildVersion()
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelVirtualDispatchLinkInterfaceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelVirtualDispatchLinkInterfaceTest.java
index d4127e8..f28c3c6 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelVirtualDispatchLinkInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelVirtualDispatchLinkInterfaceTest.java
@@ -52,6 +52,8 @@
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(Main.class)
.apply(ApiModelingTestHelper::enableApiCallerIdentification)
+ // We are testing that we do not inline/merge higher api-levels
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.apply(
addTracedApiReferenceLevelCallBack(
(method, apiLevel) -> {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
index 7077a21..b9cf537 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
@@ -133,6 +133,22 @@
});
}
+ public static void disableOutliningAndStubbing(
+ TestCompilerBuilder<?, ?, ?, ?, ?> compilerBuilder) {
+ disableStubbingOfClasses(compilerBuilder);
+ disableOutlining(compilerBuilder);
+ }
+
+ public static void disableStubbingOfClasses(TestCompilerBuilder<?, ?, ?, ?, ?> compilerBuilder) {
+ compilerBuilder.addOptionsModification(
+ options -> options.apiModelingOptions().enableStubbingOfClasses = false);
+ }
+
+ public static void disableOutlining(TestCompilerBuilder<?, ?, ?, ?, ?> compilerBuilder) {
+ compilerBuilder.addOptionsModification(
+ options -> options.apiModelingOptions().enableOutliningOfMethods = false);
+ }
+
static <T extends TestCompilerBuilder<?, ?, ?, ?, ?>>
ThrowableConsumer<T> addTracedApiReferenceLevelCallBack(
BiConsumer<MethodReference, AndroidApiLevel> consumer) {
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
index 407165c..3f95a85 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
@@ -23,6 +23,7 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.apimodel.ApiModelingTestHelper;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
import com.android.tools.r8.jasmin.JasminBuilder;
import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
@@ -327,7 +328,8 @@
runTest(
testForR8(parameters.getBackend())
.addKeepRules(getProguardConfig(EXAMPLE_KEEP))
- .allowUnusedProguardConfigurationRules(),
+ .allowUnusedProguardConfigurationRules()
+ .apply(ApiModelingTestHelper::disableOutlining),
main,
programFiles,
preservedClassNames::contains);
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/SyntheticDistributionTest.java b/src/test/java/com/android/tools/r8/dexsplitter/SyntheticDistributionTest.java
index 61b0fd7..3e86cc9 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/SyntheticDistributionTest.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/SyntheticDistributionTest.java
@@ -16,6 +16,7 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ThrowableConsumer;
import com.android.tools.r8.ToolHelper.ProcessResult;
+import com.android.tools.r8.apimodel.ApiModelingTestHelper;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
@@ -98,6 +99,8 @@
"keptApplyLambda", MyFunction.class, String.class)))
.enableInliningAnnotations()
.noMinification()
+ // BaseDexClassLoader was introduced at api level 14.
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.setMinApi(parameters.getApiLevel());
}
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithFeatureSplitTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithFeatureSplitTest.java
index 1183c1f..87fe5f0 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithFeatureSplitTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithFeatureSplitTest.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.apimodel.ApiModelingTestHelper;
import com.android.tools.r8.dexsplitter.SplitterTestBase.RunInterface;
import com.android.tools.r8.dexsplitter.SplitterTestBase.SplitRunner;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -45,6 +46,8 @@
.addFeatureSplitRuntime()
.addKeepFeatureMainRule(FeatureMain.class)
.apply(this::configureRepackaging)
+ // BaseDexClassLoader was introduced at api level 14.
+ .apply(ApiModelingTestHelper::disableOutliningAndStubbing)
.enableInliningAnnotations()
.setMinApi(parameters.getApiLevel())
.compile()