前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android开发使用Gradle Kotlin的体验与建议

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

作者头像
御剑
发布2023-03-06 14:49:10
1.6K0
发布2023-03-06 14:49:10
举报
文章被收录于专栏:微言码道

对于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.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微言码道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Gradle Kotlin与Grovvy
  • 迁移到Gradle Kotlin
  • 建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档