将 build.gradle 配置从 Groovy 迁移到 Kotlin

目录

时间轴

常用术语

脚本文件命名

转换语法

为方法调用添加圆括号

为分配调用添加 =

转换字符串

重命名文件扩展名

将 def 替换为 val 或 var

为布尔值属性添加 is 前缀

转换列表和映射

配置 build 类型

从 buildscript 迁移到插件块

查找插件 ID

执行重构

转换 plugins 块

其他

已知问题

如何报告问题

更多资源


Android Gradle 插件 4.0 支持在 Gradle build 配置中使用 Kotlin,以替代 Groovy(Gradle 配置文件中通常使用的编程语言)。

在编写 Gradle 脚本方面,Kotlin 比 Groovy 更优,因为 Kotlin 更易于阅读,并且提供了更好的编译时检查和 IDE 支持。

虽然与 Groovy 相比,Kotlin 目前在 Android Studio 的代码编辑器中提供了更好的集成,但使用 Kotlin 的 build 往往比使用 Groovy 的 build 慢,因此在决定是否迁移时,请考虑 build 性能。

本页介绍了有关将 Android 应用的 Gradle build 文件从 Groovy 转换为 Kotlin 的基本信息。如需查看更全面的迁移指南,请参阅 Gradle 的官方文档。

时间轴

注意 :从 Android Studio Giraffe 开始,Kotlin 是 build 配置的默认语言。如果您使用 AGP 8.1 和 Kotlin DSL 进行 build 配置,建议您使用 Gradle 8.1 以获得最佳体验。

从 Android Studio Giraffe 开始,新项目将默认使用 Kotlin DSL (build.gradle.kts) 进行 build 配置。与 Groovy DSL (build.gradle) 相比,这种方法具有语法突出显示、代码补全和声明导航等功能,可提供更好的修改体验。如需了解详情,请参阅 Gradle Kotlin DSL Primer。

常用术语

Kotlin DSL:主要是指 Android Gradle 插件 Kotlin DSL,有时也指底层 Gradle Kotlin DSL。

在本迁移指南中,“Kotlin”和“Kotlin DSL”可以互换使用。同样,“Groovy”和“Groovy DSL”可互换使用。

脚本文件命名

脚本文件扩展名取决于编写 build 文件所用的语言:

  • 用 Groovy 编写的 Gradle build 文件使用 .gradle 文件扩展名。
  • 用 Kotlin 编写的 Gradle build 文件使用 .gradle.kts 文件扩展名。

转换语法

Groovy 和 Kotlin 的语法之间存在一些普遍差异,因此您需要在 build 脚本中应用以下更改。

为方法调用添加圆括号

提示:首先,在更改文件扩展名之前,最好先在 Groovy 代码中添加圆括号。这样可以更轻松地转换为 Kotlin。

Groovy 允许您在方法调用中省略圆括号,而 Kotlin 则要求使用圆括号。如需迁移配置,请为这些类型的方法调用添加圆括号。以下代码展示了如何在 Groovy 中配置设置:

compileSdkVersion 30

以下是使用 Kotlin 编写的相同代码:

compileSdkVersion(30)

为分配调用添加 =

提示:在更改文件扩展名之前,请在 Groovy 代码中添加 =。这样可以更轻松地转换为 Kotlin。

Groovy DSL 允许您在分配属性时省略赋值运算符 =,而 Kotlin 则需要使用它。以下代码展示了如何在 Groovy 中分配属性:

java {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17
}

以下代码展示了如何在 Kotlin 中分配属性:

java {sourceCompatibility = JavaVersion.VERSION_17targetCompatibility = JavaVersion.VERSION_17
}

转换字符串

以下是 Groovy 和 Kotlin 在字符串方面的差异:

  • 用于定义字符串的双引号:虽然 Groovy 允许使用单引号来定义字符串,但 Kotlin 要求使用双引号。
  • 基于句点表达式的字符串插值:在 Groovy 中,对于句点表达式的字符串插值,您可以仅使用“$”前缀,但 Kotlin 要求您用大括号将句点表达式括起来。例如,在 Groovy 中,您可以使用如以下代码段所示的 $project.rootDir

        myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro"

    不过,在 Kotlin 中,上述代码会针对 project(而非 project.rootDir)调用 toString()。如需获取根目录的值,请使用大括号括住 ${project.rootDir} 表达式:

        myRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro"

    如需了解详情,请参阅 Kotlin 文档中的字符串模板。

