Linux
diff --git a/dependencies/android-sdk/build.gradle.kts b/dependencies/android-sdk/build.gradle.kts index 387e601..8e75a55 100644 --- a/dependencies/android-sdk/build.gradle.kts +++ b/dependencies/android-sdk/build.gradle.kts
@@ -24,9 +24,8 @@ } } -val buildToolsVersion = "r29.0.3" +val buildToolsVersion = "r34" val platformToolsVersion = "r35.0.0" -val sdkToolsVersion = "4333796" /*26.1.1*/ dependencies { implicitDependencies("google:build-tools:$buildToolsVersion:linux@zip") @@ -36,10 +35,6 @@ implicitDependencies("google:platform-tools:$platformToolsVersion:linux@zip") implicitDependencies("google:platform-tools:$platformToolsVersion:windows@zip") implicitDependencies("google:platform-tools:$platformToolsVersion:darwin@zip") - - implicitDependencies("google:sdk-tools-linux:$sdkToolsVersion@zip") - implicitDependencies("google:sdk-tools-windows:$sdkToolsVersion@zip") - implicitDependencies("google:sdk-tools-darwin:$sdkToolsVersion@zip") } val androidSdk by configurations.creating @@ -78,11 +73,6 @@ dependsOn(preparePlatform) } -val prepareEmulator by task<DefaultTask> { - doLast {} - dependsOn(prepareSdk) -} - interface Injected { @get:Inject val fs: FileSystemOperations @get:Inject val archiveOperations: ArchiveOperations @@ -143,10 +133,7 @@ unzipSdkTask("platform", "26_r02", "platforms/android-26", "", androidPlatform, 1, prepareTask = preparePlatform) unzipSdkTask("android_m2repository", "r44", "extras/android", "") unzipSdkTask("platform-tools", platformToolsVersion, "", toolsOsDarwin) -unzipSdkTask("sdk-tools-$toolsOsDarwin", sdkToolsVersion, "", "") -unzipSdkTask("build-tools", buildToolsVersion, "build-tools/29.0.3", toolsOs, buildTools, 1) -unzipSdkTask("armeabi-v7a", "19", "system-images/android-19/default","r05", prepareTask = prepareEmulator) -unzipSdkTask("x86", "19", "system-images/android-19/default", "r06", prepareTask = prepareEmulator) +unzipSdkTask("build-tools", buildToolsVersion, "build-tools/${buildToolsVersion.removePrefix("r")}", toolsOs, buildTools, 1) val clean by task<Delete> { delete(layout.buildDirectory)
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index f38ded5..e82ee61 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml
@@ -1615,18 +1615,18 @@ <sha256 value="ca7440cade53d829a8cace857cfad9afaa174c286d1b7a5d139e73cfcfde45d7" origin="Generated by Gradle"/> </artifact> </component> - <component group="google" name="build-tools" version="r29.0.3"> - <artifact name="build-tools-r29.0.3-linux.zip"> - <md5 value="d867d609191fd1baee2efbe7cce8d963" origin="Generated by Gradle"/> - <sha256 value="5652d8cd5eaaade0b853bfe0ae6cbfa0706a6f70a0ebb25ca24a6f484ec3d855" origin="Generated by Gradle"/> + <component group="google" name="build-tools" version="r34"> + <artifact name="build-tools-r34-linux.zip"> + <md5 value="34bce3da3d9c0d5f09f336b8a31a7fe9" origin="Generated by Gradle"/> + <sha256 value="e858c4b60069d0431051b225d384413b1643e1289b00a4825aed347f25bd510f" origin="Generated by Gradle"/> </artifact> - <artifact name="build-tools-r29.0.3-macosx.zip"> - <md5 value="8264ba89b211836cff93009b0a67afd5" origin="Generated by Gradle"/> - <sha256 value="18430abb9eaf0ed482fcaf55d5912912ba948b2cf486367377b14d6b4e8ec053" origin="Generated by Gradle"/> + <artifact name="build-tools-r34-macosx.zip"> + <md5 value="fe5d6bad9ee3afc39241a9fc73484a29" origin="Generated by Gradle"/> + <sha256 value="76bf668fe037b1a69197e298ddae5633d4d7f0f41af7ed17e537c80c1ed8a6f3" origin="Generated by Gradle"/> </artifact> - <artifact name="build-tools-r29.0.3-windows.zip"> - <md5 value="6d40852033dfd03a69e45c2c5bf48ee0" origin="Generated by Gradle"/> - <sha256 value="0ce606d5c46bf4cd0883e4f7078efeae314e41a96dd329c2c089d123cc8c2609" origin="Generated by Gradle"/> + <artifact name="build-tools-r34-windows.zip"> + <md5 value="e3edcd58e3b9d851a66d0b86e00a64f5" origin="Generated by Gradle"/> + <sha256 value="9be665ad74ef22bf0e489b37db465074484df79b95f26d759945d5c25a47b326" origin="Generated by Gradle"/> </artifact> </component> <component group="google" name="platform" version="26_r02">
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/AndroidCodegenIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/AndroidCodegenIT.kt index cbcfd67..e361e9b 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/AndroidCodegenIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/android/AndroidCodegenIT.kt
@@ -6,20 +6,44 @@ package org.jetbrains.kotlin.gradle.android import org.gradle.api.logging.LogLevel +import org.gradle.internal.logging.LoggingConfigurationBuildOptions.StacktraceOption import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.testbase.* +import org.jetbrains.kotlin.test.util.KtTestUtil import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.condition.OS -@DisplayName("codegen tests on android") -@AndroidTestVersions(minVersion = TestVersions.AGP.AGP_82, maxVersion = TestVersions.AGP.AGP_82) -/* - * Non-virtualized runners are necessary. - * This build utilizes the Android Emulator to execute codegen tests, - * requiring a VM hypervisor for optimal performance. - * Nested virtualization on CI runners except physical Macs fails. +private val EMULATOR_SCRIPT = """ + |#!/bin/sh + |DIR="$(dirname "$(readlink -f "$0")")" + |echo "${'$'}@" -no-accel -qemu -machine virt + |"${'$'}DIR/emulator1" "$@" -no-accel -qemu -machine virt + """.trimMargin() + +/** + * This function patches the Android emulator to always run without acceleration (-no-accel). + * This is a necessary hack due to the inability to pass the -no-accel argument directly to a Gradle-managed emulator run. + * It allows builds to proceed on servers that do not support nested virtualization. + * + * Workaround of https://issuetracker.google.com/issues/241029220 */ -@OsCondition(enabledOnCI = [OS.MAC]) +private fun patchEmulatorAlwaysNoAccel() { + val emulatorDir = KtTestUtil.findAndroidSdk().resolve("emulator") + val emulatorFile = emulatorDir.resolve("emulator") + val emulator1File = emulatorDir.resolve("emulator1") + if (!emulator1File.isFile) { + emulatorFile.renameTo(emulator1File) + emulatorFile.writeText(EMULATOR_SCRIPT) + emulatorFile.setExecutable(true) + } else if (emulatorFile.readText() != EMULATOR_SCRIPT) { + emulatorFile.writeText(EMULATOR_SCRIPT) + emulatorFile.setExecutable(true) + } +} + +@DisplayName("codegen tests on android") +@AndroidTestVersions(minVersion = TestVersions.AGP.AGP_83, maxVersion = TestVersions.AGP.AGP_83) +@OsCondition(supportedOn = [OS.MAC, OS.LINUX], enabledOnCI = [OS.MAC, OS.LINUX]) @AndroidCodegenTests class AndroidCodegenIT : KGPBaseTest() { @GradleAndroidTest @@ -33,14 +57,38 @@ gradleVersion, buildOptions = defaultBuildOptions.copy( androidVersion = agpVersion, - freeArgs = listOf("-Pandroid.useAndroidX=true", "-Pandroid.experimental.testOptions.managedDevices.setupTimeoutMinutes=0"), - logLevel = LogLevel.LIFECYCLE + freeArgs = listOf( + "-Pandroid.useAndroidX=true", + "-Pandroid.experimental.testOptions.managedDevices.setupTimeoutMinutes=0" + ), + logLevel = LogLevel.INFO, + stacktraceMode = StacktraceOption.STACKTRACE_SHORT_OPTION ), enableGradleDebug = false, buildJdk = jdkVersion.location ) { - build("assembleAndroidTest", forceOutput = true, enableGradleDaemonMemoryLimitInMb = 6000) - build("nexusCheck", forceOutput = true, enableGradleDaemonMemoryLimitInMb = 6000) + build( + "assembleAndroidTest", + enableGradleDaemonMemoryLimitInMb = 6000 + ) + var nonAcceleratedEmulator = false + try { + build("nexusSetup", forceOutput = true, enableGradleDaemonMemoryLimitInMb = 6000) + } catch (e: org.gradle.testkit.runner.UnexpectedBuildFailure) { + patchEmulatorAlwaysNoAccel() + nonAcceleratedEmulator = true + } + build( + "nexusCheck", + buildOptions = buildOptions.copy( + freeArgs = if (nonAcceleratedEmulator) + buildOptions.freeArgs + "-Pandroid.testoptions.manageddevices.emulator.gpu=guest" + "-PforceArmEmulator=true" + else + buildOptions.freeArgs + ), + forceOutput = true, + enableGradleDaemonMemoryLimitInMb = 6000 + ) } } }
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/codegen-tests/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/codegen-tests/build.gradle.kts index 1373b73..be99e5b 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/codegen-tests/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/codegen-tests/build.gradle.kts
@@ -48,8 +48,14 @@ create("nexus") { // A lower resolution device is used here for better emulator performance device = "Nexus One" - apiLevel = 30 - systemImageSource = "aosp-atd" + + if (project.hasProperty("forceArmEmulator")) { + apiLevel = 27 + systemImageSource = "aosp" + } else { + apiLevel = 30 + systemImageSource = "aosp-atd" + } } } } @@ -66,7 +72,6 @@ doLast { testClassesDirectories.forEach { dir -> - logger.info("Jar {} folder", dir.name) ant.withGroovyBuilder { "jar"("basedir" to dir.path, "destfile" to "libs/${dir.name}.jar") } @@ -97,3 +102,14 @@ } } } + +if (project.hasProperty("forceArmEmulator")) { + tasks.withType<com.android.build.gradle.internal.tasks.ManagedDeviceInstrumentationTestSetupTask> { + doFirst { + org.gradle.api.internal.provider.AbstractProperty::class.java.getDeclaredField("value").also { + it.isAccessible = true + it.set(abi, org.gradle.api.internal.provider.Providers.of("arm64-v8a")) + } + } + } +}