Update support for API level 36
* Update Android SDK 36 files to revision 1 (from preview revision 5)
* Update API database based on Android SDK 36 revision 1
Bug: b/406171119
Change-Id: I92c83edd4088425f96cac03d0d9baffe61be81cc
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelDatabaseHelper.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelDatabaseHelper.java
index e4222dd..33de95e 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelDatabaseHelper.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelDatabaseHelper.java
@@ -23,11 +23,10 @@
notModeledTypes.add("android.annotation.Nullable");
notModeledTypes.add("android.annotation.NonNull");
notModeledTypes.add("android.annotation.FlaggedApi");
- notModeledTypes.add("android.adservices.customaudience.PartialCustomAudience");
- notModeledTypes.add("android.adservices.customaudience.PartialCustomAudience$Builder");
notModeledTypes.add(
- "android.adservices.customaudience.ScheduleCustomAudienceUpdateRequest$Builder");
- notModeledTypes.add("android.adservices.customaudience.ScheduleCustomAudienceUpdateRequest");
+ "android.adservices.ondevicepersonalization.FederatedComputeScheduleRequest");
+ notModeledTypes.add(
+ "android.adservices.ondevicepersonalization.FederatedComputeScheduleResponse");
return notModeledTypes;
}
@@ -36,6 +35,17 @@
Set<String> notModeledFields = new HashSet<>();
notModeledFields.add("int android.app.appsearch.AppSearchResult.RESULT_DENIED");
notModeledFields.add("int android.app.appsearch.AppSearchResult.RESULT_RATE_LIMITED");
+
+ notModeledFields.add(
+ "int android.adservices.adselection.ReportEventRequest.FLAG_REPORTING_DESTINATION_COMPONENT_SELLER");
+ notModeledFields.add(
+ "int android.adservices.ondevicepersonalization.OnDevicePersonalizationManager.FEATURE_DISABLED");
+ notModeledFields.add(
+ "int android.adservices.ondevicepersonalization.OnDevicePersonalizationManager.FEATURE_ENABLED");
+ notModeledFields.add(
+ "int android.adservices.ondevicepersonalization.OnDevicePersonalizationManager.FEATURE_UNSUPPORTED");
+ notModeledFields.add(
+ "int android.adservices.ondevicepersonalization.InferenceInput$Params.MODEL_TYPE_EXECUTORCH");
return notModeledFields;
}
@@ -46,6 +56,29 @@
"void android.adservices.customaudience.CustomAudienceManager.scheduleCustomAudienceUpdate(android.adservices.customaudience.ScheduleCustomAudienceUpdateRequest,"
+ " java.util.concurrent.Executor,"
+ " android.adservices.common.AdServicesOutcomeReceiver)");
+ notModelledMethods.add(
+ "android.adservices.ondevicepersonalization.InferenceOutput$Builder"
+ + " android.adservices.ondevicepersonalization.InferenceOutput$Builder.setData(byte[])");
+ notModelledMethods.add(
+ "android.adservices.common.AdTechIdentifier"
+ + " android.adservices.adselection.AdSelectionOutcome.getWinningSeller()");
+ notModelledMethods.add(
+ "void android.adservices.ondevicepersonalization.FederatedComputeScheduler.schedule(android.adservices.ondevicepersonalization.FederatedComputeScheduleRequest,"
+ + " java.util.concurrent.Executor, android.os.OutcomeReceiver)");
+
+ notModelledMethods.add(
+ "byte[] android.adservices.ondevicepersonalization.InferenceOutput.getData()");
+ notModelledMethods.add(
+ "byte[] android.adservices.ondevicepersonalization.InferenceInput.getData()");
+ notModelledMethods.add(
+ "void android.adservices.ondevicepersonalization.OnDevicePersonalizationManager.queryFeatureAvailability(java.lang.String,"
+ + " java.util.concurrent.Executor, android.os.OutcomeReceiver)");
+ notModelledMethods.add(
+ "void android.adservices.ondevicepersonalization.InferenceInput$Builder.<init>(android.adservices.ondevicepersonalization.InferenceInput$Params,"
+ + " byte[])");
+ notModelledMethods.add(
+ "android.adservices.ondevicepersonalization.InferenceInput$Builder"
+ + " android.adservices.ondevicepersonalization.InferenceInput$Builder.setInputData(byte[])");
return notModelledMethods;
}
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 9325826..8f0b88a 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
@@ -200,6 +200,32 @@
expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/NfcB;"));
expectedMissingMembers.add(factory.createType("Landroid/nfc/tech/Ndef;"));
expectedMissingMembers.add(factory.createType("Landroid/webkit/CookieSyncManager;"));
+ expectedMissingMembers.add(
+ factory.createType("Landroid/adservices/adselection/AdSelectionOutcome;"));
+ expectedMissingMembers.add(
+ factory.createType("Landroid/adservices/adselection/ReportEventRequest;"));
+ expectedMissingMembers.add(
+ factory.createType(
+ "Landroid/adservices/ondevicepersonalization/FederatedComputeScheduleRequest;"));
+ expectedMissingMembers.add(
+ factory.createType(
+ "Landroid/adservices/ondevicepersonalization/FederatedComputeScheduleResponse;"));
+ expectedMissingMembers.add(
+ factory.createType(
+ "Landroid/adservices/ondevicepersonalization/FederatedComputeScheduler;"));
+ expectedMissingMembers.add(
+ factory.createType("Landroid/adservices/ondevicepersonalization/InferenceInput;"));
+ expectedMissingMembers.add(
+ factory.createType("Landroid/adservices/ondevicepersonalization/InferenceInput$Builder;"));
+ expectedMissingMembers.add(
+ factory.createType("Landroid/adservices/ondevicepersonalization/InferenceInput$Params;"));
+ expectedMissingMembers.add(
+ factory.createType("Landroid/adservices/ondevicepersonalization/InferenceOutput;"));
+ expectedMissingMembers.add(
+ factory.createType("Landroid/adservices/ondevicepersonalization/InferenceOutput$Builder;"));
+ expectedMissingMembers.add(
+ factory.createType(
+ "Landroid/adservices/ondevicepersonalization/OnDevicePersonalizationManager;"));
assertEquals(
expectedMissingMembers.stream()
.map(DexType::toDescriptorString)
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 6cbb86e..1e496fe 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
@@ -127,8 +127,8 @@
});
// These numbers will change when updating api-versions.xml
assertEquals(6222, parsedApiClasses.size());
- assertEquals(31430, numberOfFields.get());
- assertEquals(48025, numberOfMethods.get());
+ assertEquals(31431, numberOfFields.get());
+ assertEquals(48028, numberOfMethods.get());
}
private static String sampleVersion4ApiVersionsXml =
@@ -290,10 +290,16 @@
Set<String> notModeledFields = notModeledFields();
Set<String> notModeledMethods = notModeledMethods();
for (DexLibraryClass clazz : appView.app().asDirect().libraryClasses()) {
- if (notModeledTypes.contains(clazz.getClassReference().getTypeName())) {
+ String typeName = clazz.getClassReference().getTypeName();
+ if (notModeledTypes.contains(typeName)) {
+ notModeledTypes.remove(typeName);
continue;
}
assertTrue(
+ "Class "
+ + clazz.toSourceString()
+ + " not found in API database. Did you forget to run main method in this"
+ + " class to regenerate it?",
apiLevelCompute
.computeApiLevelForLibraryReference(clazz.getReference())
.isKnownApiLevel());
@@ -303,25 +309,42 @@
&& !field.toSourceString().contains("this$0")
&& !notModeledFields.contains(field.toSourceString())) {
assertTrue(
+ "Field "
+ + field.toSourceString()
+ + " not found in API database. Did you forget to run main method in this"
+ + " class to regenerate it?",
apiLevelCompute
.computeApiLevelForLibraryReference(field.getReference())
.isKnownApiLevel());
}
+ notModeledFields.remove(field.toSourceString());
});
clazz.forEachClassMethod(
method -> {
if (method.getAccessFlags().isPublic()
&& !notModeledMethods.contains(method.toSourceString())) {
assertTrue(
- method.toSourceString()
+ "Method "
+ + method.toSourceString()
+ " not found in API database. Did you forget to run main method in this"
+ " class to regenerate it?",
apiLevelCompute
.computeApiLevelForLibraryReference(method.getReference())
.isKnownApiLevel());
}
+ notModeledMethods.remove(method.toSourceString());
});
}
+
+ assertTrue(
+ "Not modelled types actually modeled: " + String.join(", ", notModeledTypes),
+ notModeledTypes.isEmpty());
+ assertTrue(
+ "Not modelled fields actually modeled: " + String.join(", ", notModeledFields),
+ notModeledFields.isEmpty());
+ assertTrue(
+ "Not modelled methods actually modeled: " + String.join(", ", notModeledMethods),
+ notModeledMethods.isEmpty());
}
@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 6c6e251..0daf4e2 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
@@ -107,8 +107,7 @@
}
Set<String> removedTypeNames = new HashSet<>();
if (maxApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.U)) {
- if (maxApiLevel.isLessThan(AndroidApiLevel.V)
- || maxApiLevel.equals(AndroidApiLevel.BAKLAVA)) {
+ if (maxApiLevel.isLessThan(AndroidApiLevel.V)) {
removedTypeNames.add("com.android.internal.util.Predicate");
}
removedTypeNames.add("android.adservices.AdServicesVersion");
diff --git a/third_party/android_jar/lib-v36.tar.gz.sha1 b/third_party/android_jar/lib-v36.tar.gz.sha1
index 7ae4a86..e9786d8 100644
--- a/third_party/android_jar/lib-v36.tar.gz.sha1
+++ b/third_party/android_jar/lib-v36.tar.gz.sha1
@@ -1 +1 @@
-0c46498b29f843953a5e54013d0c6aa8177fc606
\ No newline at end of file
+aaf5a2a821b31939843bc0640fcf2c013df94c80
\ No newline at end of file
diff --git a/third_party/api_database/api_database.tar.gz.sha1 b/third_party/api_database/api_database.tar.gz.sha1
index a2a5acc..2e42f99 100644
--- a/third_party/api_database/api_database.tar.gz.sha1
+++ b/third_party/api_database/api_database.tar.gz.sha1
@@ -1 +1 @@
-f6cddd7abca49554f6913dc581bea9bd4c298370
\ No newline at end of file
+3beb0b295a8362fdf9d9a01d5ff2780da9a6cf88
\ No newline at end of file
diff --git a/tools/add-android-sdk.py b/tools/add-android-sdk.py
index 5b127e6..063a99c 100755
--- a/tools/add-android-sdk.py
+++ b/tools/add-android-sdk.py
@@ -15,7 +15,8 @@
parser.add_argument('--sdk-home',
'--sdk_home',
metavar=('<SDK_HOME>'),
- help='SDK_HOME to use for finding SDK')
+ help='SDK_HOME to use for finding SDK'
+ ' (default $SDK_HOME or $HOME/Android/Sdk)')
parser.add_argument('--sdk-name',
'--sdk_name',
required=True,
@@ -53,10 +54,14 @@
if not args.sdk_home:
args.sdk_home = os.environ.get('SDK_HOME')
if not args.sdk_home:
- print('No SDK_HOME specified')
+ if not os.environ.get('HOME'):
+ print('No SDK_HOME specified')
+ sys.exit(1)
+ args.sdk_home = os.path.join(os.environ.get('HOME'), 'Android', 'Sdk')
+ if not os.path.exists(args.sdk_home):
+ print('SDK_HOME does not exist')
sys.exit(1)
- else:
- print('Using SDK_HOME: %s' % args.sdk_home)
+ print('Using SDK_HOME: %s' % args.sdk_home)
source = os.path.join(args.sdk_home, 'platforms',
'android-%s' % args.sdk_name)