欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Gradle脚本从Groovy迁移到Kotlin DSL

程序员文章站 2022-04-29 13:08:52
Android项目用Gradle构建, 其脚本语言之前是Groovy, 目前也提供了Kotlin的支持, 所以可以迁移到Kotlin. 官方的迁移文档说明的是更通用的步骤. 本文通过一个具体的Android项目来举例如何迁移, 文后附有sample. ......

android gradle从groovy迁移到kotlin

android项目用gradle构建, 其脚本语言之前是groovy, 目前也提供了kotlin的支持, 所以可以迁移到kotlin.

官方的迁移文档: migrating build logic from groovy to kotlin
说明的是更通用的步骤.

本文通过一个具体的android项目来举例如何迁移, 文后附有sample.

名词概念解释

  • gradle: 自动化构建工具. 平行产品: maven.
  • groovy: 语言, 编译后变为jvm byte code, 兼容java平台.
  • dsl: domain specific language, 领域特定语言.
  • groovy dsl: gradle的api是java的, groovy dsl是在其之上的脚本语言. groovy dsl脚本文件后缀: .gradle.
  • kotlin dsl: 和前者类似, 同样根据gradle的java api构建, 只是替换了语言: groovy -> kotlin. kotlin dsl脚本文件后缀: .gradle.kts.

为什么要迁移

优点:

  • 可以使用kotlin, 开发者可能对这个语言更熟悉更喜欢.
  • ide支持更好, 自动补全提示, 重构, imports等.
  • 类型安全: kotlin是静态类型.
  • 不用一次性迁移完: 两种语言的脚本可以共存, 也可以互相调用.

缺点:

  • 据说kotlin dsl会比groovy dsl稍微慢一点: .

迁移步骤

step 0: 环境支持

kotlin dsl在android studio上是全面支持的. 确保使用的ide版本较新.

使用最新版的gradle, 这样会包含最新版的kotlin dsl.

step 1: 把单引号替换为双引号

这一步利用ide的文件内搜索替换功能, 在想要改的.gradle文件中, 全局替换'"就行.

比如:

    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
    }

变成了:

    dependencies {
        classpath "com.android.tools.build:gradle:3.5.3"
    }

这一步的改动可见:
https://github.com/mengdd/kotlindslsample/commit/d3fc644e88fb461920a8b60a0430bb42f6a6053e

step 2: 区分属性赋值和方法调用

属性赋值用=, 方法调用用().
有时候分不清是属性赋值还是方法调用, 可以先用=试试, 如果报错再改为方法调用.

比如settings.gradle在这一步, 由:

include ":app"
rootproject.name="kotlindslsample"

变成了:

include(":app")
rootproject.name = "kotlindslsample"

第一行是一个方法调用, 第二行是一个属性赋值.

项目根目录的build.gradle中发生了两处变化, 变成了:

    dependencies {
        classpath("com.android.tools.build:gradle:3.5.3")

和:

task clean(type: delete) {
    delete(rootproject.builddir)
}

这一步的改动见:
https://github.com/mengdd/kotlindslsample/commit/b36a508e7d4f1d5d25c23a9772e1cfd9df363fad

step 3: 文件重命名

上面两步只是准备工作, 经过上面两步, 你的脚本仍然是groovy的, 只不过现在更接近kotlin了.

真正的改变发生在这一步: 把后缀为.gradle的文件重命名, 后缀改为.gradle.kts.
没有必要全部改完, 这两种脚本是可以共存的.

改完之后各种报错了, 不要慌, 手动解决一下.

项目根目录的build.gradle.kts比较好修, 只有全局变量和task的问题.
app/build.gradle.kts中要改plugins, build type和依赖部分.

不再支持ext的全局变量定义.

这里图简单, 删掉ext.kotlin_version = "1.3.61"这句, 直接写:

    dependencies {
        classpath("com.android.tools.build:gradle:3.5.3")
        classpath(kotlin("gradle-plugin", version = "1.3.61"))
    }

task

task本来是这:

task clean(type: delete) {
    delete(rootproject.builddir)
}

现在要改成这样:

tasks.register("clean", delete::class) {
    delete(rootproject.builddir)
}

插件

应用plugins: 应用插件有apply和plugin两种方式.
强烈建议使用plugins {} block.

所以app/build.gradle.kts里面改成这样:

plugins {
    id("com.android.application")
    kotlin("android")
    kotlin("android.extensions")
}

build type

build type原先是这样写的:

    buildtypes {
        release {
            minifyenabled = false
            proguardfiles(getdefaultproguardfile("proguard-android-optimize.txt"),
                    "proguard-rules.pro")
        }
    }

现在改成这样:

    buildtypes {
        getbyname("release") {
            isminifyenabled = false
            proguardfiles(getdefaultproguardfile("proguard-android.txt"), "proguard-rules.pro")
        }
    }

依赖

libs文件依赖原先是:

implementation(filetree(dir: "libs", include: ["*.jar"]))

需要改为:

implementation(filetree(mapof("dir" to "libs", "include" to listof("*.jar"))

另外kotlin的部分:

implementation(kotlin("stdlib-jdk7", org.jetbrains.kotlin.config.kotlincompilerversion.version))

这一步的改动见:
https://github.com/mengdd/kotlindslsample/commit/e392028b128bc83f1d183b880c479687d28cdcc3

自动转换的方法

有一个自动转换的工具:
https://github.com/bernaferrari/gradlekotlinconverter

mac上首先安装kscript:

brew install holgerbrandl/tap/kscript

然后把gradlekotlinconverter.kts文件保存到根目录.

再运行:

kscript gradlekotlinconverter.kts build.gradle

kscript gradlekotlinconverter.kts app/build.gradle

进行文件的转换.

我测试了一下转换的结果并不是很完美, 还需要手动修改一下.

toubleshooting

  • 文件后缀改为kts之后, app/build.gradleandroid关键字被标红.
    我就遇到了这个问题, 开始以为没改好, 找不到android关键字了, 各种困惑找原因.
    但是我发现build是可以过的.
    后来突然ide弹出一个条: there is a new script context available.
    点击了apply context就可以了.
  • 要是还有问题, 参考一下官方的android sample吧:

参考