Android gradle groovy改为kotlin总结

前言: Android gradle 的 Groovy 转 Kotlin 的难点在于groovy非常不规范,以为是一个变量其实是一个方法,以为是方法其实是一个一个字符串,koltin提供了更严格的语法。改为kotlin之后最大的变化就是扩展字段了,和groovy的语法完全不一样,需要好好了解学习一下,本文也会讲到。

下面是我对自己的项目改造总结,使用的gradle版本是gradle-7.3.3,agp版本是7.2.1。

文件重命名

改造前首先要将原来的gradle文件加上‘kts’后缀,如build.gradle改为build.gradle.kts,kts是Kotlin Script的缩写。重命名后AndroidStudio会自动识别为kotlin dsl。

项目的build.gradle

  • groovy

    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    apply from: 'config.gradle'
    apply plugin: 'com.alibaba.arouter'buildscript {repositories {maven { url "https://maven.aliyun.com/repository/public" }}dependencies {classpath 'com.android.tools.build:gradle:7.2.1'classpath "com.alibaba:arouter-register:1.0.2"}
    }allprojects {repositories {maven { url "https://maven.aliyun.com/repository/public" }}configurations.all {// fix 依赖冲突resolutionStrategy.force "androidx.appcompat:appcompat:1.4.2"resolutionStrategy.force "androidx.recyclerview:recyclerview:1.2.1"}
    }task clean(type: Delete) {delete rootProject.buildDir
    }
    
  • kotlin

    apply(from = "config.gradle.kts")
    apply(plugin = "com.alibaba.arouter")buildscript {repositories {maven("https://maven.aliyun.com/repository/public")}dependencies {classpath(libs.android.gradlePlugin)classpath(libs.greendao.gradlePlugin)}
    }allprojects {repositories {maven("https://maven.aliyun.com/repository/public")}configurations.all {resolutionStrategy.force("androidx.appcompat:appcompat:1.4.2")resolutionStrategy.force("androidx.recyclerview:recyclerview:1.2.1")}
    }tasks.create<Delete>("clean") {delete(rootProject.buildDir)
    }
    

module的build.gradle

  • groovy

    apply plugin: 'com.android.application'
    apply plugin: 'org.greenrobot.greendao'android {compileSdk = libs.versions.compileSdk.get().toInteger()ndkVersion = libs.versions.ndkVersion.get()defaultConfig {applicationId "com.myapp.sample"minSdkVersion(libs.versions.minSdk.get().toInteger())targetSdkVersion(libs.versions.targetSdk.get().toInteger())versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"multiDexEnabled trueexternalNativeBuild {cmake {cppFlags ""abiFilters "arm64-v8a", "armeabi-v7a", "x86"}}}signingConfigs {app {keyAlias 'appkey'keyPassword '******'storeFile file('key.jks')storePassword '******'}}buildTypes {release {minifyEnabled truezipAlignEnabled truesigningConfig signingConfigs.appproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'proguard-android.pro', 'proguard-third-libs.pro'}debug {minifyEnabled falsedebuggable truesigningConfig signingConfigs.app}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}buildFeatures {dataBinding true}greendao {schemaVersion 1}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}}lintOptions {abortOnError false}
    }dependencies {configurations.all {// check for updates every buildresolutionStrategy.cacheChangingModulesFor 30, 'seconds'}implementation(libs.glide)annotationProcessor(libs.glide.compiler)implementation(libs.androidx.constraintlayout)implementation(project(':easyPhotos'))implementation(libs.google.zxing.core) {exclude group: 'com.google.guava'}
    }
    
  • kotlin

    plugins {id("com.android.application")id("org.greenrobot.greendao")
    }
    android {compileSdk = libs.versions.compileSdk.get().toInt()ndkVersion = libs.versions.ndkVersion.get()defaultConfig {applicationId = "com.myapp.sample"minSdk = libs.versions.minSdk.get().toInt()targetSdk = libs.versions.targetSdk.get().toInt()versionCode = 1versionName = "1.0"testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"multiDexEnabled = trueexternalNativeBuild {cmake {cppFlags += listOf()abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86")}}}signingConfigs {create("release") {keyAlias = "appkey"keyPassword = "******"storeFile = file("key.jks")storePassword = "******"}}buildTypes {release {isMinifyEnabled = trueisZipAlignEnabled = truesigningConfig = signingConfigs.getByName("release")proguardFiles(getDefaultProguardFile("proguard-android.txt"),"proguard-rules.pro","proguard-android.pro","proguard-third-libs.pro")}debug {isMinifyEnabled = falseisDebuggable = truesigningConfig = signingConfigs.getByName("release")}}compileOptions {sourceCompatibility = JavaVersion.VERSION_1_8targetCompatibility = JavaVersion.VERSION_1_8}buildFeatures {dataBinding = true}greendao {schemaVersion = 1}externalNativeBuild {cmake {path("src/main/cpp/CMakeLists.txt")version = "3.10.2"}}lintOptions {isAbortOnError = false}}dependencies {configurations.all {// check for updates every buildresolutionStrategy.cacheChangingModulesFor(30, TimeUnit.SECONDS)}implementation(libs.glide)annotationProcessor(libs.glide.compiler)implementation(project(":easyPhotos"))implementation(libs.androidx.constraintlayout)implementation(libs.google.zxing.core) {//也可这么写  exclude(group = "com.google.guava")exclude(mapOf("group" to "com.google.guava"))}
    }
    

关于扩展字段

一、首先是新增扩展字段

groovy要新增扩展字段只需在ext{}里面随便加字段,kotlin改为用extra,语法也做了改变,具体看下面例子:

  • groovy

    //这里在项目根目录的user.gradle下新增用户名和密码
    ext {username = 'JohnSnow'password = 'abcxxx'
    }
    
  • kotlin 有三种写法

    // 写法一,如果不写rootProject默认会加上当前的project
    rootProject.extra.apply {set("username", "JohnSnow")set("password", "abcxxx")
    }// 写法二
    val username : String by rootProject.extra("JohnSnow")
    val password : String by rootProject.extra("abcxxx")// 写法三,大括号里面可以写语句,最后一行是返回值
    val username : String by rootProject.extra{val name = "JohnSnow"name
    }
    val password : String by rootProject.extra{"abcxxx"}
    
二、使用扩展字段
  • groovy

    def name = rootProject.ext.username
    def pwd = rootProject.ext.password
    
  • kotlin 有两种使用方式

    //方式一,这种方式就是Map的key-value形式
    val name = rootProject.extra["username"] as String
    val pwd = rootProject.extra["password"] as String//方式二,这是kotlin dsl提供的语法糖,这种方式指定的变量名username必须与extra里的"username"一致,
    //且必须指定字段类型(String)
    val username: String by rootProject.extra
    val password: String by rootProject.extra
    

关于上传到maven的写法区别

上传到maven有两种写法,

  1. 一种是直接在当前要上传的library模块的build.gradle里写上传脚步代码

这种方式自带模块的project环境,kotlin dsl做了一些适配,写法会更简单些

  1. 第二种是放到一个单独的maven.gradle里统一处理,这种方式适用于有很多个library需要上传的情况,不用每个模块都写一遍上传脚本;

这种方式是在单独的gradle里编写没有自带project的环境,所以第二种方式的写法会复杂一些,而且没有代码提示。

一、在library模块编写
  • groovy

    apply plugin: 'com.android.library'android {...//提交到顺丰maven所需的配置publishing {singleVariant('release') {withSourcesJar()}}
    }
    // maven插件
    apply plugin: 'maven-publish'afterEvaluate {def GROUP_ID = "com.free.sdk"def ARTIFACT_ID = "wo-util"def VERSION = "1.0.0"publishing {publications {//mylib名字随意mylib(MavenPublication) {from components.releasegroupId = GROUP_IDartifactId = ARTIFACT_IDversion = VERSIONpom.withXml {println "!!!!>>>>>> ${project.name} 要上传的版本-> $groupId:$artifactId:$version"println "!!!!>>>>>> ${project.name} 依赖的包:"configurations.implementation.allDependencies.each {if (it.version != "unspecified") { // 过滤项目内library引用println "   " + it.group + ":" + it.name + ":" + it.version}}}}}//需要发布的目标仓库repositories {maven {url = rootProject.extra["mavenUrl"] as Stringcredentials {//密码认证username = rootProject.extra["username"] as Stringpassword = rootProject.extra["password"] as String}}}}
    }
    
  • kotlin

    plugins {id("com.android.library")//注意maven插件要写在头部`maven-publish`
    }android {...//提交到顺丰maven所需的配置publishing {singleVariant("release") {withSourcesJar()}}
    }afterEvaluate {val GROUP_ID = "com.free.sdk"val ARTIFACT_ID = "wo-util"val VERSION = "1.0.0"publishing {publications {//mylib名字随意register<MavenPublication>("mylib") {from(components["release"])groupId = GROUP_IDartifactId = ARTIFACT_IDversion = VERSIONpom.withXml {println("!!!!>>>>>> ${project.name} 要上传的版本-> $groupId:$artifactId:$version")println("!!!!>>>>>> ${project.name} 依赖的包:")configurations.implementation.allDependencies.forEach { dependency ->if (dependency.version != "unspecified") {println("   ${dependency.group}:${dependency.name}:${dependency.version}")}}}}}repositories {maven {setUrl(rootProject.extra["mavenUrl"] as String)credentials {username = rootProject.extra["username"] as Stringpassword = rootProject.extra["password"] as String}}}}
    }
    

二、在maven.gradle里统一处理

  • 在library的build.gradle.kts里引入maven.gradle

    plugins {id("com.android.library")
    }
    apply(from = "${rootProject.rootDir}/maven.gradle.kts")
    
  • maven.gradle.kts里的代码

    import org.gradle.api.publish.PublishingExtensionapply(plugin = "maven-publish")val libraries: Map<String, Map<String, String>> by rootProject.extra
    val library = libraries[project.name]!!
    val sonatype: Map<String, String> by rootProject.extraval repositoryUrl = if ((library["version"] as String).endsWith("SNAPSHOT")) {sonatype["snapshotUrl"]!!
    } else {sonatype["releaseUrl"]!!
    }//publishing报错, 改为 configure<PublishingExtension>原因:
    //https://stackoverflow.com/questions/54654376/why-is-publishing-function-not-being-found-in-my-custom-gradle-kts-file-within
    configure<PublishingExtension> {// --------不同点1️⃣publications {register<MavenPublication>("mylib") {afterEvaluate { from(components["release"]) }groupId = rootProject.extra["groupId"] as StringartifactId = library["artifactId"]version = library["version"]pom.withXml {println("!!!!>>>>>> ${project.name} 要上传的版本-> $groupId:$artifactId:$version")println("!!!!>>>>>> ${project.name} 依赖的包:")configurations {"implementation" {// --------不同点2️⃣allDependencies.forEach {if (it.version != "unspecified") { // 过滤项目内library引用println("   " + it.group + ":" + it.name + ":" + it.version)}}}}}}}repositories {maven {setUrl(repositoryUrl)credentials {username = sonatype["username"]password = sonatype["password"]}}}
    }
    

参考:

【Gradle-18】从Groovy迁移至Kotlin - 掘金

Gradle Kotlin DSL Primer

stackoverflow

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

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

相关文章

CentOS7配置阿里云yum源

前提&#xff1a;确认机器可以连接互联网&#xff0c;且系统已经安装了wget软件 先进入到/etc/yum.repos.d目录下查看是否有原来的yum源配置文件&#xff0c;如果有&#xff0c;就将它们备份一下 用yum repolist命令测试&#xff0c;当前系统已经没有可用yum源 输入命令wget -…

Java二十三种设计模式-建造者模式(4/23)

建造者模式&#xff1a;构建复杂对象的专家 引言 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于创建一个复杂的对象&#xff0c;同时允许用户只通过指定复杂对象的类型和内容就能构建它们&#xff0c;它将对象的构建和表示分离&am…

【机器学习】12.十大算法之一支持向量机(SVM - Support Vector Machine)算法原理讲解

【机器学习】12.十大算法之一支持向量机&#xff08;SVM - Support Vector Machine&#xff09;算法原理讲解 一摘要二个人简介三基本概念四支持向量与超平面4.1 超平面&#xff08;Hyperplane&#xff09;4.2 支持向量&#xff08;Support Vectors&#xff09;4.3 核技巧&…

Redis Cluster 工具

脚本 1 slots.sh #!/bin/bash# Connect to Redis Cluster and retrieve node information nodes_info echo "CLUSTER NODES" | rd 10.XX.33.202 6011# Check if redis-cli command executed successfully if [ $? -ne 0 ]; thenecho "Error: Unable to …

【Django+Vue3 线上教育平台项目实战】构建课程详情页与集成视频播放功能

文章目录 前言一、课程列表页面a.后端代码b.前端代码 二、课程详情页面a. 视频播放功能的集成1.获取上传视频的链接地址2.集成在前端页面中1>使用vue-alipayer视频播放组件2>使用video标签 b. 页面主要内容展示1.后端代码1>分析表2>核心逻辑 2.前端代码3.效果图 前…

LLM_入门指南(零基础搭建大模型)

本文主要介绍大模型的prompt&#xff0c;并且给出实战教程。即使零基础也可以实现大模型的搭建。 内容&#xff1a;初级阶段的修炼心法&#xff0c;帮助凝聚和提升内力&#xff0c;为后续修炼打下基础。 1、prompt 1.1含义和作用 prompt就是提示工程的意思。在大型语言模型中…

手撕排序算法:冒泡排序

文章目录 1.算法思想2.冒泡排序具体过程3.算法分析3.1时间复杂度3.2空间复杂度 4.算法的优缺点4.1算法的优点4.2算法的缺点 5.冒泡排序优化方案6.算法实现7.实战7.1 力扣88. 合并两个有序数组7.2力扣2148.元素计数7.3力扣1046.最后一块石头的重量 冒泡排序(Bubble Sort)是一种简…

线程池-拒绝策略

线程池-拒绝策略 RejectedExecutionHandlerAbortPolicyCallerRunsPolicyDiscardPolicyDiscardOldestPolicy自定义拒绝策略 当核心线程已用尽 & 阻塞队列已满 & 超过最大线程数时&#xff0c;再向线程池提交任务&#xff0c;则会触发线程池的拒绝策略。 RejectedExecuti…

微信小程序 2024年更新内容汇总

本心、输入输出、结果 文章目录 微信小程序 2024年更新内容汇总v3.4.10 (2024-07-03)v3.4.9 (2024-06-26)v3.4.8 (2024-06-19)v3.4.7 (2024-06-07)v3.4.6 (2024-05-29)v3.4.5 (2024-05-23)v3.4.4 (2024-05-11)v3.4.3 (2024-04-24)v3.4.2 (2024-04-11)v3.4.1 (2024-04-02)v3.4.1…

Python爬虫与文本到语音转换实战:获取并播报长沙天气

简介&#x1f495; 在本文中&#xff0c;我们将通过一个简单的Python脚本&#xff0c;演示如何使用网络爬虫技术获取长沙的天气信息&#xff0c;并使用文本到语音技术将天气信息播报出来。我们将使用pyttsx3库进行语音播报&#xff0c;使用requests库来发起网络请求&#xff0…

自动驾驶-2D目标检测

yolo及yolo的变体 anchor boxes (锚框) intersection over union 并集交集 用于计算两个边界框的差异程度 bounding box predictions 边界框预测 non maximum suppression非极大值抑制 为了分离这些边界框并为每个对象获得单个边界框&#xff0c;我们使用IOU。这种获取单…

【设计模式之美】【创建型】建造者模式:处理复杂成员变量以及它们之间的关系

文章目录 一. 使用场景二. 具体实现三. 小结1. 结合场景使用2. 与工厂模式的区别 建造者模式本身不难&#xff0c;重点是掌握好它的适用场景。 一. 使用场景 如果一个类中有很多属性&#xff0c;为了避免构造函数的参数列表过长&#xff0c;影响代码的可读性和易用性&#xf…

2024-07-15 Unity插件 Odin Inspector4 —— Collection Attributes

文章目录 1 说明2 集合相关特性2.1 DictionaryDrawerSettings2.2 ListDrawerSettings2.3 TableColumnWidth2.4 TableList2.5 TableMatrix 1 说明 ​ 本章介绍 Odin Inspector 插件中集合&#xff08;Dictionary、List&#xff09;相关特性的使用方法。 2 集合相关特性 2.1 D…

2-34 小波神经网络采用传统 BP 算法

小波神经网络采用传统 BP 算法&#xff0c;存在收敛速度慢和易陷入局部极小值两个突出弱点。建立了基于遗传算法的小波神经网络股票预测模型 GA-WNN。该模型结合了遗传算法的全局优化搜索能力以及小波神经网络良好的时频局部特性。运用 MATLAB 对拟合和预测过程进行仿真。结果表…

<数据集>绝缘子缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2139张 标注数量(xml文件个数)&#xff1a;2139 标注数量(txt文件个数)&#xff1a;2139 标注类别数&#xff1a;8 标注类别名称&#xff1a;[insulator, broken disc, pollution-flashover, Two glass, Glassdirt…

李笑来思考框架的结晶《思考的真相》(2024 年新书)

点开文章的你肯定读过李笑来的书&#xff0c;比如讲认知的《财富自由之路》、讲管理自己的《把时间当做朋友》、讲财富底层逻辑的《财富的真相》、讲定投的《让时间陪你慢慢变富》等等。 李笑来的书不讲究华丽的文字&#xff0c;在意逻辑、论证的严谨&#xff0c;层层递进&…

数据结构之通过“ 队列 ”实现的“ 栈 ”功能。

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 前言 本节内容是利用“ 队列 ”先进先出的特点 实现 “ 栈 ” 先进后出。 一、题目 1.1 题目描述&#xff1a; 请你仅使用两个队列实现一个后入先出&…

成为CMake砖家(1): 在Windows上查看CMake文档

大家好&#xff0c;我是白鱼。 在使用 CMake 的过程中&#xff0c;想必有不少朋友像我一样&#xff0c; 想在本地查看 CMake 文档。 首先安装 CMake, Installer 版本&#xff1a; 安装后&#xff0c;从开始菜单输入 CMake&#xff0c; 选择结果中的 “CMake Documentation”…

如何在 Shell 脚本中使用函数 ?

函数是一个可重用的代码块。我们经常把重复的代码放入一个函数中&#xff0c;并从不同的地方调用该函数&#xff0c;库是函数的集合。我们可以在库中定义常用的函数&#xff0c;其他脚本可以使用它们而无需复制代码。 Calling function 在 Shell 中&#xff0c;调用函数和调用…

CSS 选择器:精通网页样式的基础

CSS 选择器&#xff1a;精通网页样式的基础 CSS&#xff08;层叠样式表&#xff09;是网页设计中不可或缺的一部分&#xff0c;它用于控制网页元素的布局和外观。CSS 选择器是其中的核心概念&#xff0c;它允许开发者精确地指定要应用样式的 HTML 元素。本文将深入探讨 CSS 选…