重命名文件扩展名

请在迁移每个 build 文件的内容时将 .kts 添加到其文件扩展名后。例如,选择一个 build 文件(如 settings.gradle 文件)。将该文件重命名为 settings.gradle.kts,然后将其内容转换为 Kotlin 代码。请确保您的项目在迁移每个 build 文件之后仍然可以编译。

请先迁移最小的文件以便积累经验,然后再继续。项目中可以混合使用 Kotlin 和 Groovy build 文件,因此请花些时间仔细进行迁移。

将 def 替换为 val 或 var

将 def 替换为 val 或 var,这是在 Kotlin 中定义变量的方式。以下是 Groovy 中的变量声明:

def building64Bit = false

以下是使用 Kotlin 编写的相同代码:

val building64Bit = false

为布尔值属性添加 is 前缀

Groovy 会根据属性名称使用属性推导逻辑。对于布尔值属性 foo,其推导的方法可以是 getFoosetFoo 或 isFoo。因此,在转换为 Kotlin 后,您需要为 Kotlin 不支持的推导方法更改属性名称。例如,对于 buildTypes DSL 布尔值元素,您需要为它们添加 is 前缀。以下代码展示了如何在 Groovy 中设置布尔值属性:

android {buildTypes {release {minifyEnabled trueshrinkResources true...}debug {debuggable true...}...

以下是 Kotlin 中的相同代码:请注意,这些属性带有 is 前缀。

android {buildTypes {getByName("release") {isMinifyEnabled = trueisShrinkResources = true...}getByName("debug") {isDebuggable = true...}...

转换列表和映射

Groovy 和 Kotlin 中的列表和映射使用不同的语法进行定义。Groovy 使用 [],而 Kotlin 使用 listOf 或 mapOf 显式调用集合创建方法。迁移时,请务必将 [] 替换为 listOf 或 mapOf

以下是 Groovy(相对于 Kotlin)定义列表的方法:

jvmOptions += ["-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError</code>"]

以下是使用 Kotlin 编写的相同代码:

jvmOptions += listOf("-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError")

以下是 Groovy(相对于 Kotlin)定义映射的方法:

def myMap = [key1: 'value1', key2: 'value2']

以下是使用 Kotlin 编写的相同代码:

val myMap = mapOf("key1" to "value1", "key2" to "value2")

配置 build 类型

在 Kotlin DSL 中,只有调试和发布 build 类型是隐式提供的。所有其他自定义 build 类型都必须手动创建。

在 Groovy 中,您无需先创建就可以使用调试、发布和某些其他 build 类型。以下代码段展示了 Groovy 中具有 debugrelease 和 benchmark build 类型的配置。

buildTypes {debug {...}release {...}benchmark {...}
}

如需在 Kotlin 中创建等效配置,您必须显式创建 benchmark build 类型。

buildTypes {debug {...}release {...}register("benchmark") {...}
}

从 buildscript 迁移到插件块

如果您的 build 使用 buildscript {} 代码块向项目添加插件,您应重构为改用 plugins {} 代码块。plugins {} 代码块可让您更轻松地应用插件,并且与版本目录非常兼容。

此外,如果您在 build 文件中使用 plugins {} 代码块,即使构建失败,Android Studio 也会知道上下文。此上下文有助于修复 Kotlin DSL 文件,因为它允许 Studio IDE 执行代码补全并提供其他实用建议。

查找插件 ID

虽然 buildscript {} 代码块使用插件的 Maven 坐标(例如 com.android.tools.build:gradle:7.4.0)将插件添加到 build 类路径,但 plugins {} 代码块会改用插件 ID。

对于大多数插件,插件 ID 是使用 apply plugin 应用它们时使用的字符串。例如,以下插件 ID 是 Android Gradle 插件的一部分:

  • com.android.application
  • com.android.library
  • com.android.lint
  • com.android.test

您可以在 Google Maven 制品库中找到完整的插件列表。

Kotlin 插件可由多个插件 ID 引用。我们建议您使用命名空间型插件 ID,并根据下表将其从简写形式重构为命名空间型插件 ID:

简写插件 ID命名空间型插件 ID
kotlinorg.jetbrains.kotlin.jvm
kotlin-androidorg.jetbrains.kotlin.android
kotlin-kaptorg.jetbrains.kotlin.kapt
kotlin-parcelizeorg.jetbrains.kotlin.plugin.parcelize

您还可以在 Gradle 插件门户、Maven Central Repository 和 Google Maven 制品库中搜索插件。 如需详细了解插件 ID 的工作原理,请参阅开发自定义 Gradle 插件。

执行重构

知道所用插件的 ID 后,请执行以下步骤:

  1. 如果您仍有用于存放在 buildscript {} 代码块中声明的插件的代码库,请改为将其移至 settings.gradle 文件。

  2. 将插件添加到顶级 build.gradle 文件的 plugins {} 代码块中。您需要在此处指定插件的 ID 和版本。如果不需要将该插件应用到根项目,请使用 apply false

  3. 从顶级 build.gradle.kts 文件中移除 classpath 条目。

  4. 将插件添加到模块级 build.gradle 文件的 plugins {} 代码块中,即可应用插件。您只需在此处指定插件的 ID,因为相应版本继承自根项目。

  5. 从模块级 build.gradle 文件中移除插件的 apply plugin 调用。

例如,此设置使用 buildscript {} 代码块:

// Top-level build.gradle file
buildscript {repositories {google()mavenCentral()gradlePluginPortal()}dependencies {classpath("com.android.tools.build:gradle:7.4.0")classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0")...}
}// Module-level build.gradle file
apply(plugin: "com.android.application")
apply(plugin: "kotlin-android")

以下是使用 plugins {} 代码块的等效设置:

// Top-level build.gradle file
plugins {id 'com.android.application' version '7.4.0' apply falseid 'org.jetbrains.kotlin.android' version '1.8.0' apply false...
}// Module-level build.gradle file
plugins {id 'com.android.application'id 'org.jetbrains.kotlin.android'...
}// settings.gradle
pluginManagement {repositories {google()mavenCentral()gradlePluginPortal()}
}

转换 plugins 块

在 Groovy 和 Kotlin 中,从 plugins {} 块应用插件类似。以下代码展示了当您使用版本目录时如何在 Groovy 中应用插件:

// Top-level build.gradle file
plugins {alias libs.plugins.android.application apply false...
}// Module-level build.gradle file
plugins {alias libs.plugins.android.application...
}

以下代码展示了如何在 Kotlin 中执行相同的操作:

// Top-level build.gradle.kts file
plugins {alias(libs.plugins.android.application) apply false...
}// Module-level build.gradle.kts file
plugins {alias(libs.plugins.android.application)...
}

以下代码展示了当您不使用版本目录时如何在 Groovy 中应用插件:

// Top-level build.gradle file
plugins {id 'com.android.application' version '7.3.0' apply false...
}// Module-level build.gradle file
plugins {id 'com.android.application'...
}

以下代码展示了如何在 Kotlin 中执行相同的操作:

// Top-level build.gradle.kts file
plugins {id("com.android.application") version "7.3.0" apply false...
}// Module-level build.gradle.kts file
plugins {id("com.android.application")...
}

如需详细了解 plugins {} 代码块,请参阅 Gradle 文档中的应用插件。

其他

如需了解 Kotlin 实现其他功能的代码示例,请参阅以下文档页面:

  • 如果您有 ProGuard 配置,请参阅启用缩减、混淆和优化。
  • 如果您有 signingConfig {} 块,请参阅从 build 文件中移除签名信息。
  • 如果您使用项目全局属性,请参阅配置项目全局属性。

注意:虽然 Gradle 可让您在模块级别定义项目全局属性,但您应避免这样做,因为这样会导致共享这些属性的模块耦合。模块耦合使得以后将模块作为独立项目导出更加困难,并妨碍 Gradle 利用并行项目执行加快多模块 build。

已知问题

目前,一个已知问题是采用 Kotlin 的构建速度可能比使用 Groovy 慢。

如何报告问题

如需了解如何提供对问题进行分类所需的信息,请参阅构建工具和 Gradle bug 详细信息。然后,使用 Google 公开问题跟踪器来提交 bug。

更多资源

如需查看使用 Kotlin 编写的 Gradle build 文件的可运行示例,请参阅 GitHub 上的 Now In Android 示例应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git 提交后发现有问题重改的正确方法

撤回上一次提交&#xff1a; git reset --soft HEAD^ 修改文件&#xff08;如果需要&#xff09;。 暂存修改后的文件&#xff1a; git add . 重新提交&#xff1a; git commit -m "新的提交信息" 强制推送到远程仓库&#xff1a;注意--force git push --force

简过网:考教师编制报培训班有用吗?

​ 很多想要备考教师编的朋友都会有一个疑问&#xff0c;那就是备考教师编报培训班有用吗&#xff1f; 其实&#xff0c;主要还是要看你是笔试和面试。 小编觉得如果是笔试的话&#xff0c;其实都是教育理论的东西&#xff0c;线下班其实没有太大的必要&#xff0c;第一是面授…

DFS之搜索顺序——AcWing 1116. 马走日

DFS之搜索顺序 定义 DFS之搜索顺序是指在执行深度优先搜索时&#xff0c;遍历图或树中节点的策略。具体而言&#xff0c;DFS会沿着一条路径深入到底&#xff0c;当无法继续深入时回溯&#xff0c;然后选择另一条未探索的路径继续深入。搜索顺序直接影响到搜索效率和剪枝的可能…

发现CPU占用过高,该如何排查解决?

1.使用top命令 查看cpu占用最多的进程 2.使用 top -H -p pid 发现有两个线程占用比较大 3.将线程id转换为16进制 使用命令 printf 0x%x\n pid 4.使用 jstack pid | grep 线程id(16进制&#xff09; -A 20 &#xff08;显示20行&#xff09; 根据代码显示进行错误排查

软设之UML状态图

UML状态图 状态图描述一个动态机&#xff0c;它由状态&#xff0c;转移&#xff0c;事件和活动组成。状态图给出了对象的动态视图。它对于接口&#xff0c;类或协作的行为建模尤为重要&#xff0c;而且它强调事件导致的对象行为&#xff0c;这非常有助于对反应式系统建模 状态…

电脑为什么会提示丢失msvcp140.dll?怎么修复msvcp140.dll文件会靠谱点

电脑为什么会提示丢失msvcp140.dll&#xff1f;其实只要你的msvcp140.dll文件一损坏&#xff0c;然而你的电脑程序需要运用到这个msvcp140.dll文件的时候&#xff0c;就回提示你丢失了msvcp140.dll文件&#xff01;因为没有这个文件&#xff0c;你的很多程序都用不了的。今天我…

无人机对地面运动目标定位---获取目标的移动方向和速度

目录 一、引子 我们利用单目无人机通过等时间间隔拍照的形式对地面某移动目标进行定位&#xff0c;当前&#xff0c;我们已经获得了每张相片上该目标的三维坐标&#xff0c;并且知道该无人机在飞行过程中拍照的时间间隔&#xff0c;那么我们就可以通过一定的计算&#xff0c;得…

溶酶体靶向嵌合体制备方法和技术

网盘 https://pan.baidu.com/s/1dhCCryatp71j7yXTDdrrTw?pwdynr4 具有聚集诱导发光性质的比率型溶酶体pH探针及应用.pdf 内体-溶酶体转运靶向嵌合体降解剂及其制备方法与应用.pdf 可降解PDGFR-β的蛋白降解靶向嵌合体及其制备方法和应用.pdf 溶酶体膜包覆纳米颗粒的制备方法.…

JDK-SPI-服务提供者接口

归档 GitHub: JDK-SPI-服务提供者接口 SPI 源码说明 java.util.ServiceLoader /*** 服务加载器&#xff1a;给定接口&#xff0c;查找实现类。实现可迭代接口 */ public final class ServiceLoader<S> implements Iterable<S> {/*** 返回 ServiceLoader 实例 *…

Apng文件判断

背景&#xff1a;在图片压缩中&#xff0c;根据文件头判断png和jpg文件进行了压缩&#xff0c;但是对apng文件&#xff0c;文件头的前14个字节都一样&#xff08;89504E470D0A1A0A0000000D4948&#xff09;&#xff0c;导致对apng图片进行压缩&#xff0c;图片白了 解决方法&am…

springboot升级到2.7.17后,quartz集群模式配置修改

项目升级&#xff0c;sprringboot版本由2.1.3.RELEASE升级到2.7.17&#xff0c;quartz集群模式下报了一些错&#xff0c;下面是修改方案。 报错1&#xff1a;Unable to detect database type 我使用的是达梦数据库&#xff0c;在没有升级前&#xff0c;是可以正常运行的&#…

剪画小程序:自媒体工具推荐:视频文案提取!

各位小伙伴&#xff0c;你们好啊&#xff01; 上周五观看《歌手 2024》第八期时&#xff0c;我再次被何炅老师幽默风趣的主持风格所折服。他的每一句话都仿佛带着魔力&#xff0c;让现场气氛热烈非凡&#xff0c;实在令人羡慕不已&#xff01; 何炅老师的口才之所以如此出色&a…

如何在 Ubuntu上搭建 LAMP

远程登录 Ubuntu系统环境 ssh (User)(IP) # 比如&#xff1a;ssh lennlouis192.168.207.128 为安全起见&#xff0c;建议你使用 root 登录 VPS 后创建一个具有 sudo 权限的帐号。 安装和配置 Apache 2 Apache Http Server 是一个开源的&#xff0c;非常流行&#xff0c;使用…

【Unity小知识】UnityEngine.UI程序集丢失的问题

问题表现 先来说一下问题的表现&#xff0c;今天在开发的时候工程突然出现了报错&#xff0c;编辑器提示UnityEngine.UI缺少程序集引用。 问题分析与解决&#xff08;一&#xff09; 既然是程序集缺失&#xff0c;我们首先查看一下工程项目是否引用了程序集。在项目引用中查找一…

SpringBoot | 两种厂商开发经常用的Bean注入

目录 简介 第一种 构造函数注入 构造函数注入的优点 第二种 字段注入 字段注入的优点 两者对比 总结 简介 在Spring框架中&#xff0c;Autowired 注解用于自动装配Bean 它有两种常见的使用方式&#xff1a;字段注入和构造函数注入。 (以最简单的服务层来说明) 第一种 …

this指向问题以及如何改变指向

当在Vue.js中讨论"this"的指向问题时&#xff0c;有几个重要的方面需要考虑&#xff0c;特别是在组件化开发和异步操作中&#xff1a; 1. 普通函数 vs 箭头函数 在JavaScript中&#xff0c;普通函数和箭头函数对于"this"的处理方式有显著区别&#xff1a;…

从“钓”到“管”:EasyCVR一体化视频解决方案助力水域安全管理

一、背景 随着城市化进程的加快&#xff0c;越来越多的市民热衷于钓鱼活动。钓鱼活动在带来乐趣的同时&#xff0c;也伴随着一定的安全隐患。尤其是在一些危险水域&#xff0c;也经常出现垂钓者的身影&#xff0c;非法垂钓&#xff0c;这给城市管理带来了不小的阻力。传统的人…

Java传引用问题

本文将介绍 Java 中的引用传递&#xff0c;包括其定义、实现方式、通过引用修改原来指向的内容和通过引用修改当前引用的指向的区别 目录 1、引用传递的概念 2、引用传递的实现方式 3、传引用会发生的两种情况&#xff1a; 通过引用修改当前引用的指向 通过引用修改原来指…

华为OD机试2024年最新题库 JAVA C卷+D卷

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

标准正交向量组

文章目录 1. 定义2. 性质3. 构造方法4. 应用5. 示例 1. 定义 一个向量组 { v 1 , v 2 , … , v n } \{\mathbf{v}_1, \mathbf{v}_2, \ldots, \mathbf{v}_n\} {v1​,v2​,…,vn​} 被称为标准正交向量组&#xff0c;如果它满足以下两个条件&#xff1a; 正交性&#xff1a;对…