Android Gradle脚本从Groovy迁移到Kotlin DSL
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
参考
- 我的Android项目sample: KotlinDSLSample
- 迁移文档: Migrating build logic from Groovy to Kotlin
- 官方samples: kotlin-dsl-samples
- 官方samples里面的android sample: kotlin-dsl-samples/samples/hello-android
Android Gradle脚本从Groovy迁移到Kotlin DSL的更多相关文章
- Android Gradle defaultConfig详解及实用技巧
实际项目中,都会应用Android Gradle Plugin,根据实际中的项目模块的职责,可以具体应用如下四种插件类型. 1,apply plugin: 'com.android.applicati ...
- Android Gradle 构建工具(Android Gradle Build Tools)是什么?
转载地址:http://mrfu.me/android/2015/07/17/New_Android_Gradle_Build_Tools/ 译者地址:[翻]一览新的 Android Gradle 构 ...
- 一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5
译者地址:[翻]一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5 原文:First Look at New Android Gradle Build To ...
- 【Gradle】Android Gradle 插件
Android Gradle 插件 Android Gradle 插件简介 从Gradle角度来看,Android其实是Gradle的一个第三方插件,它是由Google的Android团队开发的.但从 ...
- 从编程的角度理解gradle脚本﹘﹘Android Studio脚本构建和编程[魅族Degao]
本篇文章由嵌入式企鹅圈原创团队.魅族资深project师degao撰写. 随着Android 开发环境从Eclipse转向Android Studio,我们每一个人都開始或多或少要接触gradle脚本 ...
- Android Gradle 完整指南(转)
本文转载来自:http://www.jianshu.com/p/9df3c3b6067a 为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前 ...
- Android Gradle 完整指南
为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前和之后都有对应更快的编译工具出现,但是 Gradle 的优势就在于它是亲儿子,Gradle ...
- Android Gradle 自定义Task 详解
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 一:Gradle 是什么 Gradle是一 ...
- Android gradle 自定义插件
Gradle 的插件有三种打包方式: 构建脚本:插件逻辑写在 build.gradle 中,适用于逻辑简单的任务,但是该方式实现的插件在该构建脚本之外是不可见的,只能用于当前脚本. buildSrc项 ...
随机推荐
- [转载] 虚拟机3种网络模式(NAT, Host-only, Bridged)
实例讲解虚拟机3种网络模式(桥接.nat.Host-only) 转载自:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html ...
- html(四)数据库curd操作与分页查询
数据库操作curd : 1.首先要建立项目处理好自己逻辑包: 其中util工具包中建立两个工具类 jdbc连接和page分页 DBUtil.java: db工具类就是用于连接数据库的jdbc架包,里面 ...
- HDU 6438"Buy and Resell"(贪心+优先级队列)
传送门 •参考资料 [1]:HDU6438(优先队列+思维) •题意 有n个城市,第 i 天你会达到第 i 个城市: 在第 i 个城市中,你可以用 ai 元购买一个物品,或者用 ai 元卖掉一个物品, ...
- 中和IOS七层架构和TCP/IP四层架构的五层架构
五层架构分别为应用层.运输层.网络层.数据链路层.物理层. IOS架构把应用层又细分为应用层.表示层.会话层 TCP/IP把网络层改名网际层,数据链路层和物理层结合成网络接口层 其实只要学习五层协议, ...
- P1020 从大到小排序
题目描述 给你n个整数,请你按照从大到小的顺序输出它们. 输入格式 输入的第一行包含一个整数 \(n(1 \le n \le 10^3)\) ,用于表示元素的个数. 输入的第二行包含 \(n\) 个整 ...
- win10 uwp 使用 Border 布局
在 UWP 写一个界面需要将元素排列,在排列元素的时候有特殊的元素叫容器.容器的意思是元素里面包含元素,在 UWP 用到的容器有很多,也可以自己写一个.简单的容器是 Border 边框控件,如控件说的 ...
- 51nod 1282 时钟
1282 时钟 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有N个时钟,每个时钟有M个指针,P个刻度.时钟是圆形的,P个刻度均分 ...
- H3C使用tracert命令--用户视图
<H3C>tracert ? -a 指明 ...
- chrome查看当前网页cookie内容
按下F12,打开开发者工具 然后点开Application,在点击cookie左侧的小三角,选择网页,就可以看见对应的cookies了
- CF809D Hitchhiking in the Baltic States
CF809D Hitchhiking in the Baltic States CF809D 长度为n的序列{xi},n<=3e5,范围在(li,ri)之间,求LIS最长是多长g(i,l)表示前 ...