做者:
shusheng007
, 地址:https://blog.csdn.net/ShuSheng0007/article/details/106763989android
概述
经过秒懂Gradle之从彻底懵逼到是懂非懂
熟悉了gradle,达到了是懂非懂的境地,今天让咱们实战演练一下,此演练具备实际意义,若是你愿意彻底能够将其用在实际项目中。git
Gradle从5.0就已经支持Kotlin DSL1.0
了,说明Gadle从5.0开始已经准备好在生产上使用了,况且如今已经发展到6.5了,时机已经很成熟。程序员
Android Studio 4.0 对应的gradle 插件为4.0,对应的Gradle为6.1.1
了,因此是时候尝试一下使用kotlin DSL
写gradle脚本了。github
为何要用Kotlin DSL写gradle脚本
撇开其余方面,就单从提升程序员生产效率方面就有不少优势:web
-
脚本代码自动补全 -
跳转查看源码 -
动态显示注释 -
支持重构(Refactoring) -
…
怎么样,要是你经历过groovy
那使人蛋疼的体验,kotlin会让你爽的起飞,接下来让咱们开始吧。微信
从Groovy到Kotlin
让咱们使用Android Studio 新建一个Android项目,AS默认会为咱们生成3个gradle脚本文件。架构
-
settings.gradle
(属于 project) -
build.gradle
(属于 project) -
build.gradle
(属于 module)
咱们的目的就是转换这3个文件app
第一步: 修改groovy语法到严格格式
groovy既支持双引号""
也支持单引号''
,而kotlin只支持双引号,因此首先将全部的单引号
改成双引号
。编辑器
例如 include ':app' -> include ":app"
ide
groovy方法调用能够不使用()
可是kotlin方法调用必须使用()
,因此将全部方法调用改成()
方式。
例如
implementation "androidx.appcompat:appcompat:1.0.2"
改成
implementation ("androidx.appcompat:appcompat:1.0.2")
groovy 属性赋值能够不使用=,可是kotlin属性赋值须要使用=,因此将全部属性赋值添加=。
例如
applicationId "com.ss007.gradlewithkotlin"
改成
applicationId = "com.ss007.gradlewithkotlin"
完成以上几步,准备工做就完成了。
第二步:修改文件名并转换
因为gradle支持groovy
与kotlin
脚本混编,因此咱们每转换完一个文件就同步一下,确保没有错误。
-
一、转换 setting.gradle
文件
将文件名加上kts后缀为setting.gradle.kts
而后将内容修改成以下所示(其实完成第一步后就不用作修改了,和groovy一毛同样,)
include(":app")
rootProject.name = "GradleWithKotlinDsl"
-
二、转换project的 build.gradle
文件
将文件名加kts后缀为build.gradle.kts
而后将内容修改成以下所示:
buildscript {
var kotlinVersion: String by extra
kotlinVersion="1.3.72"
repositories {
google()
jcenter()
}
dependencies {
classpath ("com.android.tools.build:gradle:4.0.0")
classpath ("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
tasks.register<Delete>("clean") {
delete(rootProject.buildDir)
}
这个文件转换有两个地方须要注意:
第一:
buildscript{}
里的ext.kotlin_version'
改成var kotlinVersion: String by extra
,关于extension object
这块,kotlin表现的不如groovy优秀,比较啰嗦。第二: task 的申明方式变了
-
三、转换 module
的build.gradle
文件
这个是咱们的重点要转换的了,也最为复杂。首先将文件名加kts后缀为build.gradle.kts
。
而后修改内容以下:
plugins {
id("com.android.application")
kotlin("android")
kotlin("android.extensions")
}
android {
compileSdkVersion (29)
buildToolsVersion ("30.0.0")
defaultConfig {
applicationId = "top.ss007.gradlewithkotlindsl"
minSdkVersion (21)
targetSdkVersion (29)
versionCode= 1
versionName= "1.0"
testInstrumentationRunner="androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles (getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
}
dependencies {
implementation (fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
implementation ("org.jetbrains.kotlin:kotlin-stdlib:1.3.72")
implementation ("androidx.core:core-ktx:1.3.0")
implementation ("androidx.appcompat:appcompat:1.1.0")
implementation ("androidx.constraintlayout:constraintlayout:1.1.3")
testImplementation ("junit:junit:4.12")
androidTestImplementation ("androidx.test.ext:junit:1.1.1")
androidTestImplementation ("androidx.test.espresso:espresso-core:3.2.0")
}
有3处须要特殊处理
-
第一:插件的引入方式从 apply plugin
到声明式
plugins{
id(xxx)
...
}
-
第二: buildTypes{}
块里面获取buildType
的方式有变化。
由于buildTypes
块里面的类型为NamedDomainObjectCollection<BuildType>``,其不存在名为
release的方法。而是经过
release这个name可获取到一个
BuildType类型的对象。而这个对象里面有一个方法叫
setMinifyEnabled(false),写成属性调用方式为
isMinifyEnabled = false`。
-
第三: dependencies{}
块里面编译lib 文件夹中jar
文件的内容有变化
dependencies {
implementation (fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
}
咱们看一下fileTree那个方法的签名
ConfigurableFileTree fileTree(Map<String, ?> args);
可见其须要一个Map的入参
完成以上几步后同步一下gradle脚本就ok了。
到目前为止一切都工做正常,可是在实际项目中咱们常用project下的gradle脚本的一个extension object
来统一维护版本号,以下所示:
ext{
// Android config
androidBuildToolsVersion = "30.0.0"
...
}
可是在kotlin里面从其余模块下访问不到project
下的extra
,因此须要使用buildSrc
的方式
使用buildSrc改进维护性
在根目录下建立一个buildSrc
目录,当构建时gradle会自动包括此目录下的文件,在全部gradle文件中都是能够访问到这里面的类,咱们能够将版本号统一维护在这里。
其文件结构以下:
Config 文件内容以下
object Config {
object Android {
const val buildToolsVersion = "30.0.0"
const val minSdkVersion = 21
const val targetSdkVersion = 29
const val compileSdkVersion = 29
const val applicationId = "top.ss007.gradlewithkotlindsl"
const val versionCode = 1
const val versionName = "1.0"
}
object AndroidLib{
const val appcompatVersion= "1.1.0"
const val constraintLayoutVersion="1.1.3"
}
...
}
而后就能够在gradle文件中引用里面的值了,例如:
defaultConfig {
applicationId = Config.Android.applicationId
minSdkVersion (Config.Android.minSdkVersion)
...
}
dependencies {
...
implementation ("androidx.appcompat:appcompat:${Config.AndroidLib.appcompatVersion}")
implementation ("androidx.constraintlayout:constraintlayout:${Config.AndroidLib.constraintLayoutVersion}")
}
总结
整体来讲,Gradle团队已经拥抱Kotlin了,教程也是groovy
和kotlin
共存的,相信kotlin
在gradle
的使用中会愈来愈多的,说不定哪天android studio的模板项目就会使用kotlin
做为默认gradle
脚本的,毕竟kotlin
已是Android开发的首推语言了。
若是要深刻了解,能够参考官网相关部分 Gradle Kotlin DSL Primer
本文源码:https://github.com/shusheng007/GradleWithKotlinDsl
---END---
更文不易,点个“在看”支持一下👇
本文分享自微信公众号 - 技术最TOP(Tech-Android)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。