Android gradle.kts迁移

随着 Gralde 和 kotlin 的迭代,Android Studio 里已经可以使用 kotlin 代替 groovy, 纯 kotlin 开发,dsl 特性在配置工作上更好理解,提示也比较友好。 gradle.kts 目前还有一个明显的缺点,构建效率比 groovy 低,但后续应该会做优化

Task 配置

依赖插件管理

插件管理

平时我们 gradle 项目里使用的 application,library插件,在 plugin 代码块直接使用就可以了,gradle.kts里也是一样的方式,
只不过要使用双引号 “

plugins {
    id "com.android.application"
    id "kotlin-android"
}

不同的是在 gradle.kts 中直接使用,会报如下的异常,找不到插件

* Exception is:
org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'com.android.application'] was not found in any of the following sources:

- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (plugin dependency must include a version number for this source)
    at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.resolveToFoundResult(DefaultPluginRequestApplicator.java:222)

plugins 代码块仅解析 Gradle 插件中提供的插件或使用 pluginManagement 代码块指定的自定义存储库中提供的插件。如果插件来自 plugin manager 中不存在的 buildScript 依赖项,那么这些插件在 Kotlin 中就必须使用 apply 才能应用。例如:

apply(plugin = "kotlin-android")

或在 pluginManagement 里添加你可能使用到的插件,统一管理

pluginManagement {
    plugins {
        id("com.android.application")
        id("com.android.library")
        id("com.android.dynamic-feature")

        val kotlinVersion: String by settings
        id("org.jetbrains.kotlin.jvm") version kotlinVersion
        id("org.jetbrains.kotlin.android") version kotlinVersion
        ...
    }
}

依赖管理

gradle.kts 里有一个 versionCatalogs dsl api,可以通过 create dsl api 管理所有的依赖,

enableFeaturePreview("VERSION_CATALOGS")

// 管理所有依赖库
versionCatalogs {
    val versions = mapOf(
        "kotlin" to "1.5.31",
        "coroutines" to "1.+",
        ...
    )

    create("libs") {
        // iterator all versions
        versions.keys.forEach { name ->
            versions[name]?.let { v -> version(name, v) }
        }

        // Required by Android dynamic feature modules and SafeArgs
        alias("kotlin-reflect").to("org.jetbrains.kotlin", "kotlin-reflect")
            .versionRef("kotlin")
        alias("coroutines").to("org.jetbrains.kotlinx", "kotlinx-coroutines-android")
            .versionRef("coroutines")
        bundle("kotlin", listOf("kotlin-reflect", "coroutines"))
        ...
    }
}

其中几个API含义如下,

  • alias: 对依赖库重新命名,方便引用
  • version: 指定依赖库的版本
  • versionRef: 索引 version 方法定义的依赖库版本
  • bundle: 可将多个依赖库打包,一次 implement/api 就可以引入多个依赖库,更加便利了

在 module gradle 中就可以通过 libs 来访问到

dependencies {
    api(libs.bundles.kotlin)
    api(libs.bundles.retrofit)
    api(libs.coil)
    ...