[ApiModel] Force specifying api level for definitions
Bug: 188388130
Bug: 198386209
Bug: 198386856
Change-Id: I92b7db7bd8215bfbf9fa6f8eac1a0e7761006d39
diff --git a/src/main/java/com/android/tools/r8/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
index 6c9025d..68b9354 100644
--- a/src/main/java/com/android/tools/r8/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
@@ -158,6 +158,7 @@
.setGenericSignature(MethodTypeSignature.noSignature())
.setCode(code)
.setClassFileVersion(CfVersion.V1_6)
+ .disableAndroidApiLevelCheck()
.build();
if (method.isStatic() || method.isDirectMethod()) {
directMethods.add(throwingMethod);
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 2ab471a..462c008 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -48,7 +48,7 @@
import com.android.tools.r8.ir.desugar.BackportedMethodRewriter;
import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringCollection;
import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryRetargeterLibraryTypeSynthesizor;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryRetargeterLibraryTypeSynthesizer;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.android.tools.r8.ir.desugar.records.RecordRewriter;
import com.android.tools.r8.ir.optimize.AssertionsRewriter;
@@ -310,8 +310,8 @@
MainDexListBuilder.checkForAssumedLibraryTypes(appView.appInfo());
}
if (!options.desugaredLibraryConfiguration.getRetargetCoreLibMember().isEmpty()) {
- DesugaredLibraryRetargeterLibraryTypeSynthesizor.checkForAssumedLibraryTypes(appView);
- DesugaredLibraryRetargeterLibraryTypeSynthesizor.amendLibraryWithRetargetedMembers(appView);
+ DesugaredLibraryRetargeterLibraryTypeSynthesizer.checkForAssumedLibraryTypes(appView);
+ DesugaredLibraryRetargeterLibraryTypeSynthesizer.amendLibraryWithRetargetedMembers(appView);
}
InterfaceMethodRewriter.checkForAssumedLibraryTypes(appView.appInfo(), options);
BackportedMethodRewriter.registerAssumedLibraryTypes(options);
@@ -438,6 +438,8 @@
annotationRemover.ensureValid().run(executorService);
new GenericSignatureRewriter(appView, NamingLens.getIdentityLens(), genericContextBuilder)
.run(appView.appInfo().classes(), executorService);
+
+ assert appView.checkForTesting(() -> allReferencesAssignedApiLevel(appViewWithLiveness));
}
} finally {
timing.end();
@@ -888,7 +890,8 @@
}
private static boolean allReferencesAssignedApiLevel(AppView<?> appView) {
- if (!appView.options().apiModelingOptions().checkAllApiReferencesAreSet) {
+ if (!appView.options().apiModelingOptions().checkAllApiReferencesAreSet
+ || appView.options().configurationDebugging) {
return true;
}
// This will return false if we find anything in the library which is not modeled.
@@ -897,12 +900,11 @@
.classes()
.forEach(
clazz -> {
- if (appView.options().apiModelingOptions().enableApiCallerIdentification) {
- assert clazz.getMembersApiReferenceLevel(appView) != AndroidApiLevel.UNKNOWN
- : "Every member should have been analyzed";
- } else {
+ assert clazz.getMembersApiReferenceLevel(appView) != AndroidApiLevel.NOT_SET
+ : "Every member should have been analyzed";
+ if (!appView.options().apiModelingOptions().enableApiCallerIdentification) {
assert clazz.getMembersApiReferenceLevel(appView) == AndroidApiLevel.UNKNOWN
- : "Every member should have level UNKNOWN";
+ : "Every member should have level NOT_SET";
}
});
return true;
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 9336265..03c50c0 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -657,6 +657,7 @@
.setGenericSignature(fieldTypeSignature)
.setAnnotations(fieldAnnotations)
.setStaticValue(staticValue)
+ .disableAndroidApiLevelCheck()
.build();
}
return fields;
@@ -708,6 +709,7 @@
.setAnnotations(methodAnnotations)
.setParameterAnnotations(parameterAnnotationsIterator.getNextFor(method))
.setCode(code)
+ .disableAndroidApiLevelCheck()
.build();
}
return methods;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
index c89d8ed..5cfbeeb 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -59,9 +59,9 @@
FieldTypeSignature genericSignature,
DexAnnotationSet annotations,
DexValue staticValue,
+ AndroidApiLevel apiLevel,
boolean deprecated,
- boolean d8R8Synthesized,
- AndroidApiLevel apiLevel) {
+ boolean d8R8Synthesized) {
super(field, annotations, d8R8Synthesized, apiLevel);
this.accessFlags = accessFlags;
this.staticValue = staticValue;
@@ -365,6 +365,10 @@
private final boolean d8R8Synthesized;
private Consumer<DexEncodedField> buildConsumer = ConsumerUtils.emptyConsumer();
+ // Checks to impose on the built method. They should always be active to start with and be
+ // lowered on the use site.
+ private boolean checkAndroidApiLevel = true;
+
private Builder(boolean d8R8Synthesized) {
this.d8R8Synthesized = d8R8Synthesized;
}
@@ -448,11 +452,17 @@
return this;
}
+ public Builder disableAndroidApiLevelCheck() {
+ checkAndroidApiLevel = false;
+ return this;
+ }
+
public DexEncodedField build() {
assert field != null;
assert accessFlags != null;
assert genericSignature != null;
assert annotations != null;
+ assert !checkAndroidApiLevel || apiLevel != AndroidApiLevel.NOT_SET;
DexEncodedField dexEncodedField =
new DexEncodedField(
field,
@@ -460,9 +470,9 @@
genericSignature,
annotations,
staticValue,
+ apiLevel,
deprecated,
- d8R8Synthesized,
- apiLevel);
+ d8R8Synthesized);
dexEncodedField.optimizationInfo = optimizationInfo;
buildConsumer.accept(dexEncodedField);
return dexEncodedField;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index b6c7d02..a153a6a 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -11,6 +11,7 @@
import static com.android.tools.r8.graph.DexEncodedMethod.CompilationState.PROCESSED_NOT_INLINING_CANDIDATE;
import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getNoKotlinInfo;
+import static com.android.tools.r8.utils.AndroidApiLevel.NOT_SET;
import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
import com.android.tools.r8.cf.CfVersion;
@@ -45,6 +46,7 @@
import com.android.tools.r8.errors.InternalCompilerError;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexAnnotation.AnnotatedKind;
+import com.android.tools.r8.graph.DexEncodedMethod.CompilationState;
import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
import com.android.tools.r8.ir.analysis.inlining.SimpleInliningConstraint;
import com.android.tools.r8.ir.code.IRCode;
@@ -146,9 +148,9 @@
ParameterAnnotationsList.empty(),
null,
false,
+ NOT_SET,
+ NOT_SET,
null,
- AndroidApiLevel.UNKNOWN,
- AndroidApiLevel.UNKNOWN,
false);
public static final Int2ReferenceMap<DebugLocalInfo> NO_PARAMETER_INFO =
new Int2ReferenceArrayMap<>(0);
@@ -238,9 +240,9 @@
ParameterAnnotationsList parameterAnnotationsList,
Code code,
boolean d8R8Synthesized,
- CfVersion classFileVersion,
AndroidApiLevel apiLevelForDefinition,
AndroidApiLevel apiLevelForCode,
+ CfVersion classFileVersion,
boolean deprecated) {
super(method, annotations, d8R8Synthesized, apiLevelForDefinition);
this.accessFlags = accessFlags;
@@ -253,7 +255,8 @@
assert accessFlags != null;
assert code == null || !shouldNotHaveCode();
assert parameterAnnotationsList != null;
- assert apiLevelForCode != null && apiLevelForDefinition != null;
+ assert apiLevelForDefinition != null;
+ assert apiLevelForCode != null;
}
public static DexEncodedMethod toMethodDefinitionOrNull(DexClassAndMethod method) {
@@ -1270,6 +1273,8 @@
// Holder is companion class, or retarget method, not an interface.
.setStaticTarget(forwardMethod, false)
.build())
+ .setApiLevelForDefinition(target.getDefinition().getApiLevelForDefinition())
+ .setApiLevelForCode(target.getDefinition().getApiLevelForCode())
.build();
}
@@ -1358,7 +1363,7 @@
@Override
public AndroidApiLevel getApiLevel() {
- return (isAbstract() ? AndroidApiLevel.B : getApiLevelForCode())
+ return (shouldNotHaveCode() ? AndroidApiLevel.B : getApiLevelForCode())
.max(getApiLevelForDefinition());
}
@@ -1441,8 +1446,8 @@
private MethodOptimizationInfo optimizationInfo = DefaultMethodOptimizationInfo.getInstance();
private KotlinMethodLevelInfo kotlinInfo = getNoKotlinInfo();
private CfVersion classFileVersion = null;
- private AndroidApiLevel apiLevelForDefinition = AndroidApiLevel.UNKNOWN;
- private AndroidApiLevel apiLevelForCode = AndroidApiLevel.UNKNOWN;
+ private AndroidApiLevel apiLevelForDefinition = NOT_SET;
+ private AndroidApiLevel apiLevelForCode = NOT_SET;
private final boolean d8R8Synthesized;
private boolean deprecated = false;
@@ -1450,6 +1455,7 @@
// lowered on the use site.
private boolean checkMethodNotNull = true;
private boolean checkParameterAnnotationList = true;
+ private boolean checkAndroidApiLevels = true;
private Consumer<DexEncodedMethod> buildConsumer = ConsumerUtils.emptyConsumer();
@@ -1687,6 +1693,11 @@
return this;
}
+ public Builder disableAndroidApiLevelCheck() {
+ checkAndroidApiLevels = false;
+ return this;
+ }
+
public DexEncodedMethod build() {
assert !checkMethodNotNull || method != null;
assert accessFlags != null;
@@ -1695,8 +1706,8 @@
assert !checkParameterAnnotationList
|| parameterAnnotations.isEmpty()
|| parameterAnnotations.size() == method.proto.parameters.size();
- assert apiLevelForDefinition != null;
- assert apiLevelForCode != null;
+ assert !checkAndroidApiLevels || apiLevelForDefinition != null;
+ assert !checkAndroidApiLevels || apiLevelForCode != null;
DexEncodedMethod result =
new DexEncodedMethod(
method,
@@ -1706,9 +1717,9 @@
parameterAnnotations,
code,
d8R8Synthesized,
- classFileVersion,
apiLevelForDefinition,
apiLevelForCode,
+ classFileVersion,
deprecated);
result.setKotlinMemberInfo(kotlinInfo);
result.compilationState = compilationState;
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index 2164d54..4c6c165 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -38,7 +38,6 @@
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.shaking.ProguardKeepAttributes;
import com.android.tools.r8.synthesis.SyntheticMarker;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AsmUtils;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.ExceptionUtils;
@@ -675,6 +674,7 @@
.setAnnotations(annotationSet)
.setStaticValue(staticValue)
.setDeprecated(AsmUtils.isDeprecated(access))
+ .disableAndroidApiLevelCheck()
.build();
if (flags.isStatic()) {
parent.staticFields.add(field);
@@ -911,10 +911,9 @@
.setParameterAnnotations(parameterAnnotationsList)
.setCode(code)
.setClassFileVersion(parent.version)
- .setApiLevelForDefinition(AndroidApiLevel.UNKNOWN)
- .setApiLevelForCode(AndroidApiLevel.UNKNOWN)
.setDeprecated(deprecated)
.disableParameterAnnotationListCheck()
+ .disableAndroidApiLevelCheck()
.build();
Wrapper<DexMethod> signature = MethodSignatureEquivalence.get().wrap(method);
if (parent.methodSignatures.add(signature)) {
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/ApiModelAnalysis.java b/src/main/java/com/android/tools/r8/graph/analysis/ApiModelAnalysis.java
index 9da5368..85c63ad 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/ApiModelAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/ApiModelAnalysis.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.androidapi.AndroidApiReferenceLevelCache;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClassAndMember;
+import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.LookupTarget;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramField;
@@ -47,7 +48,12 @@
.accept(method.getMethodReference(), registry.getMaxApiReferenceLevel());
}
computeApiLevelForDefinition(method);
- method.getDefinition().setApiLevelForCode(registry.getMaxApiReferenceLevel());
+ method
+ .getDefinition()
+ .setApiLevelForCode(
+ appView.options().apiModelingOptions().enableApiCallerIdentification
+ ? registry.getMaxApiReferenceLevel()
+ : AndroidApiLevel.UNKNOWN);
}
@Override
@@ -69,7 +75,17 @@
});
}
+ @Override
+ public void notifyFailedMethodResolutionTarget(DexEncodedMethod method) {
+ // We may not trace into failed resolution targets.
+ method.setApiLevelForCode(AndroidApiLevel.UNKNOWN);
+ }
+
private void computeApiLevelForDefinition(DexClassAndMember<?, ?> member) {
+ if (!appView.options().apiModelingOptions().enableApiCallerIdentification) {
+ member.getDefinition().setApiLevelForDefinition(AndroidApiLevel.UNKNOWN);
+ return;
+ }
member
.getDefinition()
.setApiLevelForDefinition(
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/EnqueuerAnalysis.java b/src/main/java/com/android/tools/r8/graph/analysis/EnqueuerAnalysis.java
index 0610c55..ceb7e92 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/EnqueuerAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/EnqueuerAnalysis.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.graph.analysis;
+import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.LookupTarget;
import com.android.tools.r8.graph.ProgramDefinition;
@@ -37,6 +38,8 @@
public void notifyMarkVirtualDispatchTargetAsLive(LookupTarget target) {}
+ public void notifyFailedMethodResolutionTarget(DexEncodedMethod method) {}
+
/**
* Called when the Enqueuer reaches a fixpoint. This may happen multiple times, since each
* analysis may enqueue items into the worklist upon the fixpoint using {@param worklist}.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
index a0d130d..1e393aa 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
@@ -6,7 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPICallbackSynthesizor;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPICallbackSynthesizer;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryRetargeterPostProcessor;
import com.android.tools.r8.ir.desugar.desugaredlibrary.RetargetingInfo;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
@@ -64,9 +64,9 @@
if (interfaceMethodProcessorFacade != null) {
desugarings.add(interfaceMethodProcessorFacade);
}
- DesugaredLibraryAPICallbackSynthesizor apiCallbackSynthesizor =
+ DesugaredLibraryAPICallbackSynthesizer apiCallbackSynthesizor =
appView.rewritePrefix.isRewriting()
- ? new DesugaredLibraryAPICallbackSynthesizor(appView)
+ ? new DesugaredLibraryAPICallbackSynthesizer(appView)
: null;
// At this point the desugaredLibraryAPIConverter is required to be last to generate
// call-backs on the forwarding methods.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
index a18d9b9..0d0dd97 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
@@ -175,6 +175,8 @@
.setParameterAnnotations(
methodDefinition.parameterAnnotationsList.keepIf(Predicates.alwaysTrue()))
.setCode(forwardMethodBuilder.build())
+ .setApiLevelForDefinition(methodDefinition.getApiLevelForDefinition())
+ .setApiLevelForCode(methodDefinition.getApiLevelForCode())
.build();
// Optimize to generate DexCode instead of CfCode.
ProgramMethod programMethod = new ProgramMethod(methodHolder, newVirtualMethod);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index c7f5ec8..c2d95ca 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -36,7 +36,6 @@
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
import com.android.tools.r8.synthesis.SyntheticProgramClassBuilder;
-import com.android.tools.r8.utils.AndroidApiLevel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -161,6 +160,8 @@
MethodAccessFlags.fromSharedAccessFlags(
Constants.ACC_PUBLIC | Constants.ACC_FINAL, false))
.setCode(LambdaMainMethodSourceCode.build(this, mainMethod))
+ // The api level is computed when tracing.
+ .disableAndroidApiLevelCheck()
.build());
// Synthesize bridge methods.
@@ -178,6 +179,8 @@
| Constants.ACC_BRIDGE,
false))
.setCode(LambdaBridgeMethodSourceCode.build(this, bridgeMethod, mainMethod))
+ // The api level is computed when tracing.
+ .disableAndroidApiLevelCheck()
.build());
}
builder.setVirtualMethods(methods);
@@ -198,6 +201,8 @@
.setMethod(constructor)
.setAccessFlags(accessFlags)
.setCode(LambdaConstructorSourceCode.build(this))
+ // The api level is computed when tracing.
+ .disableAndroidApiLevelCheck()
.build());
// Class constructor for stateless lambda classes.
@@ -209,6 +214,8 @@
MethodAccessFlags.fromSharedAccessFlags(
Constants.ACC_SYNTHETIC | Constants.ACC_STATIC, true))
.setCode(LambdaClassConstructorSourceCode.build(this))
+ // The api level is computed when tracing.
+ .disableAndroidApiLevelCheck()
.build());
feedback.classInitializerMayBePostponed(methods.get(1));
}
@@ -226,7 +233,7 @@
.setField(getCaptureField(i))
.setAccessFlags(FieldAccessFlags.createPublicFinalSynthetic())
// The api level is computed when tracing.
- .setApiLevel(AndroidApiLevel.UNKNOWN)
+ .disableAndroidApiLevelCheck()
.build());
}
builder.setInstanceFields(fields);
@@ -249,7 +256,7 @@
| Constants.ACC_STATIC))
.setStaticValue(DexValueNull.NULL)
// The api level is computed when tracing.
- .setApiLevel(AndroidApiLevel.UNKNOWN)
+ .disableAndroidApiLevelCheck()
.build()));
}
}
@@ -564,6 +571,8 @@
.setAnnotations(encodedMethod.annotations())
.setParameterAnnotations(encodedMethod.parameterAnnotationsList)
.setCode(encodedMethod.getCode())
+ .setApiLevelForDefinition(encodedMethod.getApiLevelForDefinition())
+ .setApiLevelForCode(encodedMethod.getApiLevelForCode())
.build();
newMethod.copyMetadata(encodedMethod);
forcefullyMovedLambdaMethodConsumer.acceptForcefullyMovedLambdaMethod(
@@ -647,6 +656,8 @@
.setAnnotations(encodedMethod.annotations())
.setParameterAnnotations(encodedMethod.parameterAnnotationsList)
.setCode(encodedMethod.getCode())
+ .setApiLevelForDefinition(encodedMethod.getApiLevelForDefinition())
+ .setApiLevelForCode(encodedMethod.getApiLevelForCode())
.build();
newMethod.copyMetadata(encodedMethod);
forcefullyMovedLambdaMethodConsumer.acceptForcefullyMovedLambdaMethod(
@@ -708,6 +719,8 @@
.setMethod(callTarget)
.setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
.setCode(AccessorMethodSourceCode.build(LambdaClass.this, callTarget))
+ // The api level is computed when tracing.
+ .disableAndroidApiLevelCheck()
.build());
accessorClass.addDirectMethod(accessorMethod.getDefinition());
if (appView.options().isDesugaredLibraryCompilation()
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java
index 22654d6..4015912 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicClass.java
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.desugar.constantdynamic;
+import static com.android.tools.r8.utils.AndroidApiLevel.minApiLevelIfEnabledOrUnknown;
import static org.objectweb.asm.Opcodes.GETSTATIC;
import static org.objectweb.asm.Opcodes.INVOKESTATIC;
import static org.objectweb.asm.Opcodes.PUTSTATIC;
@@ -127,12 +128,12 @@
DexEncodedField.syntheticBuilder()
.setField(this.initializedValueField)
.setAccessFlags(FieldAccessFlags.createPrivateStaticSynthetic())
- .setApiLevel(AndroidApiLevel.minApiLevelIfEnabledOrUnknown(appView))
+ .setApiLevel(minApiLevelIfEnabledOrUnknown(appView))
.build(),
DexEncodedField.syntheticBuilder()
.setField(this.constantValueField)
.setAccessFlags(FieldAccessFlags.createPrivateStaticSynthetic())
- .setApiLevel(AndroidApiLevel.minApiLevelIfEnabledOrUnknown(appView))
+ .setApiLevel(minApiLevelIfEnabledOrUnknown(appView))
.build()));
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPICallbackSynthesizor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPICallbackSynthesizer.java
similarity index 98%
rename from src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPICallbackSynthesizor.java
rename to src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPICallbackSynthesizer.java
index 3e0143a..92d7b92 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPICallbackSynthesizor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPICallbackSynthesizer.java
@@ -30,7 +30,7 @@
import java.util.Set;
import java.util.concurrent.ExecutorService;
-public class DesugaredLibraryAPICallbackSynthesizor implements CfPostProcessingDesugaring {
+public class DesugaredLibraryAPICallbackSynthesizer implements CfPostProcessingDesugaring {
private final AppView<?> appView;
private final DexItemFactory factory;
@@ -38,7 +38,7 @@
private final DesugaredLibraryWrapperSynthesizer wrapperSynthesizor;
private final Set<DexMethod> trackedCallBackAPIs;
- public DesugaredLibraryAPICallbackSynthesizor(AppView<?> appView) {
+ public DesugaredLibraryAPICallbackSynthesizer(AppView<?> appView) {
this.appView = appView;
this.factory = appView.dexItemFactory();
this.wrapperSynthesizor = new DesugaredLibraryWrapperSynthesizer(appView);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterLibraryTypeSynthesizor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterLibraryTypeSynthesizer.java
similarity index 97%
rename from src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterLibraryTypeSynthesizor.java
rename to src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterLibraryTypeSynthesizer.java
index 9e50613..faa5857 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterLibraryTypeSynthesizor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterLibraryTypeSynthesizer.java
@@ -36,7 +36,7 @@
import java.util.Set;
import java.util.TreeSet;
-public class DesugaredLibraryRetargeterLibraryTypeSynthesizor {
+public class DesugaredLibraryRetargeterLibraryTypeSynthesizer {
public static void checkForAssumedLibraryTypes(AppView<?> appView) {
Map<DexString, Map<DexType, DexType>> retargetCoreLibMember =
@@ -144,6 +144,7 @@
MethodAccessFlags.fromCfAccessFlags(
Constants.ACC_PUBLIC | Constants.ACC_STATIC, false))
.setCode(null)
+ .setApiLevelForDefinition(method.getApiLevelForDefinition())
.build());
}
});
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
index b6200cb..c268bfd 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
@@ -133,8 +133,7 @@
}
private DexEncodedMethod createForwardingMethod(DexClassAndMethod target, DexClass clazz) {
- // NOTE: Never add a forwarding method to methods of classes unknown or coming from
- // android.jar
+ // NOTE: Never add a forwarding method to methods of classes unknown or coming from android.jar
// even if this results in invalid code, these classes are never desugared.
// In desugared library, emulated interface methods can be overridden by retarget lib members.
DexMethod forwardMethod =
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
index 9bc1a8e..4feafe3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.ir.desugar.desugaredlibrary;
+import static com.android.tools.r8.utils.AndroidApiLevel.NOT_SET;
+
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCode;
@@ -561,6 +563,8 @@
.setMethod(methodToInstall)
.setAccessFlags(newFlags)
.setCode(code)
+ .setApiLevelForDefinition(template.getApiLevelForDefinition())
+ .setApiLevelForCode(code == null ? NOT_SET : template.getApiLevelForCode())
.build();
}
@@ -620,6 +624,8 @@
return DexEncodedField.syntheticBuilder()
.setField(field)
.setAccessFlags(fieldAccessFlags)
+ // The api level is computed when tracing.
+ .disableAndroidApiLevelCheck()
.build();
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
index 2b8e3c7..d32b3d3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.ir.desugar.itf;
+import static com.android.tools.r8.utils.AndroidApiLevel.minApiLevelIfEnabledOrUnknown;
+
import com.android.tools.r8.cf.code.CfInvoke;
import com.android.tools.r8.cf.code.CfNew;
import com.android.tools.r8.cf.code.CfStackInstruction;
@@ -802,6 +804,8 @@
.setAccessFlags(accessFlags)
.setCode(
createExceptionThrowingCfCode(newMethod, accessFlags, errorType, dexItemFactory))
+ .setApiLevelForDefinition(minApiLevelIfEnabledOrUnknown(appView))
+ .setApiLevelForCode(minApiLevelIfEnabledOrUnknown(appView))
.build();
addSyntheticMethod(clazz.asProgramClass(), newEncodedMethod);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
index a2a2bf9..bb1a427 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.ir.desugar.itf;
+
import com.android.tools.r8.cf.CfVersion;
import com.android.tools.r8.cf.code.CfFieldInstruction;
import com.android.tools.r8.cf.code.CfInitClass;
@@ -459,6 +460,8 @@
.setAccessFlags(
FieldAccessFlags.builder().setPackagePrivate().setStatic().setSynthetic().build())
.setStaticValue(DexValueInt.DEFAULT)
+ // The api level is computed when tracing.
+ .disableAndroidApiLevelCheck()
.build();
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriter.java
index 627f8af..294dbb8 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordRewriter.java
@@ -290,6 +290,8 @@
.setMethod(method)
.setAccessFlags(methodAccessFlags)
.setCode(null)
+ // Will be traced by the enqueuer.
+ .disableAndroidApiLevelCheck()
.build();
encodedMethod.setCode(provider.generateCfCode(), appView);
return new ProgramMethod(clazz, encodedMethod);
@@ -587,6 +589,8 @@
.setMethod(factory.recordMembers.init)
.setAccessFlags(methodAccessFlags)
.setCode(null)
+ // Will be traced by the enqueuer.
+ .disableAndroidApiLevelCheck()
.build();
init.setCode(
new CallObjectInitCfCodeProvider(appView, factory.recordTagType).generateCfCode(), appView);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java b/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java
index 2b15739..71f01da 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.ir.optimize;
+import static com.android.tools.r8.utils.AndroidApiLevel.minApiLevelIfEnabledOrUnknown;
+
import com.android.tools.r8.cf.CfVersion;
import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.contexts.CompilationContext.UniqueContext;
@@ -70,6 +72,8 @@
builder
.setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
.setClassFileVersion(CfVersion.V1_8)
+ .setApiLevelForDefinition(minApiLevelIfEnabledOrUnknown(appView))
+ .setApiLevelForCode(minApiLevelIfEnabledOrUnknown(appView))
.setCode(
method -> getThrowClassCastExceptionIfNotNullCodeTemplate(method, options))
.setProto(proto));
@@ -98,6 +102,8 @@
builder
.setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
.setClassFileVersion(CfVersion.V1_8)
+ .setApiLevelForDefinition(minApiLevelIfEnabledOrUnknown(appView))
+ .setApiLevelForCode(minApiLevelIfEnabledOrUnknown(appView))
.setCode(method -> getThrowIllegalAccessErrorCodeTemplate(method, options))
.setProto(proto));
return new UtilityMethodForCodeOptimizations(syntheticMethod);
@@ -124,6 +130,8 @@
builder
.setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
.setClassFileVersion(CfVersion.V1_8)
+ .setApiLevelForDefinition(minApiLevelIfEnabledOrUnknown(appView))
+ .setApiLevelForCode(minApiLevelIfEnabledOrUnknown(appView))
.setCode(
method -> getThrowIncompatibleClassChangeErrorCodeTemplate(method, options))
.setProto(proto));
@@ -152,6 +160,8 @@
builder
.setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
.setClassFileVersion(CfVersion.V1_8)
+ .setApiLevelForDefinition(minApiLevelIfEnabledOrUnknown(appView))
+ .setApiLevelForCode(minApiLevelIfEnabledOrUnknown(appView))
.setCode(method -> getThrowNoSuchMethodErrorCodeTemplate(method, options))
.setProto(proto));
return new UtilityMethodForCodeOptimizations(syntheticMethod);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryFieldSynthesis.java b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryFieldSynthesis.java
index 2c012f0..27fa69a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryFieldSynthesis.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryFieldSynthesis.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.optimize.library;
import static com.android.tools.r8.graph.DexLibraryClass.asLibraryClassOrNull;
+import static com.android.tools.r8.utils.AndroidApiLevel.minApiLevelIfEnabledOrUnknown;
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.graph.AppView;
@@ -38,6 +39,9 @@
.setAccessFlags(
FieldAccessFlags.fromCfAccessFlags(
Constants.ACC_PRIVATE | Constants.ACC_FINAL))
+ .setApiLevel(minApiLevelIfEnabledOrUnknown(appView))
+ // Will be traced by the enqueuer.
+ .disableAndroidApiLevelCheck()
.build());
}
});
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 895e610..a12eff1 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -3051,6 +3051,8 @@
DexClassAndMethod target = resolution.lookupInvokeSuperTarget(from.getHolder(), appInfo);
if (target == null) {
failedMethodResolutionTargets.add(resolution.getResolvedMethod().getReference());
+ analyses.forEach(
+ analyses -> analyses.notifyFailedMethodResolutionTarget(resolution.getResolvedMethod()));
return;
}
@@ -3117,9 +3119,7 @@
&& appView.options().getProguardConfiguration().getKeepAttributes().signature) {
registerAnalysis(new GenericSignatureEnqueuerAnalysis(enqueuerDefinitionSupplier));
}
- if (appView.options().apiModelingOptions().enableApiCallerIdentification) {
- registerAnalysis(new ApiModelAnalysis(appView, apiReferenceLevelCache));
- }
+ registerAnalysis(new ApiModelAnalysis(appView, apiReferenceLevelCache));
// Transfer the minimum keep info from the root set into the Enqueuer state.
includeMinimumKeepInfo(rootSet);
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index 276d737..43d2d16 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -23,6 +23,7 @@
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback.OptimizationInfoFixer;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
import com.android.tools.r8.logging.Log;
+import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.ExceptionUtils;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.IterableUtils;
@@ -333,6 +334,11 @@
// Private methods and static methods can only be targeted yet non-live as the result of
// an invalid invoke. They will not actually be called at runtime but we have to keep them
// as non-abstract (see above) to produce the same failure mode.
+ if (!allowAbstract) {
+ // If the method was not marked as live and we cannot make it abstract, set the api level
+ // to be min or unknown.
+ method.setApiLevelForCode(AndroidApiLevel.minApiLevelIfEnabledOrUnknown(appView));
+ }
reachableMethods.add(
allowAbstract ? method.toAbstractMethod() : method.toEmptyThrowingMethod(options));
} else {
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 6e06948..8128db2 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -1449,8 +1449,8 @@
.setClassFileVersion(classFileVersion)
.setApiLevelForDefinition(method.getApiLevelForDefinition())
.setApiLevelForCode(method.getApiLevelForDefinition())
+ .setIsLibraryMethodOverride(method.isLibraryMethodOverride())
.build();
- bridge.setLibraryMethodOverride(method.isLibraryMethodOverride());
if (method.accessFlags.isPromotedToPublic()) {
// The bridge is now the public method serving the role of the original method, and should
// reflect that this method was publicized.
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java
index 0e45bd8..e867c59 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java
@@ -16,7 +16,6 @@
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
-import com.android.tools.r8.utils.AndroidApiLevel;
import java.util.function.Consumer;
public class SyntheticMethodBuilder {
@@ -116,8 +115,8 @@
.setParameterAnnotations(parameterAnnotationsList)
.setCode(code)
.setClassFileVersion(classFileVersion)
- .setApiLevelForDefinition(AndroidApiLevel.UNKNOWN)
- .setApiLevelForCode(AndroidApiLevel.UNKNOWN)
+ // TODO(b/188388130): This should pass in api level directly.
+ .disableAndroidApiLevelCheck()
.build();
assert isValidSyntheticMethod(method, syntheticKind);
if (onBuildConsumer != null) {
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
index e127d6c..c2f78cf 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
@@ -42,7 +42,8 @@
Q(29),
R(30),
S(31),
- UNKNOWN(10000);
+ UNKNOWN(10000),
+ NOT_SET(10001);
// When updating LATEST and a new version goes stable, add a new api-versions.xml to third_party
// and update the version and generated jar in AndroidApiDatabaseBuilderGeneratorTest.
@@ -77,8 +78,9 @@
}
public static AndroidApiLevel minApiLevelIfEnabledOrUnknown(AppView<?> appView) {
- return appView.options().apiModelingOptions().enableApiCallerIdentification
- ? appView.options().minApiLevel
+ InternalOptions options = appView.options();
+ return options.apiModelingOptions().enableApiCallerIdentification
+ ? options.minApiLevel
: UNKNOWN;
}
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index a457e50..ec57f95 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -869,6 +869,7 @@
case J_MR2:
case K_WATCH:
case UNKNOWN:
+ case NOT_SET:
return false;
default:
return true;
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
index 5e1b8c0..905529a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
@@ -126,7 +126,7 @@
.parse(StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()));
for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
- if (apiLevel == AndroidApiLevel.UNKNOWN) {
+ if (apiLevel == AndroidApiLevel.UNKNOWN || apiLevel == AndroidApiLevel.NOT_SET) {
continue;
}
Path compileApiLevelDirectory = directory.resolve("compile_api_level_" + apiLevel.getLevel());
diff --git a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
index afc7a62..ce5a517 100644
--- a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
+++ b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
@@ -156,6 +156,7 @@
.setAccessFlags(flags)
.setCode(code)
.disableMethodNotNullCheck()
+ .disableAndroidApiLevelCheck()
.build();
return new JumboStringRewriter(method, string, factory).rewrite();
}
diff --git a/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java b/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
index d8e2db4..a24f51f 100644
--- a/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/conversion/CallGraphTestBase.java
@@ -55,6 +55,7 @@
.setMethod(signature)
.setAccessFlags(MethodAccessFlags.fromDexAccessFlags(0))
.setCode(null)
+ .disableAndroidApiLevelCheck()
.build());
return new Node(method);
}
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index be4f6de..04921e2 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -864,6 +864,7 @@
.setMethod(voidReturnMethod)
.setAccessFlags(access)
.setCode(code)
+ .disableAndroidApiLevelCheck()
.build();
ProgramMethod programMethod = new ProgramMethod(programClass, method);
IRCode ir = code.buildIR(programMethod, appView, Origin.unknown());
diff --git a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingTest.java b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingTest.java
index 7cb0d57..c7630ba 100644
--- a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingTest.java
@@ -15,7 +15,6 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.InstructionSubject;
@@ -96,7 +95,7 @@
@Parameters(name = "{0}")
public static TestParametersCollection data() {
- return getTestParameters().withAllRuntimes().build();
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
}
public ConfigurationDebuggingTest(TestParameters parameters) {
@@ -111,7 +110,7 @@
.addKeepRules("-addconfigurationdebugging")
.addKeepRules("-keep class **.TestClass { <init>(); }")
.noMinification()
- .setMinApi(parameters.getRuntime())
+ .setMinApi(parameters.getApiLevel())
.compile()
.inspect(this::inspect)
.writeToZip();
@@ -119,10 +118,10 @@
R8FullTestBuilder builder =
testForR8(parameters.getBackend())
.addLibraryClasses(BaseClass.class, UninstantiatedClass.class, TestClass.class)
- .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+ .addDefaultRuntimeLibrary(parameters)
.addProgramClasses(Caller.class)
.addKeepMainRule(Caller.class)
- .setMinApi(parameters.getRuntime());
+ .setMinApi(parameters.getApiLevel());
R8TestRunResult result =
builder
.compile()