Linux
diff --git a/dependencies/android-sdk/build.gradle.kts b/dependencies/android-sdk/build.gradle.kts
index be747d59..0455cea 100644
--- a/dependencies/android-sdk/build.gradle.kts
+++ b/dependencies/android-sdk/build.gradle.kts
@@ -25,8 +25,9 @@
 }
 
 val buildToolsVersion = "r29.0.3"
-val platformToolsVersion = "r35.0.0"
-val sdkToolsVersion = "4333796" // 26.1.1
+val platformToolsVersion = "r28.0.1"
+val sdkToolsVersion = "4333796" /*26.1.1*/
+val emulatorVersion = "5264690"
 
 dependencies {
     implicitDependencies("google:build-tools:$buildToolsVersion:linux@zip")
@@ -40,12 +41,17 @@
     implicitDependencies("google:sdk-tools-linux:$sdkToolsVersion@zip")
     implicitDependencies("google:sdk-tools-windows:$sdkToolsVersion@zip")
     implicitDependencies("google:sdk-tools-darwin:$sdkToolsVersion@zip")
+
+    implicitDependencies("google:emulator-linux:$emulatorVersion@zip")
+    implicitDependencies("google:emulator-windows:$emulatorVersion@zip")
+    implicitDependencies("google:emulator-darwin:$emulatorVersion@zip")
 }
 
 val androidSdk by configurations.creating
 val androidJar by configurations.creating
 val androidPlatform by configurations.creating
 val buildTools by configurations.creating
+val androidEmulator by configurations.creating
 
 val sdkDestDirName = "androidSdk"
 
@@ -145,6 +151,7 @@
 unzipSdkTask("platform-tools", platformToolsVersion, "", toolsOsDarwin)
 unzipSdkTask("sdk-tools-$toolsOsDarwin", sdkToolsVersion, "", "")
 unzipSdkTask("build-tools", buildToolsVersion, "build-tools/${buildToolsVersion.removePrefix("r")}", toolsOs, buildTools, 1)
+unzipSdkTask("emulator-$toolsOsDarwin", emulatorVersion, "", "", prepareTask = prepareEmulator)
 unzipSdkTask("armeabi-v7a", "19", "system-images/android-19/default","r05", prepareTask = prepareEmulator)
 unzipSdkTask("x86", "19", "system-images/android-19/default", "r06", prepareTask = prepareEmulator)
 
@@ -159,3 +166,7 @@
 artifacts.add(androidJar.name, layout.buildDirectory.file("$sdkDestDirName/platforms/android-26/android.jar")) {
     builtBy(preparePlatform)
 }
+
+artifacts.add(androidEmulator.name, layout.buildDirectory.dir(sdkDestDirName)) {
+    builtBy(prepareEmulator)
+}
\ No newline at end of file
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index 4f7e4d9..12684c4 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -1813,24 +1813,42 @@
             <sha256 value="0ce606d5c46bf4cd0883e4f7078efeae314e41a96dd329c2c089d123cc8c2609" origin="Generated by Gradle"/>
          </artifact>
       </component>
+      <component group="google" name="emulator-darwin" version="5264690">
+         <artifact name="emulator-darwin-5264690.zip">
+            <md5 value="ecb9c325d4d66e72fb3756b571ab0de0" origin="Generated by Gradle"/>
+            <sha256 value="078d1444659a85c7940dc40ddf49288ab2a2ff27b01c8ebd852ca6c101906076" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="google" name="emulator-linux" version="5264690">
+         <artifact name="emulator-linux-5264690.zip">
+            <md5 value="f4c54782ea227094a4d069f64f8cf4a2" origin="Generated by Gradle"/>
+            <sha256 value="6821047a6444e722c8f3d52a621bb6ecb2651be84bde6cd26b404f234f45fdc4" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="google" name="emulator-windows" version="5264690">
+         <artifact name="emulator-windows-5264690.zip">
+            <md5 value="78470340c52fe3782f4917aaa548c91b" origin="Generated by Gradle"/>
+            <sha256 value="96673be93da220c1f719c7cc113819a032d528e9cd90ac2713fae945c37807c5" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
       <component group="google" name="platform" version="26_r02">
          <artifact name="platform-26_r02.zip">
             <md5 value="e0bd6d35c31c9f7ea2aa8931822fa5b3" origin="Generated by Gradle"/>
             <sha256 value="2aafa7d19c5e9c4b643ee6ade3d85ef89dc2f79e8383efdb9baf7fddad74b52a" origin="Generated by Gradle"/>
          </artifact>
       </component>
