Revert "Change minApiLevel on InternalOptions from int to AndroidApiLevel"
This reverts commit 8a1d03ab5d5f0fcfec3a7c041aa19a3fa27745d8.
Reason for revert: Failing bots
Change-Id: I176b47cfe9f42f8785fda33c0e3bf4af168fc402
diff --git a/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java b/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java
index c856d87..a4af022 100644
--- a/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java
+++ b/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java
@@ -104,7 +104,7 @@
InternalOptions getInternalOptions() {
InternalOptions options = new InternalOptions(factory, getReporter());
- options.minApiLevel = AndroidApiLevel.getAndroidApiLevel(minApiLevel);
+ options.minApiLevel = minApiLevel;
options.desugaredLibraryConfiguration = desugaredLibraryConfiguration;
return options;
}
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 1ef4a6e..8863e35 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -458,7 +458,7 @@
internal.mainDexListConsumer = getMainDexListConsumer();
internal.minimalMainDex = internal.debug || minimalMainDex;
internal.enableMainDexListCheck = enableMainDexListCheck;
- internal.minApiLevel = AndroidApiLevel.getAndroidApiLevel(getMinApiLevel());
+ internal.minApiLevel = getMinApiLevel();
internal.intermediate = intermediate;
internal.readCompileTimeAnnotations = intermediate;
internal.desugarGraphConsumer = desugarGraphConsumer;
diff --git a/src/main/java/com/android/tools/r8/ExtractMarker.java b/src/main/java/com/android/tools/r8/ExtractMarker.java
index b21bb03..9492e12 100644
--- a/src/main/java/com/android/tools/r8/ExtractMarker.java
+++ b/src/main/java/com/android/tools/r8/ExtractMarker.java
@@ -98,10 +98,11 @@
}
}
- private static Collection<Marker> extractMarker(AndroidApp app) throws IOException {
+ private static Collection<Marker> extractMarker(AndroidApp app)
+ throws IOException, ExecutionException {
InternalOptions options = new InternalOptions();
options.skipReadingDexCode = true;
- options.minApiLevel = AndroidApiLevel.P;
+ options.minApiLevel = AndroidApiLevel.P.getLevel();
DexApplication dexApp = new ApplicationReader(app, options, new Timing("ExtractMarker")).read();
return dexApp.dexItemFactory.extractMarkers();
}
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 9ec502c..fc9a567 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -14,7 +14,6 @@
import com.android.tools.r8.inspector.Inspector;
import com.android.tools.r8.ir.desugar.DesugaredLibraryConfiguration;
import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.AssertionConfigurationWithDefault;
import com.android.tools.r8.utils.DumpInputFlags;
@@ -161,7 +160,7 @@
internal.debug = getMode() == CompilationMode.DEBUG;
assert internal.mainDexListConsumer == null;
assert !internal.minimalMainDex;
- internal.minApiLevel = AndroidApiLevel.getAndroidApiLevel(getMinApiLevel());
+ internal.minApiLevel = getMinApiLevel();
assert !internal.intermediate;
assert internal.readCompileTimeAnnotations;
internal.programConsumer = getProgramConsumer();
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 581d808..7aed2af 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -105,6 +105,7 @@
import com.android.tools.r8.shaking.WhyAreYouKeepingConsumer;
import com.android.tools.r8.synthesis.SyntheticFinalization;
import com.android.tools.r8.synthesis.SyntheticItems;
+import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.CfgPrinter;
import com.android.tools.r8.utils.CollectionUtils;
@@ -331,7 +332,7 @@
options.itemFactory, options.getProguardConfiguration().getRules())) {
synthesizedProguardRules.add(
ProguardConfigurationUtils.buildAssumeNoSideEffectsRuleForApiLevel(
- options.itemFactory, options.minApiLevel));
+ options.itemFactory, AndroidApiLevel.getAndroidApiLevel(options.minApiLevel)));
}
}
SubtypingInfo subtypingInfo = new SubtypingInfo(appView);
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 7d4b172..4fdb44d 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -833,10 +833,7 @@
assert !internal.debug;
internal.debug = getMode() == CompilationMode.DEBUG;
internal.programConsumer = getProgramConsumer();
- internal.minApiLevel =
- getMinApiLevel() < 0
- ? AndroidApiLevel.B
- : AndroidApiLevel.getAndroidApiLevel(getMinApiLevel());
+ internal.minApiLevel = getMinApiLevel();
internal.desugarState = getDesugarState();
assert internal.isShrinking() == getEnableTreeShaking();
assert internal.isMinifying() == getEnableMinification();
diff --git a/src/main/java/com/android/tools/r8/androidapi/AvailableApiExceptions.java b/src/main/java/com/android/tools/r8/androidapi/AvailableApiExceptions.java
index 606d653..c44f1f4 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AvailableApiExceptions.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AvailableApiExceptions.java
@@ -26,7 +26,7 @@
private final Set<DexType> exceptions;
public AvailableApiExceptions(InternalOptions options) {
- assert options.minApiLevel.isLessThan(AndroidApiLevel.L);
+ assert options.minApiLevel < AndroidApiLevel.L.getLevel();
exceptions = build(options.itemFactory, options.minApiLevel);
}
@@ -35,9 +35,9 @@
}
/** The content of this method can be regenerated with GenerateAvailableExceptions.main. */
- public static Set<DexType> build(DexItemFactory factory, AndroidApiLevel minApiLevel) {
+ public static Set<DexType> build(DexItemFactory factory, int minApiLevel) {
Set<DexType> types = SetUtils.newIdentityHashSet(333);
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.B)) {
+ if (minApiLevel >= 1) {
types.add(factory.createType("Landroid/app/PendingIntent$CanceledException;"));
types.add(factory.createType("Landroid/content/ActivityNotFoundException;"));
types.add(factory.createType("Landroid/content/IntentFilter$MalformedMimeTypeException;"));
@@ -305,17 +305,17 @@
types.add(factory.createType("Lorg/xml/sax/SAXParseException;"));
types.add(factory.createType("Lorg/xmlpull/v1/XmlPullParserException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.D)) {
+ if (minApiLevel >= 4) {
types.add(factory.createType("Landroid/content/IntentSender$SendIntentException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.E)) {
+ if (minApiLevel >= 5) {
types.add(factory.createType("Landroid/accounts/AccountsException;"));
types.add(factory.createType("Landroid/accounts/AuthenticatorException;"));
types.add(factory.createType("Landroid/accounts/NetworkErrorException;"));
types.add(factory.createType("Landroid/accounts/OperationCanceledException;"));
types.add(factory.createType("Landroid/content/OperationApplicationException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.F)) {
+ if (minApiLevel >= 8) {
types.add(factory.createType("Ljavax/xml/datatype/DatatypeConfigurationException;"));
types.add(factory.createType("Ljavax/xml/transform/TransformerConfigurationException;"));
types.add(factory.createType("Ljavax/xml/transform/TransformerException;"));
@@ -326,7 +326,7 @@
types.add(factory.createType("Ljavax/xml/xpath/XPathFunctionException;"));
types.add(factory.createType("Lorg/w3c/dom/ls/LSException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.G)) {
+ if (minApiLevel >= 9) {
types.add(factory.createType("Landroid/net/sip/SipException;"));
types.add(factory.createType("Landroid/nfc/FormatException;"));
types.add(factory.createType("Ljava/io/IOError;"));
@@ -346,10 +346,10 @@
types.add(factory.createType("Ljava/util/ServiceConfigurationError;"));
types.add(factory.createType("Ljava/util/zip/ZipError;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.G_MR1)) {
+ if (minApiLevel >= 10) {
types.add(factory.createType("Landroid/nfc/TagLostException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.H)) {
+ if (minApiLevel >= 11) {
types.add(factory.createType("Landroid/app/Fragment$InstantiationException;"));
types.add(factory.createType("Landroid/database/sqlite/SQLiteAccessPermException;"));
types.add(
@@ -372,28 +372,28 @@
types.add(factory.createType("Landroid/util/MalformedJsonException;"));
types.add(factory.createType("Landroid/view/KeyCharacterMap$UnavailableException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.I)) {
+ if (minApiLevel >= 14) {
types.add(factory.createType("Landroid/security/KeyChainException;"));
types.add(factory.createType("Landroid/util/NoSuchPropertyException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.I_MR1)) {
+ if (minApiLevel >= 15) {
types.add(factory.createType("Landroid/os/TransactionTooLargeException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.J)) {
+ if (minApiLevel >= 16) {
types.add(factory.createType("Landroid/media/MediaCodec$CryptoException;"));
types.add(factory.createType("Landroid/media/MediaCryptoException;"));
types.add(factory.createType("Landroid/os/OperationCanceledException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.J_MR1)) {
+ if (minApiLevel >= 17) {
types.add(factory.createType("Landroid/view/WindowManager$InvalidDisplayException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.J_MR2)) {
+ if (minApiLevel >= 18) {
types.add(factory.createType("Landroid/media/DeniedByServerException;"));
types.add(factory.createType("Landroid/media/MediaDrmException;"));
types.add(factory.createType("Landroid/media/NotProvisionedException;"));
types.add(factory.createType("Landroid/media/UnsupportedSchemeException;"));
}
- if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.K)) {
+ if (minApiLevel >= 19) {
types.add(factory.createType("Landroid/media/ResourceBusyException;"));
types.add(
factory.createType("Landroid/os/ParcelFileDescriptor$FileDescriptorDetachedException;"));
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index 31d40bb..e0c1cc2 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -261,7 +261,7 @@
return true;
}
AndroidApiLevel nativeMultiDex = AndroidApiLevel.L;
- if (options.minApiLevel.isLessThan(nativeMultiDex)) {
+ if (options.minApiLevel < nativeMultiDex.getLevel()) {
return true;
}
assert options.mainDexKeepRules.isEmpty();
@@ -270,12 +270,13 @@
return true;
}
- private AndroidApiLevel validateOrComputeMinApiLevel(
- AndroidApiLevel computedMinApiLevel, DexReader dexReader) {
+ private int validateOrComputeMinApiLevel(int computedMinApiLevel, DexReader dexReader) {
DexVersion version = dexReader.getDexVersion();
- if (options.minApiLevel == AndroidApiLevel.getDefault()) {
- computedMinApiLevel = computedMinApiLevel.max(AndroidApiLevel.getMinAndroidApiLevel(version));
- } else if (!version.matchesApiLevel(options.minApiLevel)) {
+ if (options.minApiLevel == AndroidApiLevel.getDefault().getLevel()) {
+ computedMinApiLevel = Math
+ .max(computedMinApiLevel, AndroidApiLevel.getMinAndroidApiLevel(version).getLevel());
+ } else if (!version
+ .matchesApiLevel(AndroidApiLevel.getAndroidApiLevel(options.minApiLevel))) {
throw new CompilationError("Dex file with version '" + version.getIntValue() +
"' cannot be used with min sdk level '" + options.minApiLevel + "'.");
}
@@ -339,7 +340,7 @@
}
hasReadProgramResourceFromDex = true;
List<DexParser<DexProgramClass>> dexParsers = new ArrayList<>(dexSources.size());
- AndroidApiLevel computedMinApiLevel = options.minApiLevel;
+ int computedMinApiLevel = options.minApiLevel;
for (ProgramResource input : dexSources) {
DexReader dexReader = new DexReader(input);
if (options.passthroughDexCode) {
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index dc93c37..42bd66b 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -318,7 +318,7 @@
return true;
}
- AndroidApiLevel apiLevel = options.minApiLevel;
+ int apiLevel = options.minApiLevel;
for (DexField field : mapping.getFields()) {
assert field.name.isValidSimpleName(apiLevel);
}
@@ -815,7 +815,8 @@
dest.putBytes(
options.testing.forceDexVersionBytes != null
? options.testing.forceDexVersionBytes
- : DexVersion.getDexVersion(options.minApiLevel).getBytes());
+ : DexVersion.getDexVersion(AndroidApiLevel.getAndroidApiLevel(options.minApiLevel))
+ .getBytes());
dest.putByte(Constants.DEX_FILE_MAGIC_SUFFIX);
// Leave out checksum and signature for now.
dest.moveTo(Constants.FILE_SIZE_OFFSET);
@@ -1098,7 +1099,7 @@
private final Map<DexProgramClass, DexAnnotationDirectory> clazzToAnnotationDirectory
= new HashMap<>();
- private final AndroidApiLevel minApiLevel;
+ private final int minApiLevel;
private static <T> Object2IntMap<T> createObject2IntMap() {
Object2IntMap<T> result = new Object2IntLinkedOpenHashMap<>();
@@ -1147,7 +1148,7 @@
public boolean add(DexAnnotationSet annotationSet) {
// Until we fully drop support for API levels < 17, we have to emit an empty annotation set to
// work around a DALVIK bug. See b/36951668.
- if ((minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.J_MR1)) && annotationSet.isEmpty()) {
+ if ((minApiLevel >= AndroidApiLevel.J_MR1.getLevel()) && annotationSet.isEmpty()) {
return false;
}
return add(annotationSets, annotationSet);
@@ -1299,7 +1300,7 @@
public int getOffsetFor(DexAnnotationSet annotationSet) {
// Until we fully drop support for API levels < 17, we have to emit an empty annotation set to
// work around a DALVIK bug. See b/36951668.
- if ((minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.J_MR1)) && annotationSet.isEmpty()) {
+ if ((minApiLevel >= AndroidApiLevel.J_MR1.getLevel()) && annotationSet.isEmpty()) {
return 0;
}
return lookup(annotationSet, annotationSets);
@@ -1350,7 +1351,7 @@
void setOffsetFor(DexAnnotationSet annotationSet, int offset) {
// Until we fully drop support for API levels < 17, we have to emit an empty annotation set to
// work around a DALVIK bug. See b/36951668.
- assert (minApiLevel.isLessThan(AndroidApiLevel.J_MR1)) || !annotationSet.isEmpty();
+ assert (minApiLevel < AndroidApiLevel.J_MR1.getLevel()) || !annotationSet.isEmpty();
setOffsetFor(annotationSet, offset, annotationSets);
}
diff --git a/src/main/java/com/android/tools/r8/graph/DexString.java b/src/main/java/com/android/tools/r8/graph/DexString.java
index 87630f2..ba4d653 100644
--- a/src/main/java/com/android/tools/r8/graph/DexString.java
+++ b/src/main/java/com/android/tools/r8/graph/DexString.java
@@ -399,9 +399,9 @@
}
}
- public static boolean isValidSimpleName(AndroidApiLevel apiLevel, String string) {
+ public static boolean isValidSimpleName(int apiLevel, String string) {
// space characters are not allowed prior to Android R
- if (apiLevel.isLessThan(AndroidApiLevel.R)) {
+ if (apiLevel < AndroidApiLevel.R.getLevel()) {
int cp;
for (int i = 0; i < string.length(); ) {
cp = string.codePointAt(i);
@@ -414,9 +414,9 @@
return true;
}
- public boolean isValidSimpleName(AndroidApiLevel apiLevel) {
+ public boolean isValidSimpleName(int apiLevel) {
// space characters are not allowed prior to Android R
- if (apiLevel.isLessThan(AndroidApiLevel.R)) {
+ if (apiLevel < AndroidApiLevel.R.getLevel()) {
try {
return isValidSimpleName(apiLevel, decode());
} catch (UTFDataFormatException e) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index e258037..cc28692 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -165,19 +165,19 @@
DexItemFactory factory = options.itemFactory;
- if (options.minApiLevel.isLessThan(AndroidApiLevel.K)) {
+ if (options.minApiLevel < AndroidApiLevel.K.getLevel()) {
initializeAndroidKMethodProviders(factory);
}
- if (options.minApiLevel.isLessThan(AndroidApiLevel.N)) {
+ if (options.minApiLevel < AndroidApiLevel.N.getLevel()) {
initializeAndroidNMethodProviders(factory);
}
- if (options.minApiLevel.isLessThan(AndroidApiLevel.O)) {
+ if (options.minApiLevel < AndroidApiLevel.O.getLevel()) {
initializeAndroidOMethodProviders(factory);
}
- if (options.minApiLevel.isLessThan(AndroidApiLevel.R)) {
+ if (options.minApiLevel < AndroidApiLevel.R.getLevel()) {
initializeAndroidRMethodProviders(factory);
}
- if (options.minApiLevel.isLessThan(AndroidApiLevel.S)) {
+ if (options.minApiLevel < AndroidApiLevel.S.getLevel()) {
initializeAndroidSMethodProviders(factory);
}
@@ -186,13 +186,13 @@
// libraries or natively. If Optional/Stream class is not present, we do not desugar to
// avoid confusion in error messages.
if (appView.rewritePrefix.hasRewrittenType(factory.optionalType, appView)
- || options.minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.N)) {
+ || options.minApiLevel >= AndroidApiLevel.N.getLevel()) {
initializeJava9OptionalMethodProviders(factory);
initializeJava10OptionalMethodProviders(factory);
initializeJava11OptionalMethodProviders(factory);
}
if (appView.rewritePrefix.hasRewrittenType(factory.streamType, appView)
- || options.minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.N)) {
+ || options.minApiLevel >= AndroidApiLevel.N.getLevel()) {
initializeStreamMethodProviders(factory);
}
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java
index 8ac5e71..ccc2ef7 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapSupplier.java
@@ -93,7 +93,7 @@
+ Version.LABEL
+ "\n");
if (options.isGeneratingDex()) {
- builder.append("# " + MARKER_KEY_MIN_API + ": " + options.minApiLevel.getLevel() + "\n");
+ builder.append("# " + MARKER_KEY_MIN_API + ": " + options.minApiLevel + "\n");
}
if (Version.isDevelopmentVersion()) {
builder.append(
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 d902793..523552a 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
@@ -64,10 +64,6 @@
return AndroidApiLevel.B;
}
- public AndroidApiLevel max(AndroidApiLevel other) {
- return Ordered.max(this, other);
- }
-
public DexVersion getDexVersion() {
return DexVersion.getDexVersion(this);
}
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 930b877..12126a4 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -383,7 +383,7 @@
// since the output depends on the min API in this case. There is basically no min API entry
// in R8 cf to cf.
if (isGeneratingDex() || desugarState == DesugarState.ON) {
- marker.setMinApi(minApiLevel.getLevel());
+ marker.setMinApi(minApiLevel);
}
if (desugaredLibraryConfiguration.getIdentifier() != null) {
marker.setDesugaredLibraryIdentifiers(desugaredLibraryConfiguration.getIdentifier());
@@ -526,7 +526,7 @@
getExtensiveInterfaceMethodMinifierLoggingFilter();
public List<String> methodsFilter = ImmutableList.of();
- public AndroidApiLevel minApiLevel = AndroidApiLevel.getDefault();
+ public int minApiLevel = AndroidApiLevel.getDefault().getLevel();
// Skipping min_api check and compiling an intermediate result intended for later merging.
// Intermediate builds also emits or update synthesized classes mapping.
public boolean intermediate = false;
@@ -1505,7 +1505,7 @@
}
private boolean hasMinApi(AndroidApiLevel level) {
- return minApiLevel.isGreaterThanOrEqualTo(level);
+ return minApiLevel >= level.getLevel();
}
/**
@@ -1588,7 +1588,7 @@
// the highest known API level when the compiler is built. This ensures that when this is used
// by the Android Platform build (which normally use an API level of 10000) there will be
// no rewriting of backported methods. See b/147480264.
- return desugarState.isOn() && minApiLevel.isLessThanOrEqualTo(AndroidApiLevel.LATEST);
+ return desugarState.isOn() && minApiLevel <= AndroidApiLevel.LATEST.getLevel();
}
public boolean enableTryWithResourcesDesugaring() {
@@ -1690,7 +1690,7 @@
// being thrown on out of bounds.
public boolean canUseSameArrayAndResultRegisterInArrayGetWide() {
assert isGeneratingDex();
- return minApiLevel.isGreaterThan(AndroidApiLevel.O_MR1);
+ return minApiLevel > AndroidApiLevel.O_MR1.getLevel();
}
// Some Lollipop versions of Art found in the wild perform invalid bounds
@@ -1707,7 +1707,7 @@
//
// See b/69364976 and b/77996377.
public boolean canHaveBoundsCheckEliminationBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.M);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.M.getLevel();
}
// MediaTek JIT compilers for KitKat phones did not implement the not
@@ -1723,7 +1723,7 @@
// assumed to not change. If the receiver register is reused for something else the verifier
// will fail and the code will not run.
public boolean canHaveThisTypeVerifierBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.M);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.M.getLevel();
}
// Art crashes if we do dead reference elimination of the receiver in release mode and Art
@@ -1732,13 +1732,13 @@
//
// See b/116683601 and b/116837585.
public boolean canHaveThisJitCodeDebuggingBug() {
- return minApiLevel.isLessThan(AndroidApiLevel.Q);
+ return minApiLevel < AndroidApiLevel.Q.getLevel();
}
// The dalvik jit had a bug where the long operations add, sub, or, xor and and would write
// the first part of the result long before reading the second part of the input longs.
public boolean canHaveOverlappingLongRegisterBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.L);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.L.getLevel();
}
// Some dalvik versions found in the wild perform invalid JIT compilation of cmp-long
@@ -1771,7 +1771,7 @@
//
// See b/75408029.
public boolean canHaveCmpLongBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.L);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.L.getLevel();
}
// Some Lollipop VMs crash if there is a const instruction between a cmp and an if instruction.
@@ -1799,7 +1799,7 @@
//
// See b/115552239.
public boolean canHaveCmpIfFloatBug() {
- return minApiLevel.isLessThan(AndroidApiLevel.M);
+ return minApiLevel < AndroidApiLevel.M.getLevel();
}
// Some Lollipop VMs incorrectly optimize code with mul2addr instructions. In particular,
@@ -1821,7 +1821,7 @@
//
// This issue has only been observed on a Verizon Ellipsis 8 tablet. See b/76115465.
public boolean canHaveMul2AddrBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.M);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.M.getLevel();
}
// Some Marshmallow VMs create an incorrect doubly-linked list of instructions. When the VM
@@ -1830,7 +1830,7 @@
//
// See b/77842465.
public boolean canHaveDex2OatLinkedListBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.N);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.N.getLevel();
}
// dex2oat on Marshmallow VMs does aggressive inlining which can eat up all the memory on
@@ -1838,7 +1838,7 @@
//
// See b/111960171
public boolean canHaveDex2OatInliningIssue() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.N);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.N.getLevel();
}
// Art 7.0.0 and later Art JIT may perform an invalid optimization if a string new-instance does
@@ -1846,7 +1846,7 @@
//
// See b/78493232 and b/80118070.
public boolean canHaveArtStringNewInitBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.Q);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.Q.getLevel();
}
// Dalvik tracing JIT may perform invalid optimizations when int/float values are converted to
@@ -1854,7 +1854,7 @@
//
// See b/77496850.
public boolean canHaveNumberConversionRegisterAllocationBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.L);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.L.getLevel();
}
// Some Lollipop mediatek VMs have a peculiar bug where the inliner crashes if there is a
@@ -1867,7 +1867,7 @@
//
// See b/68378480.
public boolean canHaveForwardingInitInliningBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.M);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.M.getLevel();
}
// Some Lollipop x86_64 VMs have a bug causing a segfault if an exception handler directly targets
@@ -1879,7 +1879,7 @@
//
// See b/111337896.
public boolean canHaveExceptionTargetingLoopHeaderBug() {
- return isGeneratingDex() && !debug && minApiLevel.isLessThan(AndroidApiLevel.M);
+ return isGeneratingDex() && !debug && minApiLevel < AndroidApiLevel.M.getLevel();
}
// The Dalvik tracing JIT can trace past the end of the instruction stream and end up
@@ -1894,7 +1894,7 @@
// We also could not insert any dead code (e.g. a return) because that would make mediatek
// dominator calculations on 7.0.0 crash. See b/128926846.
public boolean canHaveTracingPastInstructionsStreamBug() {
- return minApiLevel.isLessThan(AndroidApiLevel.L);
+ return minApiLevel < AndroidApiLevel.L.getLevel();
}
// The art verifier incorrectly propagates type information for the following pattern:
@@ -1922,7 +1922,7 @@
// Fixed in Android Q, see b/120985556.
public boolean canHaveArtInstanceOfVerifierBug() {
assert isGeneratingDex();
- return minApiLevel.isLessThan(AndroidApiLevel.Q);
+ return minApiLevel < AndroidApiLevel.Q.getLevel();
}
// Some Art Lollipop version do not deal correctly with long-to-int conversions.
@@ -1945,7 +1945,7 @@
public boolean canHaveLongToIntBug() {
// We have only seen this happening on Lollipop arm64 backends. We have tested on
// Marshmallow and Nougat arm64 devices and they do not have the bug.
- return minApiLevel.isLessThan(AndroidApiLevel.M);
+ return minApiLevel < AndroidApiLevel.M.getLevel();
}
// The Art VM for Android N through P has a bug in the JIT that means that if the same
@@ -1958,7 +1958,7 @@
//
// See b/120164595.
public boolean canHaveExceptionTypeBug() {
- return minApiLevel.isLessThan(AndroidApiLevel.Q);
+ return minApiLevel < AndroidApiLevel.Q.getLevel();
}
// Art 4.0.4 fails with a verification error when a null-literal is being passed directly to an
@@ -1966,7 +1966,7 @@
// elimination of check-cast instructions where the value being cast is the constant null.
// See b/123269162.
public boolean canHaveArtCheckCastVerifierBug() {
- return minApiLevel.isLessThan(AndroidApiLevel.J);
+ return minApiLevel < AndroidApiLevel.J.getLevel();
}
// The verifier will merge A[] and B[] to Object[], even when both A and B implement an interface
@@ -1990,7 +1990,7 @@
//
// See b/131349148
public boolean canHaveDalvikCatchHandlerVerificationBug() {
- return isGeneratingClassFiles() || minApiLevel.isLessThan(AndroidApiLevel.L);
+ return isGeneratingClassFiles() || minApiLevel < AndroidApiLevel.L.getLevel();
}
// Having an invoke instruction that targets an abstract method on a non-abstract class will fail
@@ -1998,7 +1998,7 @@
//
// See b/132953944.
public boolean canHaveDalvikAbstractMethodOnNonAbstractClassVerificationBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.L);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.L.getLevel();
}
// On dalvik we see issues when using an int value in places where a boolean, byte, char, or short
@@ -2012,14 +2012,14 @@
//
// See also b/134304597 and b/124152497.
public boolean canHaveDalvikIntUsedAsNonIntPrimitiveTypeBug() {
- return isGeneratingClassFiles() || minApiLevel.isLessThan(AndroidApiLevel.L);
+ return isGeneratingClassFiles() || minApiLevel < AndroidApiLevel.L.getLevel();
}
// The standard library prior to API 19 did not contain a ZipFile that implemented Closable.
//
// See b/177532008.
public boolean canHaveZipFileWithMissingCloseableBug() {
- return isGeneratingClassFiles() || minApiLevel.isLessThan(AndroidApiLevel.K);
+ return isGeneratingClassFiles() || minApiLevel < AndroidApiLevel.K.getLevel();
}
// Some versions of Dalvik had a bug where a switch with a MAX_INT key would still go to
@@ -2027,7 +2027,7 @@
//
// See b/177790310.
public boolean canHaveSwitchMaxIntBug() {
- return isGeneratingDex() && minApiLevel.isLessThan(AndroidApiLevel.K);
+ return isGeneratingDex() && minApiLevel < AndroidApiLevel.K.getLevel();
}
// On Dalvik the methods Integer.parseInt and Long.parseLong does not support strings with a '+'
@@ -2035,6 +2035,6 @@
//
// See b/182137865.
public boolean canParseNumbersWithPlusPrefix() {
- return minApiLevel.isLessThan(AndroidApiLevel.K);
+ return minApiLevel > AndroidApiLevel.K.getLevel();
}
}
diff --git a/src/test/java/com/android/tools/r8/AsmTestBase.java b/src/test/java/com/android/tools/r8/AsmTestBase.java
index a3d5cf6..a8b8a49 100644
--- a/src/test/java/com/android/tools/r8/AsmTestBase.java
+++ b/src/test/java/com/android/tools/r8/AsmTestBase.java
@@ -29,7 +29,7 @@
protected void ensureSameOutput(String main, AndroidApiLevel apiLevel,
List<String> args, byte[]... classes) throws Exception {
AndroidApp app = buildAndroidApp(classes);
- Consumer<InternalOptions> setMinApiLevel = o -> o.minApiLevel = apiLevel;
+ Consumer<InternalOptions> setMinApiLevel = o -> o.minApiLevel = apiLevel.getLevel();
ProcessResult javaResult = runOnJavaRaw(main, Arrays.asList(classes), args);
Consumer<ArtCommandBuilder> cmdBuilder = builder -> {
for (String arg : args) {
diff --git a/src/test/java/com/android/tools/r8/debug/DoNotCrashOnAccessToThisRunner.java b/src/test/java/com/android/tools/r8/debug/DoNotCrashOnAccessToThisRunner.java
index 2363533..3e562cf 100644
--- a/src/test/java/com/android/tools/r8/debug/DoNotCrashOnAccessToThisRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/DoNotCrashOnAccessToThisRunner.java
@@ -27,19 +27,17 @@
DelayedDebugTestConfig cf =
temp -> new CfDebugTestConfig().addPaths(ToolHelper.getClassPathForTests());
DelayedDebugTestConfig d8 =
- temp ->
- new D8DebugTestConfig()
- .compileAndAdd(
- temp,
- ImmutableList.of(ToolHelper.getClassFileForTestClass(CLASS)),
- options -> {
- // Release mode so receiver can be clobbered.
- options.debug = false;
- // Api level M so that the workarounds for Lollipop verifier doesn't
- // block the receiver register. We want to check b/116683601 which
- // happens on at least 7.0.0.
- options.minApiLevel = AndroidApiLevel.M;
- });
+ temp -> new D8DebugTestConfig().compileAndAdd(
+ temp,
+ ImmutableList.of(ToolHelper.getClassFileForTestClass(CLASS)),
+ options -> {
+ // Release mode so receiver can be clobbered.
+ options.debug = false;
+ // Api level M so that the workarounds for Lollipop verifier doesn't
+ // block the receiver register. We want to check b/116683601 which
+ // happens on at least 7.0.0.
+ options.minApiLevel = AndroidApiLevel.M.getLevel();
+ });
return ImmutableList.of(new Object[]{"CF", cf}, new Object[]{"D8", d8});
}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java b/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java
index 5cfc6cd..8096c47 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java
@@ -39,7 +39,7 @@
// android.jar for that level.
CodeInspector inspector = new CodeInspector(ToolHelper.getAndroidJar(apiLevel));
InternalOptions options = new InternalOptions();
- options.minApiLevel = apiLevel;
+ options.minApiLevel = apiLevel.getLevel();
List<DexMethod> backportedMethods =
BackportedMethodRewriter.generateListOfBackportedMethods(
AndroidApp.builder().build(), options, ThreadUtils.getExecutorService(options));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/TrivialArrayCheckCastTest.java b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/TrivialArrayCheckCastTest.java
index b4d7969..8cf8b26 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/TrivialArrayCheckCastTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/TrivialArrayCheckCastTest.java
@@ -27,7 +27,7 @@
testForJvm().addTestClasspath().run(TestClass.class).assertSuccessWithOutput(expectedOutput);
InternalOptions options = new InternalOptions();
- options.minApiLevel = AndroidApiLevel.I_MR1;
+ options.minApiLevel = AndroidApiLevel.I_MR1.getLevel();
assert options.canHaveArtCheckCastVerifierBug();
testForR8(Backend.DEX)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/ZipFileInstanceOfAutoCloseableTest.java b/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/ZipFileInstanceOfAutoCloseableTest.java
index 14d84e7..b15cca9 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/ZipFileInstanceOfAutoCloseableTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/ZipFileInstanceOfAutoCloseableTest.java
@@ -103,7 +103,7 @@
assumeTrue(parameters.isDexRuntime());
// Set the min API and create the raw app.
InternalOptions options = new InternalOptions();
- options.minApiLevel = parameters.getApiLevel();
+ options.minApiLevel = parameters.getApiLevel().getLevel();
DirectMappedDexApplication application =
new ApplicationReader(
AndroidApp.builder()
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 0005549..a01f7dc 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -812,7 +812,7 @@
Timing timing = Timing.empty();
InternalOptions options =
new InternalOptions(new DexItemFactory(), new Reporter(diagnosticsHandler));
- options.minApiLevel = AndroidApiLevel.getAndroidApiLevel(minApi);
+ options.minApiLevel = minApi;
options.intermediate = intermediate;
DexItemFactory factory = options.itemFactory;
AppView<?> appView = AppView.createForR8(DexApplication.builder(options, timing).build());
diff --git a/src/test/java/com/android/tools/r8/regress/b69906048/Regress69906048Test.java b/src/test/java/com/android/tools/r8/regress/b69906048/Regress69906048Test.java
index bb1fed9..06c0ca4 100644
--- a/src/test/java/com/android/tools/r8/regress/b69906048/Regress69906048Test.java
+++ b/src/test/java/com/android/tools/r8/regress/b69906048/Regress69906048Test.java
@@ -15,16 +15,15 @@
@Test
public void buildWithD8AndRunWithDalvikOrArt() throws Exception {
- AndroidApp androidApp =
- ToolHelper.runR8(
- ToolHelper.prepareR8CommandBuilder(
- readClasses(ClassWithAnnotations.class, AnAnnotation.class))
- .setDisableTreeShaking(true)
- .setDisableMinification(true)
- .addProguardConfiguration(
- ImmutableList.of("-keepattributes *Annotation*"), Origin.unknown())
- .build(),
- options -> options.minApiLevel = ToolHelper.getMinApiLevelForDexVm());
+ AndroidApp androidApp = ToolHelper.runR8(
+ ToolHelper.prepareR8CommandBuilder(
+ readClasses(ClassWithAnnotations.class, AnAnnotation.class))
+ .setDisableTreeShaking(true)
+ .setDisableMinification(true)
+ .addProguardConfiguration(
+ ImmutableList.of("-keepattributes *Annotation*"), Origin.unknown())
+ .build(),
+ options -> options.minApiLevel = ToolHelper.getMinApiLevelForDexVm().getLevel());
String result = runOnArt(androidApp, ClassWithAnnotations.class);
Assert.assertEquals("@" + AnAnnotation.class.getCanonicalName() + "()", result);
}
diff --git a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
index 03efc25..f3ab264 100644
--- a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
+++ b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
@@ -456,10 +456,10 @@
throws Exception {
AndroidApp app = readClasses(Path.class, Log.class, testClass);
if (compiler == Tool.D8) {
- app = compileWithD8(app, o -> o.minApiLevel = apiLevel);
+ app = compileWithD8(app, o -> o.minApiLevel = apiLevel.getLevel());
} else {
assert compiler == Tool.R8;
- app = compileWithR8(app, "-keep class * { *; }", o -> o.minApiLevel = apiLevel);
+ app = compileWithR8(app, "-keep class * { *; }", o -> o.minApiLevel = apiLevel.getLevel());
}
checkPathParserMethods(app, testClass, a, b);
}
@@ -479,10 +479,10 @@
throws Exception {
AndroidApp app = readClasses(testClass);
if (compiler == Tool.D8) {
- app = compileWithD8(app, o -> o.minApiLevel = apiLevel);
+ app = compileWithD8(app, o -> o.minApiLevel = apiLevel.getLevel());
} else {
assert compiler == Tool.R8;
- app = compileWithR8(app, "-keep class * { *; }", o -> o.minApiLevel = apiLevel);
+ app = compileWithR8(app, "-keep class * { *; }", o -> o.minApiLevel = apiLevel.getLevel());
}
CodeInspector inspector = new CodeInspector(app);
DexItemFactory factory = inspector.getFactory();
diff --git a/src/test/java/com/android/tools/r8/utils/Smali.java b/src/test/java/com/android/tools/r8/utils/Smali.java
index d698e0b..eb269c1 100644
--- a/src/test/java/com/android/tools/r8/utils/Smali.java
+++ b/src/test/java/com/android/tools/r8/utils/Smali.java
@@ -108,7 +108,7 @@
SingleFileConsumer consumer = new SingleFileConsumer();
AndroidApp app = AndroidApp.builder().addDexProgramData(data, Origin.unknown()).build();
InternalOptions options = new InternalOptions();
- options.minApiLevel = AndroidApiLevel.getAndroidApiLevel(apiLevel);
+ options.minApiLevel = apiLevel;
options.programConsumer = consumer;
ExecutorService executor = ThreadUtils.getExecutorService(1);
try {