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是静态类型.
  • 不用一次性迁移完: 两种语言的脚本可以共存, 也可以互相调用.

缺点:

迁移步骤

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.gradleandroid关键字被标红.

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

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

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

    点击了Apply context就可以了.
  • 要是还有问题, 参考一下官方的android sample吧: kotlin-dsl-samples/samples/hello-android

参考

Android Gradle脚本从Groovy迁移到Kotlin DSL的更多相关文章

  1. Android Gradle defaultConfig详解及实用技巧

    实际项目中,都会应用Android Gradle Plugin,根据实际中的项目模块的职责,可以具体应用如下四种插件类型. 1,apply plugin: 'com.android.applicati ...

  2. Android Gradle 构建工具(Android Gradle Build Tools)是什么?

    转载地址:http://mrfu.me/android/2015/07/17/New_Android_Gradle_Build_Tools/ 译者地址:[翻]一览新的 Android Gradle 构 ...

  3. 一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5

    译者地址:[翻]一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5 原文:First Look at New Android Gradle Build To ...

  4. 【Gradle】Android Gradle 插件

    Android Gradle 插件 Android Gradle 插件简介 从Gradle角度来看,Android其实是Gradle的一个第三方插件,它是由Google的Android团队开发的.但从 ...

  5. 从编程的角度理解gradle脚本﹘﹘Android Studio脚本构建和编程[魅族Degao]

    本篇文章由嵌入式企鹅圈原创团队.魅族资深project师degao撰写. 随着Android 开发环境从Eclipse转向Android Studio,我们每一个人都開始或多或少要接触gradle脚本 ...

  6. Android Gradle 完整指南(转)

    本文转载来自:http://www.jianshu.com/p/9df3c3b6067a 为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前 ...

  7. Android Gradle 完整指南

    为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前和之后都有对应更快的编译工具出现,但是 Gradle 的优势就在于它是亲儿子,Gradle ...

  8. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 一:Gradle 是什么 Gradle是一 ...

  9. Android gradle 自定义插件

    Gradle 的插件有三种打包方式: 构建脚本:插件逻辑写在 build.gradle 中,适用于逻辑简单的任务,但是该方式实现的插件在该构建脚本之外是不可见的,只能用于当前脚本. buildSrc项 ...

随机推荐

  1. Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略

    在前面两篇文章中,我们用一个框架梳理了各大优化算法,并且指出了以Adam为代表的自适应学习率优化算法可能存在的问题.那么,在实践中我们应该如何选择呢? 本文介绍Adam+SGD的组合策略,以及一些比较 ...

  2. 2013年NOIP普及组复赛题解

    题目涉及算法: 计数问题:枚举: 表达式求值:栈: 小朋友的数字:动态规划: 车站分级:最长路. 计数问题 题目链接:https://www.luogu.org/problem/P1980 因为数据量 ...

  3. C# 操作XML学习笔记

    1. Customers.xml <?xml version="1.0" encoding="utf-8"?> <cust:customers ...

  4. java.util.NoSuchElementException: No value present

    错误: java.util.NoSuchElementException: No value present 原因: 经查询博客Java 8 Optional类深度解析发现,究其原因为: 在空的Opt ...

  5. CCPC2018 桂林 D "Bits Reverse"

    传送门 题目描述 Now given two integers x and y, you can reverse every consecutive three bits ,,) means chan ...

  6. 第3本:Visual Studio程序员箴言

    第3本:Visual Studio程序员箴言 Visual Studio 2010是我经常使用的程序开发工具,也知道VS中有大量的快捷键可以帮助提高效率,可惜就是不愿意记忆,最近在学vim的时候快速把 ...

  7. 对象转json字符串案例

    测试对象与json字符串的转换 json字符串转对象 Stringstr = "{\"id\":\"1001\",\"name\" ...

  8. 2019-8-31-C#-匹配可空变量

    title author date CreateTime categories C# 匹配可空变量 lindexi 2019-08-31 16:55:58 +0800 2019-06-01 08:40 ...

  9. C# 如何解析XML

  10. Unitils集成DBUnit、Spring-单元测试(转)

    1.maven-pom文件中引入相关jar包 <!-- Unitils -dbunit.Spring --> <dependency> <groupId>org.u ...