From 71c71d861919be0e75a0e4822391592d4797ebaf Mon Sep 17 00:00:00 2001 From: Vyacheslav Karpukhin Date: Wed, 13 Jan 2021 20:27:46 +0100 Subject: [PATCH] AndroidDependencyResolver: compatibility with AGP 7 --- .../internal/AndroidDependencyResolver.kt | 45 ++++++++++++++----- 1 file changed, 34 insertions(+), 11 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 cace337f57a..d114a9cd983 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 @@ -22,6 +22,7 @@ import org.gradle.api.provider.Provider import org.jetbrains.kotlin.gradle.plugin.forEachVariant import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import java.io.File +import java.nio.file.Path data class AndroidDependency( val name: String? = null, @@ -34,16 +35,34 @@ data class AndroidDependency( @Suppress("unused") object AndroidDependencyResolver { - private fun getAndroidSdkJar(project: Project): AndroidDependency? { + private fun getAndroidSdkJar(project: Project, versions: List): AndroidDependency? { val androidExtension = project.extensions.findByName("android") as BaseExtension? ?: return null - val sdkHandler = AndroidSdkHandler.getInstance(androidExtension.sdkDirectory) + 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 + } else { + AndroidSdkHandler.getInstance(androidExtension.sdkDirectory) + } val logger = LoggerProgressIndicatorWrapper(LoggerWrapper(project.logger)) val androidTarget = sdkHandler.getAndroidTargetManager(logger).getTargetFromHashString(androidExtension.compileSdkVersion, logger) ?: return null + + val jar: File + val sources: File + if (useNioPath) { + val getPath = IAndroidTarget::class.java.getMethodOrNull("getPath", Int::class.java) ?: return null + jar = (getPath(androidTarget, IAndroidTarget.ANDROID_JAR) as Path).toFile() + sources = (getPath(androidTarget, IAndroidTarget.SOURCES) as Path).toFile() + } else { + jar = File(androidTarget.getPath(IAndroidTarget.ANDROID_JAR)) + sources = File(androidTarget.getPath(IAndroidTarget.SOURCES)) + } return AndroidDependency( androidTarget.fullName, - File(androidTarget.getPath(IAndroidTarget.ANDROID_JAR)), - File(androidTarget.getPath(IAndroidTarget.SOURCES)) + jar, + sources ) } @@ -61,24 +80,28 @@ object AndroidDependencyResolver { null } - private fun isAndroidPluginCompatible(): Boolean { + private fun getAndroidPluginVersions(): List? { val version = getClassOrNull("com.android.Version")?.let { try { it.getField("ANDROID_GRADLE_PLUGIN_VERSION").get(null) as String } catch (e: Exception) { - return false + return null } - } ?: return false - val versions = version.split('.') - return versions[0].toInt() >= 3 && versions[1].toInt() >= 6 + } ?: return null + return version.split('.') + } + + private fun isAndroidPluginCompatible(versions: List): Boolean { + return versions[0].toInt() >= 4 || versions[0].toInt() >= 3 && versions[1].toInt() >= 6 } fun getAndroidSourceSetDependencies(project: Project): Map?> { - if (!isAndroidPluginCompatible()) return emptyMap() + val androidPluginVersions = getAndroidPluginVersions() ?: return emptyMap() + if (!isAndroidPluginCompatible(androidPluginVersions)) return emptyMap() data class SourceSetConfigs(val implConfig: Configuration, val compileConfig: Configuration) - val androidSdkJar = getAndroidSdkJar(project) ?: return emptyMap() + val androidSdkJar = getAndroidSdkJar(project, androidPluginVersions) ?: return emptyMap() val sourceSet2Impl = HashMap() val allImplConfigs = HashSet()