Android应用开发中,离不开Gradle脚本的构建。大部分Android开发同窗忽视了脚本的力量,甚至有很大一部分同窗不知道Gradle脚本是什么,用什么语言编写的;固然,也有至关一部分同窗知道Gradle脚本是使用Groovy语言编写的,但对于Groovy语言却一窍不通,只是勉强能够看懂Gradle脚本。正所谓,知其然,但并不知其因此然...html
换个角度看问题,熟练掌握Gradle脚本还须要精通Groovy语言,这对Android开发同窗来讲的确是一个不小的挑战。这种Java + Groovy的开发套餐对于普通的Android开发者来讲的确存在必定的知识断层,显而易见的是,部分同窗写的Gradle脚本简直“不堪入目”。时间回到去年5月份,Google IO大会上宣布了一个重磅消息,Android官方开始支持使用Kotlin语言进行应用开发。其实,在这个时间节点上,我已经在生产环境使用Kotlin开发Android将近一年。对于我来讲,这无疑是一个让人欣喜若狂的消息。但,惊喜还远远不止这些,过了一段时间,我又看到了这篇文章 Kotlin Meets Gradle。颇有诗意的标题:当Gradle邂逅Kotlin,文章的核心意思是:Gradle团队正在尝试使用Kotlin语言做为Gradle脚本的官方开发语言。android
我想,也许,Android开发者的春天就要到了!git
在写Gradle脚本的时候,最痛苦的莫过于没有任何提示,惟一的调试手段就是使用print方法打印调试日志。正如 Kotlin Meets Gradle 文中所说,当你使用Kotlin语言编写Gradle脚本的时候,你会发现一切都变得有趣起来。忽然:github
固然,惊喜还不止这些,当你开始决定使用Kotlin语言的时候,仿佛一切都变得美好了起来!编程
好了,废话很少说,接下来咱们开始尝试用Kotlin语言编写Gradle脚本。因为当前 kotlin-dsl 正处于预发布状态(kotlin-dsl的最新版本是0.14.2,对应Gradle插件版本4.5),IDE的支持也不完善,为了更好的体验该功能,推荐你们使用以下配置:bash
操做系统: macOS 10.13.2闭包
Android Studio: 3.1 Canary 9app
Gradle Wrapper: 4.5ide
Gradle Plugin: 3.1.0-alpha9学习
Kotlin:1.2.21
首先,按照以往步骤建立一个Android工程:
接下来,改造开始,Gradle Script Kotlin脚本以.gradle.kts
后缀结尾。所以,咱们先将工程根目录settings.gradle
改名为settings.gradle.kts
。
这个地方的错误有两个缘由:
infix
修饰的方法中能够省略括号。这里显然是一个正常调用方法。所以,咱们修改成:include("app")
复制代码
接下来,修改根目录的build.gradle
脚本,用一样的方式修改后缀,方法修改成括号调用,修改后的内容以下:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
// 这里修改成括号调用便可
classpath("com.android.tools.build:gradle:3.0.1")
}
}
allprojects {
repositories {
google()
jcenter()
}
}
复制代码
注意:在修改后缀名称的时候IDE会出现警告提示,这里能够忽略,选择continue便可。
因为咱们手动修改了build.gradle
脚本,为了保证工程可使用这个脚本,须要在settings.gradle.kts
中添加一行代码,让Gradle知道使用build.gradle.kts
脚本构建。所以,最后的settings.gradle.kts
代码以下:
include("app")
rootProject.buildFileName = "build.gradle.kts"
复制代码
最后一步,修改app模块build.gradle
文件,这也是最复杂的一步,修改完后缀名后,你会看到整个脚本所有被红色标识错误:
别慌!仍是同样的方式,这里咱们先将这里的全部代码注释掉。在最上方逐一对应修改,apply plugin
部分修改成:
plugins {
id("com.android.application")
}
复制代码
接下来,修改android {}
闭包部分。这里有两个小技巧,因为目前IDE的支持不是很完善,在输入的时候稍微等待一段时间,IDE会给出相应的提示。另外,若是没有提示,例如android {}
闭包就没有任何提示,输入完成后展开右侧gradle面板,选择gradle/buid setup/init
,双击执行:
在底部面板能够看到任务执行是否成功。注意,即便任务执行成功,脚本依然可能被红色标识,这是IDE支持不完善致使的,能够忽略。
修改完成后的内容以下:
android {
compileSdkVersion(27)
buildToolsVersion("27.0.2")
defaultConfig {
applicationId = "com.youngfeng.kotlindsl"
minSdkVersion(15)
targetSdkVersion(27)
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
getByName("release") {
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
}
复制代码
注意:你在使用的过程当中,依然可能会遇到不管如何都不生效的问题。这个时候别着急,使用./gradlew assembleDebug
命令调试,查看终端找到错误缘由。Windows用户去掉./
执行便可。
最后的依赖部分,一样地,所有修改成括号调用便可。这里就不赘述了,文章的最后部分会提供操做视频,在使用过程当中有任何问题能够打开操做视频参考,若是依然不能解决,能够在文章下方给我留言,我会在第一时间给你答复。修改后的内容以下:
dependencies {
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
implementation("com.android.support:appcompat-v7:26.1.0")
implementation("com.android.support.constraint:constraint-layout:1.0.2")
testImplementation("junit:junit:4.12")
androidTestImplementation("com.android.support.test:runner:1.0.1")
androidTestImplementation("com.android.support.test.espresso:espresso-core:3.0.1")
}
复制代码
经过上面的步骤,从Groovy转换到Kotlin的步骤已经所有完成,你能够在终端输入./gradlew assembleDebug
测试是否能够正常构建了:
上面的步骤虽然完成了脚本的转换,但依赖的管理依然是混乱的,为了实现相似 Snake 工程的统一依赖管理,咱们还须要作一些工做。
Gradle官方提供了使用 buildSrc 目录实现自定义任务和插件逻辑,这里咱们可使用它完成依赖的统一处理,一个完整的buildSrc目录结构以下:
Deps类中,能够这样定义依赖结构:
object deps {
object plugin {
val gradle = "com.android.tools.build:gradle:3.1.0-alpha09"
val kotlin = "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.21"
}
object kotlin {
val stdlibJre7 = "org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.21"
}
object android {
object support {
val compat = "com.android.support:appcompat-v7:27.0.2"
val constraintLayout = "com.android.support.constraint:constraint-layout:1.0.2"
}
object test {
val junit = "junit:junit:4.12"
val runner = "com.android.support.test:runner:1.0.1"
val espressoCore = "com.android.support.test.espresso:espresso-core:3.0.1"
}
}
}
复制代码
定义以后,咱们就能够在脚本中直接引用了:
dependencies {
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
implementation(deps.kotlin.stdlibJre7)
implementation(deps.android.support.compat)
implementation(deps.android.support.constraintLayout)
testImplementation(deps.android.test.junit)
androidTestImplementation(deps.android.test.runner)
androidTestImplementation(deps.android.test.espressoCore)
}
复制代码
是否是漂亮了许多?
至此,整个转换过程就顺利完成了,为了保证转换的成功率,我推荐使用文章开头的实验室配置。若是版本太低,不保证能够转换成功。最新版本的kotlin-dsl会跟随最新版本的Gradle插件发布,所以必定要使用最新版本。另外,目前IDE对kts的支持依然不完善,即便正确的写法也会报错,这个必定要注意,不要被IDE欺骗了。
虽然使用Kotlin语言写脚本是一件很是美妙的事情,但目前依然存在一些问题:
所以,目前我并不推荐你在生产环境中使用,但能够做为平常学习练手之用。预计1.0版本的发布在今年6月份左右,正式版本发布后,我推荐你当即将Gradle脚本转换到Kotlin语言。
在使用的过程当中,按照文章一样的步骤,你依然可能会遇到不少问题。所以,我为你整理了目前互联网上能够参考的资料,你能够收藏这篇文章。遇到问题别慌,来这里查找答案。
关于kotlin-dsl的开发路线图,请看这篇文章:blog.gradle.org/kotlin-scri…
若是你在使用过程当中,遇到了任何问题,而且肯定是 kotlin-dsl 的bug,请点这里:github.com/gradle/kotl… 并推送 issue
若是你遇到了知识盲点,而且在Google找不到答案。能够来 Slack#gradle频道反馈,我在 Slack 的昵称是Scott Smith,也欢迎你给我发送私信消息。
本篇文章例子完整代码,请点击这里:github.com/yuanhoujun/…
kts文档正在编写当中,具体进度,请点这里:github.com/gradle/kotl…
若是你也喜欢Kotlin语言,欢迎加入个人Kotlin交流群: 329673958 ,一块儿来参与Kotlin语言的推广工做。
得到更好阅读体验,请阅读原文:www.jianshu.com/p/8fdfbcf35…