概述
众所周知,我们在 Android Studio 是使用 Gradle 来编译的,Gradle 是一种基于 Groovy 语言的构建工具,我们平时看到的 build.gradle 中的语法结构其实就是 Groovy 提供的 DSL 功能。
DSL 的全称是领域特定语言(Domain Specific Language),它是编程语言赋予开发者的一种特殊能力,通过它我们可以编写出一些看似脱离其原始语法结构的代码,从而构建出一种专有的语法结构。
毫无疑问,Kotlin 是支持 DSL 的,而且 Gradle 是支持用 Kotlin 语言来编写 Gradle 的构建脚本的,并且 Gradle 官网 也给出了 Groovy 迁移 Kotlin 的指导文章。
我们来新建一个项目来从 0 将 Gradle 文件改造成由 Kotlin 编写的。
Gradle 脚本改造
一个基于 Gradle 构建的 Android 项目,Gradle 的配置文件一般就只有以下这几种:
- setting.gradle
- app/build.gradle
- project/build.gradle
所以我们改造无非就是对这几个文件进行改造。
改造 settings.gradle
这个文件的主要功能就是负责我们项目中 Module 的声明,我们先来看下它原先的代码,如下所示:
include ':app'
rootProject.name = "KotlinGradleDSL"
这段代码很简单,就是声明了 app 这个主 Module,同时定义了我们 project 的名称,我们可以通过 kotlin 的语法进行改写,在改写之前我们先将文件的名字修改成 settings.gradle.kts,改造后的代码如下所示:
include("app")
rootProject.name = "KotlinGradleDSL"
rootProject.buildFileName = "build.gradle.kts"
改造 project/build.gradle
同样我们需要将 build.gradle 的文件名改成 build.gradle.kts,我们先来看下它原先的代码,如下所示:
buildscript {
ext.kotlin_version = "1.4.31"
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
改造后的代码如下所示:
buildscript {
val gradle_version = "4.1.3"
val kotlin_version = "1.4.31"
repositories {
google()
jcenter()
}
dependencies {
classpath("com.android.tools.build:gradle:$gradle_version")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
}
}
allprojects {
repositories {
google()
jcenter()
}
}
tasks {
val clean by registering(Delete::class) {
delete(buildDir)
}
}
在 Groovy 中,我们有一个 ext 的扩展,但是在 Kotlin 中是没有的,所以我们只能自己先声明一个局部变量,然后通过字符串模板引入,还有就是 classpath 引入的全局依赖,我们是要用大括号括起来,还有一个 clean 的任务,这个也是需要改写的。
接下来,我们来改写一下内容最多的 app/build.gradle。
改造 app/build.gradle
app/build.gradle 里面的内容很多,我们来看每个模块应该怎么改造。
插件的引入改造
Groovy 语法的插件引入如下所示:
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
利用 Kotlin 可以改造成下面这样:
plugins {
id("com.android.application")
kotlin("android")
kotlin("android.extensions")
}
SDK 的引入改造
Groovy 语法的 SDK 引入如下所示:
compileSdkVersion 30
buildToolsVersion "30.0.3"
利用 Kotlin 可以改造成下面这样:
compileSdkVersion(30