Groovy DSL 迁移到 Kotlin DSL

245 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

什么是 Kotlin DSL?

DSL是Domain Specific Language的缩写,指的是针对特定领域优化的编程语言。遵循声明性代码格式而不是命令式代码以最小化样板代码。 Kotlin DSL 是 Kotlin 的一个语言特性,它是一个用于 Gradle 脚本的 DSL,使用易于阅读和简单的代码。

构建脚本中使用的对象、函数和属性是从 Gradle API 和应用的插件 API 导入的。

为什么要使用 Kotlin DSL?

为什么我们的项目会考虑从 Groovy DSL 更改为 Kotlin DSL。切换到 Kotlin DSL 具有以下优势:

  • 在编译时检查错误
  • 代码导航
  • 自动完成
  • 语法高亮
  • 通过 IDE 支持改进的编辑环境
  • 使用与源代码相同的语言

另一方面,也有缺点。

  • **当构建缓存无效或干净构建时比 Groovy DSL 慢。
  • 适用于 Java 8 或更高版本
  • 不支持新库版本检查功能

的确经过较长时间的使用,我们发现clean的构建方式非常的缓慢,然而这一部分就是最痛苦的部分,但我们也很难忽视 Kotlin DSL 的优势,给我们带来的便捷。

如何加入Kotlin DSL大军

非常的简单,只是需要将现有的 *.gradle 文件更改为 *.gradle .kts。

build.gradle -> build.gradle.kts

plugin部分

// Groovy版本
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
}

// Kotlin版本
plugins {
    id("com.android.application")
    id ("kotlin-android")
    id ("kotlin-kapt") 
}

android部分

// Groovy版本
android { 
    compileSdkVersion 30 
    buildToolsVersion "30.0.2" 

    defaultConfig { 
        applicationId "com.example.kts" 
        minSdkVersion 22 
        targetSdkVersion 30 
        versionCode 1 
        versionName "1.0" 

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 
    } 

    buildTypes { 
        release { 
            minifyEnabled false 
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 
        } 
    } 

    buildFeatures{ dataBinding 
        = true 
    }

    compileOptions { 
        sourceCompatibility JavaVersion.VERSION_1_8 
        targetCompatibility JavaVersion.VERSION_1_8 
    } 

    kotlinOptions { 
        jvmTarget = '1.8' 
    } 
}

// Kotlin版本
android { 
    compileSdkVersion(30) 
    buildToolsVersion("30.0.2") 

    defaultConfig { 
        applicationId("com.example.kts") 
        minSdkVersion(22) 
        targetSdkVersion(30) 
        versionCode(1) 
        versionName("1.0") 

        testInstrumentationRunner("androidx.test .runner.AndroidJUnitRunner") 
    } 

    buildTypes { 
    	// 使用差别
        getByName("release") { 
            minifyEnabled(false) 
            proguardFiles( 
                getDefaultProguardFile("proguard-android-optimize.txt"), 
                "proguard-rules.pro"
            )
        }
    }
   
    buildFeatures.dataBinding = true 

    compileOptions { 
        sourceCompatibility(JavaVersion.VERSION_1_8) 
        targetCompatibility(JavaVersion.VERSION_1_8) 
    } 

    kotlinOptions { 
        jvmTarget = JavaVersion.VERSION_1_8.toString() 
    } 
}

dependencies 部分

// Groovy版本
dependencies {
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    kapt 'com.google.dagger:dagger-compiler:2.34.1'
}

// Kotlin版本
dependencies {
    implementation("androidx.constraintlayout:constraintlayout:2.0.4")
    testImplementation("junit:junit:4.+")
    androidTestImplementation("androidx.test.ext:junit:1.1.2")
    kapt("com.google.dagger:dagger-compiler:2.34.1")
}

注意:默认情况下所有字符串都用引号(“”)表示。

如何利用buildSrc进行版本控制?

buildSrc 是 Gradle 项目根目录,您可以在其中包含构建逻辑。使用 buildSrc 和 Kotlin DSL,您只需很少的配置即可编写自定义构建代码,并在整个项目中共享此逻辑。更改 buildSrc 会使整个项目的构建缓存失效,因此应避免频繁修改。

  1. 添加一个名为buildSrc的module在应用项目层,一般与app同级,注意名称保持一致。
  2. 添加一个 build.gradle.kts 添加到根目录。
  3. 添加两个Kotlin文件,一个是Version.kt,用于版本管理。一个是Dependencies.kt,用于依赖管理

版本类统一管理版本

object Versions {
    const val constraintlayoutVersion = "2.0.4"
}

依赖类统一管理依赖

object Dependencies {
    const val constraintlayoutDependencies = "androidx.constraintlayout:constraintlayout:${Versions.constraintlayoutVersion}"
}

应用于模块层级build.gradle.kt

dependencies {
    implementation(Dependencies.constraintlayoutDependencies)
}