Fix the API level calculation for release builds am: fec148af88 am: 6dd12642d7 am: e438d5e923 am: 95d99b823c
Original change: https://android-review.googlesource.com/c/platform/tools/metalava/+/1908518
Bug: 208738814
Test: manual, built api and docs and verified the new symbols
have correct API level
Test: metalava unit tests
Ignore-AOSP-First: merge conflict resolution
Merged-In: I1afcbe58f4c5f0f440b931b8d6a5630bee74e428
Merged-In: I174fc126233e2229071102b5816b98cc5b1e8e26
Change-Id: I1afcbe58f4c5f0f440b931b8d6a5630bee74e428
(cherry picked from commit b4a298b6d8a7f1e2b21739d327e10de921aff75b)
diff --git a/src/main/java/com/android/tools/metalava/Driver.kt b/src/main/java/com/android/tools/metalava/Driver.kt
index 47dac44..dd861dd 100644
--- a/src/main/java/com/android/tools/metalava/Driver.kt
+++ b/src/main/java/com/android/tools/metalava/Driver.kt
@@ -883,7 +883,8 @@
javaLanguageLevel: LanguageLevel = options.javaLanguageLevel,
kotlinLanguageLevel: LanguageVersionSettings = options.kotlinLanguageLevel,
manifest: File? = options.manifest,
- currentApiLevel: Int = options.currentApiLevel + if (options.currentCodeName != null) 1 else 0
+ currentApiLevel: Int = options.currentApiLevel +
+ if (options.currentCodeName != null && "REL" != options.currentCodeName) 1 else 0
): PsiBasedCodebase {
val sourceRoots = mutableListOf<File>()
sourcePath.filterTo(sourceRoots) { it.path.isNotBlank() }
diff --git a/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt b/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt
index 9c4da1e..7c2c9dc 100644
--- a/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt
+++ b/src/test/java/com/android/tools/metalava/apilevels/ApiGeneratorTest.kt
@@ -67,7 +67,7 @@
ARG_CURRENT_CODENAME,
"Z",
ARG_CURRENT_VERSION,
- "35" // not real api level of Z
+ "89" // not real api level of Z
),
sourceFiles = arrayOf(
java(
@@ -85,7 +85,7 @@
val xml = output.readText(UTF_8)
assertTrue(xml.contains("<class name=\"android/Manifest\$permission\" since=\"1\">"))
assertTrue(xml.contains("<field name=\"BIND_CARRIER_MESSAGING_SERVICE\" since=\"22\" deprecated=\"23\"/>"))
- assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"36\""))
+ assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"90\""))
assertFalse(xml.contains("<implements name=\"java/lang/annotation/Annotation\" removed=\""))
assertFalse(xml.contains("<extends name=\"java/lang/Enum\" removed=\""))
assertFalse(xml.contains("<method name=\"append(C)Ljava/lang/AbstractStringBuilder;\""))
@@ -118,4 +118,110 @@
val methodVersion = apiLookup.getMethodVersion("android/icu/util/CopticCalendar", "computeTime", "()")
assertEquals(24, methodVersion)
}
+
+ @Test
+ fun `Correct API Level for release`() {
+ var oldSdkJars = File("prebuilts/tools/common/api-versions")
+ if (!oldSdkJars.isDirectory) {
+ oldSdkJars = File("../../prebuilts/tools/common/api-versions")
+ if (!oldSdkJars.isDirectory) {
+ println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found - is \$PWD set to an Android source tree?")
+ return
+ }
+ }
+
+ var platformJars = File("prebuilts/sdk")
+ if (!platformJars.isDirectory) {
+ platformJars = File("../../prebuilts/sdk")
+ if (!platformJars.isDirectory) {
+ println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found: $platformJars")
+ return
+ }
+ }
+ val output = File.createTempFile("api-info", "xml")
+ output.deleteOnExit()
+ val outputPath = output.path
+
+ check(
+ extraArguments = arrayOf(
+ ARG_GENERATE_API_LEVELS,
+ outputPath,
+ ARG_ANDROID_JAR_PATTERN,
+ "${oldSdkJars.path}/android-%/android.jar",
+ ARG_ANDROID_JAR_PATTERN,
+ "${platformJars.path}/%/public/android.jar",
+ ARG_CURRENT_CODENAME,
+ "REL",
+ ARG_CURRENT_VERSION,
+ "89" // not real api level
+ ),
+ sourceFiles = arrayOf(
+ java(
+ """
+ package android.pkg;
+ public class MyTest {
+ }
+ """
+ )
+ )
+ )
+
+ assertTrue(output.isFile)
+ // Anything with a REL codename is in the current API level
+ val xml = output.readText(UTF_8)
+ assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"89\""))
+ }
+
+ @Test
+ fun `Correct API Level for non-release`() {
+ var oldSdkJars = File("prebuilts/tools/common/api-versions")
+ if (!oldSdkJars.isDirectory) {
+ oldSdkJars = File("../../prebuilts/tools/common/api-versions")
+ if (!oldSdkJars.isDirectory) {
+ println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found - is \$PWD set to an Android source tree?")
+ return
+ }
+ }
+
+ var platformJars = File("prebuilts/sdk")
+ if (!platformJars.isDirectory) {
+ platformJars = File("../../prebuilts/sdk")
+ if (!platformJars.isDirectory) {
+ println("Ignoring ${ApiGeneratorTest::class.java}: prebuilts not found: $platformJars")
+ return
+ }
+ }
+ val output = File.createTempFile("api-info", "xml")
+ output.deleteOnExit()
+ val outputPath = output.path
+
+ check(
+ extraArguments = arrayOf(
+ ARG_GENERATE_API_LEVELS,
+ outputPath,
+ ARG_ANDROID_JAR_PATTERN,
+ "${oldSdkJars.path}/android-%/android.jar",
+ ARG_ANDROID_JAR_PATTERN,
+ "${platformJars.path}/%/public/android.jar",
+ ARG_CURRENT_CODENAME,
+ "ZZZ", // not just Z, but very ZZZ
+ ARG_CURRENT_VERSION,
+ "89" // not real api level
+ ),
+ sourceFiles = arrayOf(
+ java(
+ """
+ package android.pkg;
+ public class MyTest {
+ }
+ """
+ )
+ )
+ )
+
+ assertTrue(output.isFile)
+ // Metalava should understand that a codename means "current api + 1"
+ val xml = output.readText(UTF_8)
+ assertTrue(xml.contains("<class name=\"android/pkg/MyTest\" since=\"90\""))
+ }
}