From 82a70a205bbc6a257375b94c25945770cec81dbe Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Mon, 2 Aug 2021 12:02:55 +0200 Subject: [PATCH] [Gradle] [Android] Include kotlin-tooling-metadata.json in apk artifact ^KT-48019 Verification Pending --- .../kotlin/gradle/plugin/KotlinPlugin.kt | 3 +++ .../kotlin/gradle/plugin/mpp/Publishing.kt | 2 +- .../tooling/BuildKotlinToolingMetadataTask.kt | 10 ++++----- .../includeKotlinToolingMetadataInApk.kt | 21 +++++++++++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/includeKotlinToolingMetadataInApk.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 3af8ea9e04c..59a02a9c19d 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.gradle.targets.js.jsPluginDeprecationMessage import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.tasks.* import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.tooling.includeKotlinToolingMetadataInApk import org.jetbrains.kotlin.gradle.utils.* import java.io.File import java.net.URL @@ -839,6 +840,8 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool addKotlinDependenciesToAndroidSourceSets(project, kotlinAndroidTarget) } + + project.includeKotlinToolingMetadataInApk() } /** diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt index 90325804347..d733cf983c6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/Publishing.kt @@ -52,7 +52,7 @@ private fun createRootPublication(project: Project, publishing: PublishingExtens private fun MavenPublication.addKotlinToolingMetadataArtifactIfNeeded(project: Project) { val buildKotlinToolingMetadataTask = project.buildKotlinToolingMetadataTask ?: return - artifact(buildKotlinToolingMetadataTask.flatMap { it.outputFile }) { artifact -> + artifact(buildKotlinToolingMetadataTask.map { it.outputFile }) { artifact -> artifact.classifier = "kotlin-tooling-metadata" artifact.builtBy(buildKotlinToolingMetadataTask) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/BuildKotlinToolingMetadataTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/BuildKotlinToolingMetadataTask.kt index d79f137a879..56cddaec1e7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/BuildKotlinToolingMetadataTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/BuildKotlinToolingMetadataTask.kt @@ -9,7 +9,6 @@ import com.android.build.gradle.BaseExtension import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.internal.GeneratedSubclass -import org.gradle.api.provider.Property import org.gradle.api.tasks.* import org.jetbrains.kotlin.compilerRunner.konanVersion import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension @@ -55,9 +54,11 @@ abstract class BuildKotlinToolingMetadataTask : DefaultTask() { const val defaultTaskName: String = "buildKotlinToolingMetadata" } + @get:OutputDirectory + val outputDirectory: File = project.buildDir.resolve("kotlinToolingMetadata") + @get:OutputFile - val outputFile: Property = project.objects.property(File::class.java) - .convention(project.buildDir.resolve("kotlinToolingMetadata").resolve("kotlin-tooling-metadata.json")) + val outputFile: File = outputDirectory.resolve("kotlin-tooling-metadata.json") @get:Internal internal val kotlinToolingMetadata by lazy { @@ -70,8 +71,7 @@ abstract class BuildKotlinToolingMetadataTask : DefaultTask() { @TaskAction internal fun createToolingMetadataFile() { - val outputFile = outputFile.orNull ?: return - outputFile.parentFile.mkdirs() + outputDirectory.mkdirs() outputFile.writeText(kotlinToolingMetadataJson) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/includeKotlinToolingMetadataInApk.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/includeKotlinToolingMetadataInApk.kt new file mode 100644 index 00000000000..0fc7f6560d9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tooling/includeKotlinToolingMetadataInApk.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.tooling + +import com.android.build.gradle.AppExtension +import org.gradle.api.Project + +internal fun Project.includeKotlinToolingMetadataInApk() { + plugins.withId("com.android.application") { + val buildKotlinToolingMetadataTask = buildKotlinToolingMetadataTask ?: return@withId + val android = project.extensions.getByName("android") as AppExtension + android.applicationVariants.configureEach { variant -> + variant.registerPostJavacGeneratedBytecode( + files(buildKotlinToolingMetadataTask.map { it.outputDirectory }) + ) + } + } +}