From 5530080a7d5641ab84b1028d2729e299fd3fd00a Mon Sep 17 00:00:00 2001 From: Vyacheslav Karpukhin Date: Tue, 17 Aug 2021 19:22:04 +0200 Subject: [PATCH] KMA-271 Android dependencies are not imported with AGP 7 --- .../internal/AndroidDependencyResolver.kt | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidDependencyResolver.kt index 503a57c9184..52e8e408fa9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidDependencyResolver.kt @@ -29,6 +29,9 @@ import org.gradle.api.internal.artifacts.dependencies.ProjectDependencyInternal import org.gradle.api.internal.attributes.AttributeContainerInternal import org.gradle.api.internal.attributes.AttributesSchemaInternal import org.gradle.api.provider.Provider +import org.gradle.api.services.BuildService +import org.gradle.api.services.BuildServiceParameters +import org.gradle.api.services.BuildServiceRegistry import org.gradle.internal.component.model.AttributeConfigurationSelector import org.jetbrains.kotlin.gradle.plugin.forEachVariant import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName @@ -51,8 +54,11 @@ object AndroidDependencyResolver { val useNioPath = versions[0].toInt() >= 7 val sdkHandler = if (useNioPath) { - val getInstance = AndroidSdkHandler::class.java.getMethodOrNull("getInstance", Path::class.java) ?: return null - getInstance(null, androidExtension.sdkDirectory.toPath()) as AndroidSdkHandler + val androidLocationBuildService = getAndroidLocationBuildService(project) ?: return null + val androidLocationsProvider = getClassOrNull("com.android.prefs.AndroidLocationsProvider") ?: return null + val getInstance = + AndroidSdkHandler::class.java.getMethodOrNull("getInstance", androidLocationsProvider, Path::class.java) ?: return null + getInstance(null, androidLocationBuildService, androidExtension.sdkDirectory.toPath()) as AndroidSdkHandler } else { AndroidSdkHandler.getInstance(androidExtension.sdkDirectory) } @@ -77,6 +83,20 @@ object AndroidDependencyResolver { ) } + private fun getAndroidLocationBuildService(project: Project): BuildService? = + getClassOrNull("com.android.build.gradle.internal.services.BuildServicesKt")?.let { buildServices -> + getClassOrNull("com.android.build.gradle.internal.services.AndroidLocationsBuildService")?.let { androidLocationsService -> + val getBuildService = + buildServices.getMethodOrNull("getBuildService", BuildServiceRegistry::class.java, androidLocationsService.javaClass) + @Suppress("UNCHECKED_CAST") + (getBuildService?.invoke( + null, + project.gradle.sharedServices, + androidLocationsService + ) as Provider>?)?.get() + } + } + private fun getClassOrNull(s: String) = try { Class.forName(s)