11

Android Gradle脚本从Groovy迁移到Kotlin DSL

  • 时间:2020-01-28 13:22 编辑:54菜鸟 来源: 阅读:363
  • 扫一扫,手机访问
摘要:Android项目用Gradle构建, 其脚本语言之前是Groovy, 目前也提供了Kotlin的支持, 所以可以迁移到Kotlin.

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稍微慢一点: https://github.com/gradle/kotlin-dsl-samples/issues/902.

迁移步骤

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: https://github.com/holgerbrandl/kscript


brew install holgerbrandl/tap/kscript

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


再运行:


kscript gradlekotlinconverter.kts build.gradle


kscript gradlekotlinconverter.kts app/build.gradle

进行文件的转换.


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


Toubleshooting

文件后缀改为kts之后, app/build.gradle中android关键字被标红.

我就遇到了这个问题, 开始以为没改好, 找不到android关键字了, 各种困惑找原因.

但是我发现build是可以过的.

后来突然IDE弹出一个条: There is a new script context available.

点击了Apply context就可以了.

要是还有问题, 参考一下官方的android sample吧: kotlin-dsl-samples/samples/hello-android


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【织梦cms|织梦技巧】织梦默认作者和默认泉源修改(2021-12-08 10:11)
【织梦cms|织梦技巧】 织梦dedecms差异栏目导航显示差异样式的方式(2021-12-08 10:09)
【织梦cms|织梦技巧】织梦dede新建模型中自定义联动类别调用(2020-03-01 13:52)
【织梦cms|织梦技巧】织梦CMS标签中出现“系统无此标签,可能已经移除”(2020-03-01 13:51)
【织梦cms|织梦技巧】dedecms织梦系统后台验证码图片不显示的解决方法(2020-03-01 13:51)
【织梦cms|织梦技巧】dedecms更新文章会出现空白页(2020-03-01 13:50)
【织梦cms|织梦技巧】让织梦dedecms搜索结果按照点击数排序(2020-03-01 13:48)
【织梦cms|织梦技巧】在dedecms织梦内容页中调用文章缩略图(2020-03-01 13:47)
【织梦cms|织梦技巧】在dedecms织梦添加自制的背景图片(2020-03-01 13:47)
【织梦cms|织梦技巧】修改织梦dedecms幻灯片属性(2020-03-01 13:46)