diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-06-06 23:38:08 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-06-06 23:38:08 +0000 |
commit | 3b726a18d8b1c822ab678ecbc099ad1ed788dffd (patch) | |
tree | 857b99557b2ec9ff13f44f6e423dc30428edb496 | |
parent | e43f1732b4c75e0cab079d1c24ae3b7881efaf24 (diff) | |
parent | 5220cf6287a60db3dfa3fa19f18f2a481a67fba6 (diff) | |
download | base-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
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() + } } |