[ApiModel] Update api database to be api level 34 (preview)
Bug: b/267957385
Change-Id: Ia35d9a84bbbb1da112ad95f23b2649e6b4e6016e
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelCompute.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelCompute.java
index 35eb379..fb97359 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelCompute.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelCompute.java
@@ -19,7 +19,7 @@
private final KnownApiLevel[] knownApiLevelCache;
public AndroidApiLevelCompute() {
- knownApiLevelCache = new KnownApiLevel[AndroidApiLevel.LATEST.getLevel() + 1];
+ knownApiLevelCache = new KnownApiLevel[AndroidApiLevel.API_DATABASE_LEVEL.getLevel() + 1];
for (AndroidApiLevel value : AndroidApiLevel.values()) {
if (value != AndroidApiLevel.ANDROID_PLATFORM && value != AndroidApiLevel.MASTER) {
knownApiLevelCache[value.getLevel()] = new KnownApiLevel(value);
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 69c9714..5be322e 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
@@ -43,14 +43,17 @@
S(31),
Sv2(32),
T(33),
- MASTER(34), // API level for master is tentative.
+ U(34),
+ MASTER(35), // API level for master is tentative.
ANDROID_PLATFORM(10000);
// 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.
- // TODO(b/204738868): Update API database for Sv2 / T when they are ready.
public static final AndroidApiLevel LATEST = T;
+ // TODO(b/268601605): When adding U to the test matrix, set this to LATEST.
+ public static final AndroidApiLevel API_DATABASE_LEVEL = U;
+
private final int level;
AndroidApiLevel(int level) {
@@ -174,6 +177,8 @@
case 33:
return T;
case 34:
+ return U;
+ case 35:
return MASTER;
case 10000:
return ANDROID_PLATFORM;
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
index 423850e..b8d3f1f 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
@@ -143,6 +143,7 @@
Map<DexReference, AndroidApiLevel> referenceMap,
Path androidJar) {
Map<DexType, String> missingMemberInformation = new IdentityHashMap<>();
+ DexItemFactory factory = appView.dexItemFactory();
for (DexLibraryClass clazz : appView.app().asDirect().libraryClasses()) {
ParsedApiClass parsedApiClass = lookupMap.get(clazz.getClassReference());
if (parsedApiClass == null) {
@@ -168,7 +169,7 @@
method -> {
if (method.getAccessFlags().isPublic()
&& referenceMap.get(method.getReference()) == null
- && !appView.dexItemFactory().objectMembers.isObjectMember(method.getReference())) {
+ && !factory.objectMembers.isObjectMember(method.getReference())) {
classBuilder.append(" ").append(method).append(" is missing\n");
}
});
@@ -177,22 +178,30 @@
}
}
+ Set<DexType> expectedMissingMembers = new HashSet<>();
// api-versions.xml do not encode all members of StringBuffers and StringBuilders, check that we
// only have missing definitions for those two classes.
- assert missingMemberInformation.size() == 7;
- assert missingMemberInformation.containsKey(appView.dexItemFactory().stringBufferType);
- assert missingMemberInformation.containsKey(appView.dexItemFactory().stringBuilderType);
+ expectedMissingMembers.add(factory.stringBufferType);
+ expectedMissingMembers.add(factory.stringBuilderType);
// TODO(b/231126636): api-versions.xml has missing definitions for the below classes.
- assert missingMemberInformation.containsKey(
- appView.dexItemFactory().createType("Ljava/util/concurrent/ConcurrentHashMap$KeySetView;"));
- assert missingMemberInformation.containsKey(
- appView.dexItemFactory().createType("Ljava/time/chrono/ThaiBuddhistDate;"));
- assert missingMemberInformation.containsKey(
- appView.dexItemFactory().createType("Ljava/time/chrono/HijrahDate;"));
- assert missingMemberInformation.containsKey(
- appView.dexItemFactory().createType("Ljava/time/chrono/JapaneseDate;"));
- assert missingMemberInformation.containsKey(
- appView.dexItemFactory().createType("Ljava/time/chrono/MinguoDate;"));
+ expectedMissingMembers.add(
+ factory.createType("Ljava/util/concurrent/ConcurrentHashMap$KeySetView;"));
+ expectedMissingMembers.add(factory.createType("Ljava/time/chrono/ThaiBuddhistDate;"));
+ expectedMissingMembers.add(factory.createType("Ljava/time/chrono/HijrahDate;"));
+ expectedMissingMembers.add(factory.createType("Ljava/time/chrono/JapaneseDate;"));
+ expectedMissingMembers.add(factory.createType("Ljava/time/chrono/MinguoDate;"));
+ expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcV;"));
+ expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/IsoDep;"));
+ expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/MifareUltralight;"));
+ expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/MifareClassic;"));
+ expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NdefFormatable;"));
+ expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcA;"));
+ expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcBarcode;"));
+ expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcF;"));
+ expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcB;"));
+ expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/Ndef;"));
+ expectedMissingMembers.add(factory.createType("Landroid/webkit/CookieSyncManager;"));
+ assertEquals(expectedMissingMembers, missingMemberInformation.keySet());
return true;
}
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
index 29c9709..285d96a 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
@@ -19,6 +19,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.IntBox;
import com.android.tools.r8.utils.InternalOptions;
@@ -46,7 +47,7 @@
.resolve("new_api_database.ser");
// Update the API_LEVEL below to have the database generated for a new api level.
- private static final AndroidApiLevel API_LEVEL = AndroidApiLevel.LATEST;
+ private static final AndroidApiLevel API_LEVEL = AndroidApiLevel.API_DATABASE_LEVEL;
@Parameters(name = "{0}")
public static TestParametersCollection data() {
@@ -94,18 +95,16 @@
parsedApiClasses.forEach(
apiClass -> {
apiClass.visitFieldReferences(
- ((apiLevel, fieldReferences) -> {
- fieldReferences.forEach(field -> numberOfFields.increment());
- }));
+ ((apiLevel, fieldReferences) ->
+ fieldReferences.forEach(field -> numberOfFields.increment())));
apiClass.visitMethodReferences(
- ((apiLevel, methodReferences) -> {
- methodReferences.forEach(field -> numberOfMethods.increment());
- }));
+ ((AndroidApiLevel apiLevel, List<MethodReference> methodReferences) ->
+ methodReferences.forEach(field -> numberOfMethods.increment())));
});
// These numbers will change when updating api-versions.xml
- assertEquals(5272, parsedApiClasses.size());
- assertEquals(27868, numberOfFields.get());
- assertEquals(42268, numberOfMethods.get());
+ assertEquals(5635, parsedApiClasses.size());
+ assertEquals(29017, numberOfFields.get());
+ assertEquals(44107, numberOfMethods.get());
}
@Test
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
index 97f6cd0..9f80832 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
@@ -19,9 +19,11 @@
import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.TreeMap;
import java.util.function.BiConsumer;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -48,11 +50,20 @@
return parsedApiClass;
}
+ private Set<String> getDeletedTypesMissingRemovedAttribute() {
+ Set<String> removedTypeNames = new HashSet<>();
+ if (maxApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.U)) {
+ removedTypeNames.add("com.android.internal.util.Predicate");
+ }
+ return removedTypeNames;
+ }
+
private void readApiVersionsXmlFile() throws Exception {
CodeInspector inspector = new CodeInspector(ToolHelper.getAndroidJar(maxApiLevel));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document document = factory.newDocumentBuilder().parse(apiVersionsXml);
NodeList classes = document.getElementsByTagName("class");
+ Set<String> exemptionList = getDeletedTypesMissingRemovedAttribute();
for (int i = 0; i < classes.getLength(); i++) {
Node node = classes.item(i);
assert node.getNodeType() == Node.ELEMENT_NODE;
@@ -61,9 +72,10 @@
ClassSubject clazz = inspector.clazz(type);
if (!clazz.isPresent()) {
if (!clazz.getOriginalName().startsWith("android.test")
- && !clazz.getOriginalName().startsWith("junit")) {
- assert hasRemoved(node);
- assert getRemoved(node).isLessThanOrEqualTo(maxApiLevel);
+ && !clazz.getOriginalName().startsWith("junit")
+ && node.getAttributes().getNamedItem("module") == null) {
+ assert exemptionList.contains(type) || hasRemoved(node);
+ assert exemptionList.contains(type) || getRemoved(node).isLessThanOrEqualTo(maxApiLevel);
}
continue;
}
diff --git a/third_party/api_database/api_database.tar.gz.sha1 b/third_party/api_database/api_database.tar.gz.sha1
index 275471b..9883fe5 100644
--- a/third_party/api_database/api_database.tar.gz.sha1
+++ b/third_party/api_database/api_database.tar.gz.sha1
@@ -1 +1 @@
-f081c538df68649432fa8e45ec511d43d5548396
\ No newline at end of file
+29b5c8dfdccf33e7a540d5de29476805a7d5c2f0
\ No newline at end of file