-      <component group="google" name="platform-tools" version="r35.0.0">
-         <artifact name="platform-tools-r35.0.0-darwin.zip">
-            <md5 value="51b47bb98d2791e84de925a53b609a0f" origin="Generated by Gradle"/>
-            <sha256 value="85c75ac31556dc95712cf1bdec592098e6c5067dc485356591d85932178bf8cd" origin="Generated by Gradle"/>
+      <component group="google" name="platform-tools" version="r28.0.1">
+         <artifact name="platform-tools-r28.0.1-darwin.zip">
+            <md5 value="1cde81b82e84c0751d5a8fcbe1d8ce56" origin="Generated by Gradle"/>
+            <sha256 value="3bc833ae3f4bd831af03811f2d1be540c2eb2eb9a17de9398b0a06dc5af6fa84" origin="Generated by Gradle"/>
          </artifact>
-         <artifact name="platform-tools-r35.0.0-linux.zip">
-            <md5 value="8c054a42356820d29003be3ce33accd6" origin="Generated by Gradle"/>
-            <sha256 value="62fc977c1b7622ef8dbd6fe1312987d9b139aa8a0b06e88573c1b60129399d49" origin="Generated by Gradle"/>
+         <artifact name="platform-tools-r28.0.1-linux.zip">
+            <md5 value="e322fcbfc59ff517e327ce310899fc0c" origin="Generated by Gradle"/>
+            <sha256 value="3e11358a3a9b0dd43ad9ab8a621eadb41737ac0495b2059a94b995157bca7392" origin="Generated by Gradle"/>
          </artifact>
-         <artifact name="platform-tools-r35.0.0-windows.zip">
-            <md5 value="e8a786dc533d91b1e6c3dc38722bbaba" origin="Generated by Gradle"/>
-            <sha256 value="7ab78a8f8b305ae4d0de647d99c43599744de61a0838d3a47bda0cdffefee87e" origin="Generated by Gradle"/>
+         <artifact name="platform-tools-r28.0.1-windows.zip">
+            <md5 value="5376bf9e941b12d99a4747d3caf4b209" origin="Generated by Gradle"/>
+            <sha256 value="db78f726d5dc653706dcd15a462ab1b946c643f598df76906c4c1858411c54df" origin="Generated by Gradle"/>
          </artifact>
       </component>
       <component group="google" name="sdk-tools-darwin" version="4333796">
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts
index 5f62ff1..0453b12 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts
@@ -503,6 +503,7 @@
     }
 
     useAndroidSdk()
+    useAndroidEmulator()
 
     val shouldApplyJunitPlatform = name !in setOf(
         allParallelTestsTask.name,
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 79b3df7..b6ae5cc 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,16 @@
 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.junit.jupiter.api.DisplayName
 import org.junit.jupiter.api.condition.OS
 
 @DisplayName("codegen tests on android")
-@AndroidTestVersions(minVersion = TestVersions.AGP.AGP_84, maxVersion = TestVersions.AGP.AGP_84)
-/*
- * Non-virtualized runners are necessary with current configuration.
- * 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.
- */
-@OsCondition(enabledOnCI = [OS.MAC])
+@AndroidTestVersions(minVersion = TestVersions.AGP.AGP_71, maxVersion = TestVersions.AGP.AGP_71)
+@GradleTestVersions(minVersion = TestVersions.Gradle.G_6_9, maxVersion = TestVersions.Gradle.G_6_9)
+@OsCondition(supportedOn = [OS.MAC, OS.LINUX], enabledOnCI = [OS.MAC, OS.LINUX])
 @AndroidCodegenTests
 class AndroidCodegenIT : KGPBaseTest() {
     @GradleAndroidTest
@@ -32,15 +28,23 @@
             "codegen-tests",
             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"),
+                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)
+//            makeSnapshotTo("/Users/Iaroslav.Postovalov/IdeaProjects/kotlin/build/snapshot/codegen-tests")
+//            build(
+//                "assembleAndroidTest",
+//                enableGradleDaemonMemoryLimitInMb = 6000
+//            )
+//            build(
+//                "nexusCheck",
+//                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"))
+            }
+        }
+    }
+}
diff --git a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt
index 537ef17..aea59f6 100644
--- a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt
+++ b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt
@@ -339,6 +339,10 @@
     fun useAndroidJar(task: Task) {
         task.useAndroidConfiguration(systemPropertyName = "android.jar", configName = "androidJar")
     }
+
+    fun useAndroidEmulator(task: Task) {
+        task.useAndroidConfiguration(systemPropertyName = "android.sdk", configName = "androidEmulator")
+    }
 }
 
 private fun Task.useAndroidConfiguration(systemPropertyName: String, configName: String) {
@@ -372,6 +376,10 @@
     TaskUtils.useAndroidSdk(this)
 }
 
+fun Task.useAndroidEmulator() {
+    TaskUtils.useAndroidEmulator(this)
+}
+
 fun Task.useAndroidJar() {
     TaskUtils.useAndroidJar(this)
 }