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"))
+            }
+        }
+    }
+}