Android开发使用Gradle Kotlin的体验与建议

2023-03-06 14:49:10 浏览数 (2)

对于Android开发来说,Gradle是必不可少的. 而对于Android来说,并不像后端Java一样,有类似Maven这样的替代选择. Gradle几乎是唯一选择

而长久以来,使用Groovy Gradle是最常见的. 但自从Android把Kotlin视为第一语言进行支持,而Gradle在Groovy之外,也很快添加了Kotlin DSL支持之后, 使用Kotin DSL来替代Groovy就成为可能.

基于对Kotlin的喜爱,以及在Java后台编码中我是使用的Gradle Kotlin而非Grovvy,所以对在Android开发中也想尝试与体验下使用Kotlin而非Grovvy.

Gradle Kotlin与Grovvy

对于Gradle Kotlin,你需要谨慎的考虑是否有必要,对于Android开发来说,迁移KTS的优势在于:

  • • KTS是基于Kotlin语言的, 而Kotlin现在也是Android开发的第一语言. 使用KTS意味着语言上是一致的,你能更熟悉灵活的使用Gradle
  • • Android已经申明未来会更偏向于优先支持KTS而非Grovvy
  • • 源自IDEA的Android Studio对Kotlin支持更好 (Kotlin是由IDEA背后的公司开发的语言)

缺点在于:

  • • 当前,Gradle KTS可能Grovvy构建要慢, 注重编译性能的可能需要对此点特别关注
  • • Android Studio创建Android项目时,只能生成Groovy,而没有生成KTS的选择

迁移到Gradle Kotlin

由于Android Studio并未提供创建时是选择Grovvy还是Kotlin. 所以,现在想使用Kotlin DSL,你得在Grovvy基础之上,手动迁移.

下文简要描述下,如何从Grovvy迁移至KTS

而Gradle是使用Grovvy还是Kotlin DSL的唯一区别就是文件名的后缀,但凡.gradle则表明它是基于Grovvy的,而.gradle.kts则表明它是Kotlin

迁移方式

Gradle项目同时支持Grovvy以及KTS,这意味着你甚至可以有些是.gradle,有些是.gradle.kts,把它们混合起来都是允许的

所以,最佳的迁移方式是:渐进式迁移

也就是,修改完一个文件,编译通过,再修改下一个,按照这样的步骤来迁移

而对于Android Gradle来说,主要是以下一些文件需要修改与迁移

  • • setting.gradle
  • • build.gradle
  • • app/build.gradle 或其它子模块的build.gradle

接下来详细说明如何对这些文件进行迁移

1. 迁移setting.gradle

基于Groovy的setting.gradle通常如下所示:

代码语言:javascript复制
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven {
            url "https://maven.myddd.org/releases"
        }
        google()
        mavenCentral()
    }
}

rootProject.name = "My Application"
include ':app'

把它重命名为setting.gradle.kts

代码语言:javascript复制

//pluginManagement一致,无需修改
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
      //自定义maven时,url设置需要修改
        maven {
            setUrl("https://maven.myddd.org/releases/")
        }
        google()
        mavenCentral()
    }
}
//1. 使用括号
//2. Kotlin DSL中不能使用单引号,一律改为双引号
include(":app")
  • • 添加其它maven仓库时,使用seturl("")来进行定义
  • • include定义时,使用括号双引号

迁移完这一步后,重新编译与运行APP,保证正常使用

  1. 2. 迁移根目录下的build.gradle

基于Groovy的根目录下的build.gradle

代码语言:javascript复制
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.3.1' apply false
    id 'com.android.library' version '7.3.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
}

将其重命名为build.gradle.kts,并将内容修改如下

代码语言:javascript复制
plugins {
   // 1. 使用括号与双引号
    id("com.android.application") version "7.3.1" apply false
    id("com.android.library") version "7.3.1" apply false
    id("org.jetbrains.kotlin.android") version "1.6.10" apply false
}

//添加clean支持
tasks.register("clean", Delete::class) {
    delete(rootProject.buildDir)
}

同样切记,迁移完这一步后,重新编译与运行APP,保证正常使用

  1. 3. 迁移app下的build.gradle

这一部分的迁移是重点,着重解释下

将名称修改为build.gradle.kts,并依次修改如下内容

  1. 3.1 修改plugins定义,参照如下
代码语言:javascript复制
plugins {
   //plugins中使用括号与双引号
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}
  1. 3.2 修改android定义中的defaultConfig
代码语言:javascript复制
android {
    //使用=号,以及双引号进行定义
    defaultConfig {
        applicationId = "org.myddd.app"
        minSdk = 23
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
}
  • • 使用=号与双引号来定义属性值
  1. 3.3 修改android定义中的signingConfigs定义
代码语言:javascript复制
android {
      signingConfigs {
        create("release") {
            storeFile = file("./lingne-android")
            storePassword = "123456"
            keyAlias = "LINGEN"
            keyPassword = "123456"
        }
    }
}
  • • 使用create("release")来定义release的signingConfigs
  • • 使用=号与双引号来定义属性值
  1. 3.4 修改android定义中的buildType
代码语言:javascript复制

android {
      buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            signingConfig = signingConfigs.getByName("release")
            proguardFiles(
                getDefaultProguardFile("proguard-android.txt"),
                "proguard-rules.pro"
            )
        }
    }
}
  • • 使用getByName("release")以及getByName("debug")来定义release以及debug的buildTypes
  • • 其它自已添加的buildTypes,要使用create('antoherType')

3.5如果有flavor定义,同样需要修改

代码语言:javascript复制
android {
   flavorDimensions  = "version"

    productFlavors {
        create("another") {
            dimension = "version"
            applicationId = "com.another.app"
            versionCode = 1
        }
    }
}
  • • 使用create('another')这样的方式来定义一个flavor
  • • 使用=号与双引号来定义属性值

3.6 修改dependencies

代码语言:javascript复制

dependencies {
    implementation("androidx.core:core-ktx:1.7.0")
    implementation("androidx.appcompat:appcompat:1.5.1")
    implementation("com.google.android.material:material:1.7.0")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.4")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0")
}
  • • dependencies的修改,只需要使用括号 双引号就可以了

建议

基本上面这些基础的就足够了,如果需要迁移其它模块或第三方模块,基本也都是这些元素.

这种方式我也尝试与体验了下,相对来说,比Grovvy在语法识别,易读性上,Kotlin版本确实优秀一些.

但是,基于以下两个原因,个人认为在Android使用Kotlin Gradle的必要性并不充分,包括:

  1. 1. Kotlin Gradle比Grovvy Gradle性能要差, 而Andrid本身开发就非常吃性能,大型Android项目使用Kotlin Gradle当前并不是非常好的选择
  2. 2. 创建Android项目时默认就是Groovy,并且Grovvy Gradle已经非常成熟,而Android开发中,又不存在频繁的修改Gradle. 使用Gradle Grovvy当前完全没有任何问题

因此,对于Android开发当前仍然建议继续使用Gradle Grovvy.

0 人点赞