summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-06-06 23:38:08 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-06-06 23:38:08 +0000
commit3b726a18d8b1c822ab678ecbc099ad1ed788dffd (patch)
tree857b99557b2ec9ff13f44f6e423dc30428edb496
parente43f1732b4c75e0cab079d1c24ae3b7881efaf24 (diff)
parent5220cf6287a60db3dfa3fa19f18f2a481a67fba6 (diff)
downloadbase-3b726a18d8b1c822ab678ecbc099ad1ed788dffd.tar.gz
Merge cherrypicks of ['googleplex-android-review.googlesource.com/23502723', 'googleplex-android-review.googlesource.com/23502724', 'googleplex-android-review.googlesource.com/23586004'] into studio-giraffe-release.
Change-Id: Id77ac0fd95098feae0088fb464d38303a2f104d2
-rw-r--r--bazel/maven/BUILD.maven78
-rw-r--r--bazel/maven/artifacts.bzl8
-rw-r--r--build-system/gradle-core/src/main/java/com/android/build/api/artifact/impl/ScopedArtifactsImpl.kt31
-rw-r--r--build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/TransformClassesWithAsmTask.kt87
-rw-r--r--build-system/gradle-core/src/test/java/com/android/build/gradle/tasks/DependenciesAnalyzerTest.kt1
-rw-r--r--build-system/integration-test/application/src/test/java/com/android/build/gradle/integration/instrumentation/AsmTransformApiInstrumentationTest.kt78
6 files changed, 157 insertions, 126 deletions
diff --git a/bazel/maven/BUILD.maven b/bazel/maven/BUILD.maven
index c0e79b6787..e4e7062c9a 100644
--- a/bazel/maven/BUILD.maven
+++ b/bazel/maven/BUILD.maven
@@ -38868,10 +38868,10 @@ maven_artifact(
)
maven_artifact(
- name = "org.jetbrains.compose.compiler.compiler-hosted_1.3.2",
- pom = "repository/org/jetbrains/compose/compiler/compiler-hosted/1.3.2/compiler-hosted-1.3.2.pom",
+ name = "org.jetbrains.compose.compiler.compiler-hosted_1.4.5",
+ pom = "repository/org/jetbrains/compose/compiler/compiler-hosted/1.4.5/compiler-hosted-1.4.5.pom",
repo_root_path = "repository",
- repo_path = "org/jetbrains/compose/compiler/compiler-hosted/1.3.2",
+ repo_path = "org/jetbrains/compose/compiler/compiler-hosted/1.4.5",
visibility = ["//visibility:public"],
)
@@ -39382,34 +39382,10 @@ maven_artifact(
)
maven_artifact(
- name = "org.jetbrains.kotlin.jvm-abi-gen_1.7.0",
- pom = "repository/org/jetbrains/kotlin/jvm-abi-gen/1.7.0/jvm-abi-gen-1.7.0.pom",
+ name = "org.jetbrains.kotlin.jvm-abi-gen_1.8.21",
+ pom = "repository/org/jetbrains/kotlin/jvm-abi-gen/1.8.21/jvm-abi-gen-1.8.21.pom",
repo_root_path = "repository",
- repo_path = "org/jetbrains/kotlin/jvm-abi-gen/1.7.0",
- visibility = ["//visibility:public"],
-)
-
-maven_artifact(
- name = "org.jetbrains.kotlin.jvm-abi-gen_1.7.20",
- pom = "repository/org/jetbrains/kotlin/jvm-abi-gen/1.7.20/jvm-abi-gen-1.7.20.pom",
- repo_root_path = "repository",
- repo_path = "org/jetbrains/kotlin/jvm-abi-gen/1.7.20",
- visibility = ["//visibility:public"],
-)
-
-maven_artifact(
- name = "org.jetbrains.kotlin.jvm-abi-gen_1.8.10",
- pom = "repository/org/jetbrains/kotlin/jvm-abi-gen/1.8.10/jvm-abi-gen-1.8.10.pom",
- repo_root_path = "repository",
- repo_path = "org/jetbrains/kotlin/jvm-abi-gen/1.8.10",
- visibility = ["//visibility:public"],
-)
-
-maven_artifact(
- name = "org.jetbrains.kotlin.jvm-abi-gen_1.8.20-Beta",
- pom = "repository/org/jetbrains/kotlin/jvm-abi-gen/1.8.20-Beta/jvm-abi-gen-1.8.20-Beta.pom",
- repo_root_path = "repository",
- repo_path = "org/jetbrains/kotlin/jvm-abi-gen/1.8.20-Beta",
+ repo_path = "org/jetbrains/kotlin/jvm-abi-gen/1.8.21",
visibility = ["//visibility:public"],
)
@@ -40427,6 +40403,20 @@ maven_artifact(
)
maven_artifact(
+ name = "org.jetbrains.kotlin.kotlin-compiler_1.8.21",
+ pom = "repository/org/jetbrains/kotlin/kotlin-compiler/1.8.21/kotlin-compiler-1.8.21.pom",
+ repo_root_path = "repository",
+ repo_path = "org/jetbrains/kotlin/kotlin-compiler/1.8.21",
+ deps = [
+ "org.jetbrains.kotlin.kotlin-stdlib_1.8.21",
+ "org.jetbrains.kotlin.kotlin-script-runtime_1.8.21",
+ "org.jetbrains.kotlin.kotlin-reflect_1.6.10",
+ "org.jetbrains.intellij.deps.trove4j_1.0.20200330",
+ ],
+ visibility = ["//visibility:public"],
+)
+
+maven_artifact(
name = "org.jetbrains.kotlin.kotlin-daemon-client_1.3.20",
pom = "repository/org/jetbrains/kotlin/kotlin-daemon-client/1.3.20/kotlin-daemon-client-1.3.20.pom",
repo_root_path = "repository",
@@ -42170,6 +42160,14 @@ maven_artifact(
)
maven_artifact(
+ name = "org.jetbrains.kotlin.kotlin-script-runtime_1.8.21",
+ pom = "repository/org/jetbrains/kotlin/kotlin-script-runtime/1.8.21/kotlin-script-runtime-1.8.21.pom",
+ repo_root_path = "repository",
+ repo_path = "org/jetbrains/kotlin/kotlin-script-runtime/1.8.21",
+ visibility = ["//visibility:public"],
+)
+
+maven_artifact(
name = "org.jetbrains.kotlin.kotlin-scripting-common_1.3.41",
pom = "repository/org/jetbrains/kotlin/kotlin-scripting-common/1.3.41/kotlin-scripting-common-1.3.41.pom",
repo_root_path = "repository",
@@ -43028,6 +43026,14 @@ maven_artifact(
)
maven_artifact(
+ name = "org.jetbrains.kotlin.kotlin-stdlib-common_1.8.21",
+ pom = "repository/org/jetbrains/kotlin/kotlin-stdlib-common/1.8.21/kotlin-stdlib-common-1.8.21.pom",
+ repo_root_path = "repository",
+ repo_path = "org/jetbrains/kotlin/kotlin-stdlib-common/1.8.21",
+ visibility = ["//visibility:public"],
+)
+
+maven_artifact(
name = "org.jetbrains.kotlin.kotlin-stdlib-jdk7_1.2.71",
pom = "repository/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.2.71/kotlin-stdlib-jdk7-1.2.71.pom",
repo_root_path = "repository",
@@ -44076,6 +44082,18 @@ maven_artifact(
)
maven_artifact(
+ name = "org.jetbrains.kotlin.kotlin-stdlib_1.8.21",
+ pom = "repository/org/jetbrains/kotlin/kotlin-stdlib/1.8.21/kotlin-stdlib-1.8.21.pom",
+ repo_root_path = "repository",
+ repo_path = "org/jetbrains/kotlin/kotlin-stdlib/1.8.21",
+ deps = [
+ "org.jetbrains.kotlin.kotlin-stdlib-common_1.8.21",
+ "org.jetbrains.annotations_13.0",
+ ],
+ visibility = ["//visibility:public"],
+)
+
+maven_artifact(
name = "org.jetbrains.kotlin.kotlin-test-junit_1.7.10",
pom = "repository/org/jetbrains/kotlin/kotlin-test-junit/1.7.10/kotlin-test-junit-1.7.10.pom",
repo_root_path = "repository",
diff --git a/bazel/maven/artifacts.bzl b/bazel/maven/artifacts.bzl
index 48e51b6414..6e628781c4 100644
--- a/bazel/maven/artifacts.bzl
+++ b/bazel/maven/artifacts.bzl
@@ -525,7 +525,7 @@ DATA = [
"org.javassist:javassist:3.26.0-GA",
"org.jdeferred:jdeferred-android-aar:1.2.2",
"org.jdeferred:jdeferred-android-aar:1.2.3",
- "org.jetbrains.compose.compiler:compiler-hosted:1.3.2",
+ "org.jetbrains.compose.compiler:compiler-hosted:1.4.5",
"org.jetbrains.compose.foundation:foundation-desktop:1.1.1",
"com.android.tools.utp:android-test-plugin-host-retention:30.2.0",
"com.android.tools.utp:android-test-plugin-result-listener-gradle:30.2.0",
@@ -547,10 +547,7 @@ DATA = [
"org.jetbrains.kotlin.android:org.jetbrains.kotlin.android.gradle.plugin:1.8.20-Beta",
"org.jetbrains.kotlin.android:org.jetbrains.kotlin.android.gradle.plugin:1.8.0",
"org.jetbrains.kotlin.android:org.jetbrains.kotlin.android.gradle.plugin:1.8.10",
- "org.jetbrains.kotlin:jvm-abi-gen:1.7.0",
- "org.jetbrains.kotlin:jvm-abi-gen:1.7.20",
- "org.jetbrains.kotlin:jvm-abi-gen:1.8.10",
- "org.jetbrains.kotlin:jvm-abi-gen:1.8.20-Beta",
+ "org.jetbrains.kotlin:jvm-abi-gen:1.8.21",
"org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.6.10",
"org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.6.21",
"org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin:1.7.0",
@@ -576,6 +573,7 @@ DATA = [
"org.jetbrains.kotlin:kotlin-compiler:1.7.0",
"org.jetbrains.kotlin:kotlin-compiler:1.7.20",
"org.jetbrains.kotlin:kotlin-compiler:1.8.20-Beta",
+ "org.jetbrains.kotlin:kotlin-compiler:1.8.21",
"org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.0",
"org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.20",
"org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.21",
diff --git a/build-system/gradle-core/src/main/java/com/android/build/api/artifact/impl/ScopedArtifactsImpl.kt b/build-system/gradle-core/src/main/java/com/android/build/api/artifact/impl/ScopedArtifactsImpl.kt
index 95af44948d..7594211a08 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/api/artifact/impl/ScopedArtifactsImpl.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/api/artifact/impl/ScopedArtifactsImpl.kt
@@ -34,15 +34,14 @@ import org.gradle.api.file.RegularFile
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
-import org.gradle.api.provider.Provider
import org.gradle.api.tasks.TaskProvider
import java.util.concurrent.atomic.AtomicBoolean
class ScopedArtifactsImpl(
- val scopeName: String,
- val variantIdentifier: String,
- val projectLayout: ProjectLayout,
- val fileCollectionCreator: () -> ConfigurableFileCollection,
+ private val scopeName: String,
+ private val variantIdentifier: String,
+ private val projectLayout: ProjectLayout,
+ private val fileCollectionCreator: () -> ConfigurableFileCollection,
): ScopedArtifacts {
/**
@@ -106,7 +105,7 @@ class ScopedArtifactsImpl(
val artifactsAltered = AtomicBoolean(false)
- val listOfProviders = mutableListOf(initialScopedContent)
+ private val listOfProviders = mutableListOf(initialScopedContent)
/**
* Reset the current provider of the artifact the new file collection and make sure the
* final version points to the new content.
@@ -169,10 +168,10 @@ class ScopedArtifactsImpl(
getScopedArtifactsContainer(type).finalScopedContent
class ScopedArtifactsOperationImpl<T: Task>(
- val scopedArtifacts: ScopedArtifactsImpl,
- val taskProvider: TaskProvider<T>,
- val projectLayout: ProjectLayout,
- val fileCollectionCreator: () -> ConfigurableFileCollection,
+ private val scopedArtifacts: ScopedArtifactsImpl,
+ private val taskProvider: TaskProvider<T>,
+ private val projectLayout: ProjectLayout,
+ private val fileCollectionCreator: () -> ConfigurableFileCollection,
): ScopedArtifactsOperation<T> {
override fun toAppend(to: ScopedArtifact, with: (T) -> Property<out FileSystemLocation>) {
@@ -182,8 +181,8 @@ class ScopedArtifactsImpl(
// and sets the output path.
taskProvider.configure {
when (val provider = with(it)) {
- is RegularFileProperty -> setContentPath(to, provider)
- is DirectoryProperty -> setContentPath(to, provider)
+ is RegularFileProperty -> setContentPath(to, provider, taskProvider.name)
+ is DirectoryProperty -> setContentPath(to, provider, taskProvider.name)
else -> throw RuntimeException("Only RegularFileProperty or DirectoryProperty" +
" instances are supported, got ${provider.javaClass}")
}
@@ -219,7 +218,7 @@ class ScopedArtifactsImpl(
inputDirectories(task).set(
currentScopedContent.getDirectories(projectLayout.projectDirectory)
)
- setContentPath(type, into(task))
+ setContentPath(type, into(task), taskProvider.name)
}
resetContentProvider(type, into)
}
@@ -296,21 +295,21 @@ class ScopedArtifactsImpl(
override fun toReplace(type: ScopedArtifact, into: (T) -> RegularFileProperty) {
taskProvider.configure { task ->
- setContentPath(type, into(task))
+ setContentPath(type, into(task), taskProvider.name)
}
resetContentProvider(type, into)
-
}
private fun setContentPath(
type: ScopedArtifact,
into: RegularFileProperty,
+ vararg paths: String,
) {
into.set(
type.getIntermediateOutputPath(
buildDirectory = projectLayout.buildDirectory,
variantIdentifier = scopedArtifacts.variantIdentifier,
- paths = arrayOf(scopedArtifacts.scopeName) ,
+ paths = arrayOf(scopedArtifacts.scopeName, *paths) ,
forceFilename = type.name().lowercase().plus(".jar")
)
)
diff --git a/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/TransformClassesWithAsmTask.kt b/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/TransformClassesWithAsmTask.kt
index 4f42a8c8b2..00e78db697 100644
--- a/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/TransformClassesWithAsmTask.kt
+++ b/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/TransformClassesWithAsmTask.kt
@@ -21,8 +21,6 @@ import com.android.SdkConstants.DOT_JAR
import com.android.SdkConstants.DOT_JSON
import com.android.build.api.instrumentation.AsmClassVisitorFactory
import com.android.build.api.instrumentation.FramesComputationMode
-import com.android.build.api.artifact.ScopedArtifact
-import com.android.build.api.variant.ScopedArtifacts
import com.android.build.gradle.internal.component.ApkCreationConfig
import com.android.build.gradle.internal.component.ComponentCreationConfig
import com.android.build.gradle.internal.instrumentation.AsmInstrumentationManager
@@ -31,9 +29,6 @@ import com.android.build.gradle.internal.instrumentation.loadClassData
import com.android.build.gradle.internal.instrumentation.saveClassData
import com.android.build.gradle.internal.profile.ProfileAwareWorkAction
import com.android.build.gradle.internal.publishing.AndroidArtifacts
-import com.android.build.gradle.internal.scope.InternalArtifactType
-import com.android.build.gradle.internal.scope.getDirectories
-import com.android.build.gradle.internal.scope.getRegularFiles
import com.android.build.gradle.internal.services.ClassesHierarchyBuildService
import com.android.build.gradle.internal.services.getBuildService
import com.android.build.gradle.internal.tasks.BuildAnalyzer
@@ -47,12 +42,10 @@ import com.android.build.gradle.internal.utils.setDisallowChanges
import com.android.buildanalyzer.common.TaskCategory
import com.android.builder.files.SerializableFileChanges
import com.android.builder.utils.isValidZipEntryName
-import com.android.ide.common.resources.FileStatus
import com.android.utils.FileUtils
import com.google.common.io.ByteStreams
import com.google.common.io.Files
import org.gradle.api.file.ConfigurableFileCollection
-import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.ListProperty
@@ -66,7 +59,6 @@ import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Nested
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectory
-import org.gradle.api.tasks.TaskProvider
import org.gradle.work.ChangeType
import org.gradle.work.Incremental
import org.gradle.work.InputChanges
@@ -100,12 +92,6 @@ abstract class TransformClassesWithAsmTask : NewIncrementalTask() {
@get:Classpath
abstract val inputClassesDir: ConfigurableFileCollection
- // This is used when jacoco instrumented jars are used as inputs
- @get:Incremental
- @get:Classpath
- @get:Optional
- abstract val inputJarsDir: DirectoryProperty
-
@get:Nested
abstract val inputJarsWithIdentity: JarsClasspathInputsWithIdentity
@@ -178,7 +164,6 @@ abstract class TransformClassesWithAsmTask : NewIncrementalTask() {
workerExecutor.noIsolation().submit(TransformClassesFullAction::class.java) {
configureParams(it, inputChanges)
it.inputClassesDir.from(inputClassesDir)
- it.inputJarsDir.set(inputJarsDir)
}
}
@@ -226,9 +211,6 @@ abstract class TransformClassesWithAsmTask : NewIncrementalTask() {
it.inputClassesDirChanges.set(
inputChanges.getFileChanges(inputClassesDir).toSerializable()
)
- if (inputJarsDir.isPresent) {
- it.inputJarsChanges.set(inputChanges.getFileChanges(inputJarsDir).toSerializable())
- }
}
}
@@ -275,7 +257,7 @@ abstract class TransformClassesWithAsmTask : NewIncrementalTask() {
* Extract profiler dependency jars and add them to the project jars as they need to be
* packaged with the rest of the classes.
*/
- protected fun extractProfilerDependencyJars() {
+ private fun extractProfilerDependencyJars() {
if (parameters.shouldPackageProfilerDependencies.getOrElse(false)) {
parameters.profilingTransforms.get().forEach { path ->
val profilingTransformFile = File(path)
@@ -311,24 +293,18 @@ abstract class TransformClassesWithAsmTask : NewIncrementalTask() {
}
}
- abstract fun maybeProcessJacocoInstrumentedJars(
- instrumentationManager: AsmInstrumentationManager
- ): Boolean
-
fun processJars(instrumentationManager: AsmInstrumentationManager) {
- if (!maybeProcessJacocoInstrumentedJars(instrumentationManager)) {
- val mappingState = parameters.mappingState.get()
- if (mappingState.reprocessAll) {
- FileUtils.deleteDirectoryContents(parameters.jarsOutputDir.get().asFile)
- extractProfilerDependencyJars()
- }
- mappingState.jarsInfo.forEach { (file, info) ->
- if (info.hasChanged) {
- val instrumentedJar =
- File(parameters.jarsOutputDir.get().asFile, info.identity + DOT_JAR)
- FileUtils.deleteIfExists(instrumentedJar)
- instrumentationManager.instrumentClassesFromJarToJar(file, instrumentedJar)
- }
+ val mappingState = parameters.mappingState.get()
+ if (mappingState.reprocessAll) {
+ FileUtils.deleteDirectoryContents(parameters.jarsOutputDir.get().asFile)
+ extractProfilerDependencyJars()
+ }
+ mappingState.jarsInfo.forEach { (file, info) ->
+ if (info.hasChanged) {
+ val instrumentedJar =
+ File(parameters.jarsOutputDir.get().asFile, info.identity + DOT_JAR)
+ FileUtils.deleteIfExists(instrumentedJar)
+ instrumentationManager.instrumentClassesFromJarToJar(file, instrumentedJar)
}
}
}
@@ -358,7 +334,6 @@ abstract class TransformClassesWithAsmTask : NewIncrementalTask() {
abstract class IncrementalWorkerParams: BaseWorkerParams() {
abstract val inputClassesDirChanges: Property<SerializableFileChanges>
- abstract val inputJarsChanges: Property<SerializableFileChanges>
}
abstract class TransformClassesIncrementalAction:
@@ -397,33 +372,10 @@ abstract class TransformClassesWithAsmTask : NewIncrementalTask() {
classesHierarchyResolver = classesHierarchyResolver
)
}
-
- override fun maybeProcessJacocoInstrumentedJars(
- instrumentationManager: AsmInstrumentationManager
- ): Boolean {
- if (!parameters.inputJarsChanges.isPresent) {
- return false
- }
- parameters.inputJarsChanges.get().fileChanges.forEach { inputJar ->
- val instrumentedJar =
- File(parameters.jarsOutputDir.get().asFile, inputJar.file.name)
- FileUtils.deleteIfExists(instrumentedJar)
- if (inputJar.fileStatus == FileStatus.NEW ||
- inputJar.fileStatus == FileStatus.CHANGED
- ) {
- instrumentationManager.instrumentClassesFromJarToJar(
- inputJar.file,
- instrumentedJar
- )
- }
- }
- return true
- }
}
abstract class FullActionWorkerParams: BaseWorkerParams() {
abstract val inputClassesDir: ConfigurableFileCollection
- abstract val inputJarsDir: DirectoryProperty
}
abstract class TransformClassesFullAction:
@@ -444,21 +396,6 @@ abstract class TransformClassesWithAsmTask : NewIncrementalTask() {
updateIncrementalState(emptySet(), classesHierarchyResolver)
}
-
- override fun maybeProcessJacocoInstrumentedJars(
- instrumentationManager: AsmInstrumentationManager
- ): Boolean {
- if (!parameters.inputJarsDir.isPresent) {
- return false
- }
- FileUtils.deleteDirectoryContents(parameters.jarsOutputDir.get().asFile)
- extractProfilerDependencyJars()
- parameters.inputJarsDir.get().asFile.listFiles()?.forEach { inputJar ->
- val instrumentedJar = File(parameters.jarsOutputDir.get().asFile, inputJar.name)
- instrumentationManager.instrumentClassesFromJarToJar(inputJar, instrumentedJar)
- }
- return true
- }
}
class CreationAction(
diff --git a/build-system/gradle-core/src/test/java/com/android/build/gradle/tasks/DependenciesAnalyzerTest.kt b/build-system/gradle-core/src/test/java/com/android/build/gradle/tasks/DependenciesAnalyzerTest.kt
index 3d18ca7a46..0eca28e284 100644
--- a/build-system/gradle-core/src/test/java/com/android/build/gradle/tasks/DependenciesAnalyzerTest.kt
+++ b/build-system/gradle-core/src/test/java/com/android/build/gradle/tasks/DependenciesAnalyzerTest.kt
@@ -127,6 +127,7 @@ class DependenciesAnalyzerTest {
"com/android/build/gradle/internal/transforms/testdata/Toy.class",
"org/jetbrains/annotations/NotNull.class",
"kotlin/jvm/internal/Intrinsics.class",
+ "kotlin/jvm/internal/SourceDebugExtension.class",
"java/lang/String.class"
)
)
diff --git a/build-system/integration-test/application/src/test/java/com/android/build/gradle/integration/instrumentation/AsmTransformApiInstrumentationTest.kt b/build-system/integration-test/application/src/test/java/com/android/build/gradle/integration/instrumentation/AsmTransformApiInstrumentationTest.kt
index 9d4eb8a470..e10d0713b1 100644
--- a/build-system/integration-test/application/src/test/java/com/android/build/gradle/integration/instrumentation/AsmTransformApiInstrumentationTest.kt
+++ b/build-system/integration-test/application/src/test/java/com/android/build/gradle/integration/instrumentation/AsmTransformApiInstrumentationTest.kt
@@ -385,4 +385,82 @@ class AsmTransformApiInstrumentationTest {
expectedInstrumentedClasses = listOf("InterfaceExtendsI")
)
}
+
+ /**
+ * regression test for b/285170632.
+ */
+ @Test
+ fun testInteractionWithVariantApi() {
+ configureExtensionForAnnotationAddingVisitor(project)
+ configureExtensionForInterfaceAddingVisitor(project)
+
+ TestFileUtils.searchAndReplace(
+ project.getSubproject(":app").buildFile,
+ "plugins {",
+ """
+ buildscript {
+ apply from: '../../commonBuildScript.gradle'
+ apply from: '../../commonHeader.gradle'
+ dependencies {
+ classpath("org.javassist:javassist:3.26.0-GA")
+ }
+ }
+
+ plugins {
+ """.trimIndent()
+ )
+
+ TestFileUtils.appendToFile(
+ project.getSubproject(":app").buildFile,
+ // language=groovy
+ """
+ import com.android.build.api.variant.ScopedArtifacts
+ import com.android.build.api.artifact.ScopedArtifact
+
+ import org.gradle.api.DefaultTask
+ import org.gradle.api.tasks.OutputDirectory
+ import org.gradle.api.tasks.TaskAction
+ import javassist.ClassPool
+ import javassist.CtClass
+
+ abstract class AddClassesTask extends DefaultTask {
+
+ @OutputDirectory
+ abstract DirectoryProperty getOutput();
+
+ @TaskAction
+ void taskAction() {
+
+ ClassPool pool = new ClassPool(ClassPool.getDefault())
+ CtClass interfaceClass = pool.makeInterface(
+ "com.android.api.tests.SomeInterface"
+ )
+ System.out.println("Adding ${'$'}interfaceClass")
+ interfaceClass.writeFile(output.get().asFile.absolutePath)
+ }
+ }
+
+ androidComponents {
+ onVariants(selector().all(), { variant ->
+ TaskProvider<AddClassesTask> taskProvider = project.tasks.register(
+ variant.getName() + "AddAllClasses", AddClassesTask.class
+ )
+ variant.artifacts
+ .forScope(ScopedArtifacts.Scope.PROJECT)
+ .use(taskProvider)
+ .toAppend(
+ ScopedArtifact.CLASSES.INSTANCE,
+ { it.getOutput() }
+ )
+ })
+ }
+ """.trimIndent()
+ )
+
+ // run twice to catch recursive input
+ project.executor().run(":app:assembleDebug")
+ project.executor().run(":app:assembleDebug")
+
+ assertClassesAreInstrumentedInDebugVariant()
+ }
}