From 875ef733711f0af59f2d923c1c2705ee1a0cad08 Mon Sep 17 00:00:00 2001 From: Ivan Gavrilovic Date: Wed, 17 Mar 2021 09:38:21 +0000 Subject: [PATCH] KT-45519: Get AGP version only once per classloader Memoize AGP version per classloader, instead of computing it once per project. Fixes #KT-45519 --- .../jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt | 13 ++++++------- .../targets/android/internal/AndroidSubplugin.kt | 2 +- .../targets/android/internal/ParcelizeSubplugin.kt | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) 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 d158b1c6f85..294a8ba0796 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 @@ -718,10 +718,9 @@ internal open class KotlinAndroidPlugin( ): AbstractAndroidProjectHandler { val tasksProvider = AndroidTasksProvider(androidTarget.targetName) - val version = loadAndroidPluginVersion() - if (version != null) { + if (androidPluginVersion != null) { val minimalVersion = "3.0.0" - if (compareVersionNumbers(version, minimalVersion) < 0) { + if (compareVersionNumbers(androidPluginVersion, minimalVersion) < 0) { throw IllegalStateException("Kotlin: Unsupported version of com.android.tools.build:gradle plugin: version $minimalVersion or higher should be used with kotlin-android plugin") } } @@ -1073,14 +1072,14 @@ internal fun Task.registerSubpluginOptionsAsInputs(subpluginId: String, subplugi } //copied from BasePlugin.getLocalVersion -internal fun loadAndroidPluginVersion(): String? { +internal val androidPluginVersion by lazy { try { val clazz = BasePlugin::class.java val className = clazz.simpleName + ".class" val classPath = clazz.getResource(className).toString() if (!classPath.startsWith("jar")) { // Class not from JAR, unlikely - return null + return@lazy null } val manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + "/META-INF/MANIFEST.MF" @@ -1089,9 +1088,9 @@ internal fun loadAndroidPluginVersion(): String? { val jarInputStream = jarConnection.inputStream val attr = Manifest(jarInputStream).mainAttributes jarInputStream.close() - return attr.getValue("Plugin-Version") + return@lazy attr.getValue("Plugin-Version") } catch (t: Throwable) { - return null + return@lazy null } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt index 4a7fe1ae336..1cd4f7e7d1d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidSubplugin.kt @@ -57,7 +57,7 @@ class AndroidExtensionsSubpluginIndicator @Inject internal constructor(private v val name = configuration.name if (name != "implementation" && name != "compile") return@all - val androidPluginVersion = loadAndroidPluginVersion() ?: return@all + androidPluginVersion ?: return@all val requiredConfigurationName = when { compareVersionNumbers(androidPluginVersion, "2.5") > 0 -> "implementation" else -> "compile" diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt index 788ab3bd7a0..3d231dea6c5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt @@ -55,7 +55,7 @@ class ParcelizeSubplugin : KotlinCompilerPluginSupportPlugin { val name = configuration.name if (name != "implementation" && name != "compile") return@all - val androidPluginVersion = loadAndroidPluginVersion() ?: return@all + androidPluginVersion ?: return@all val requiredConfigurationName = when { compareVersionNumbers(androidPluginVersion, "2.5") > 0 -> "implementation" else -> "compile"