android的gradle

资料:

GitHub - ChenSWD/CopyGradleInAction: 备份《Gradle IN Action》书中的源码,添加了部分注释   //github上一个开源项目,外加pdf书



Gradle User Manual    gradle官网

讲的挺好的博客

Gradle之重新认识Gradle(项目结构、命令行、task、构建Java项目、包装器)_gradle no-source-CSDN博客

Kotlin DSL 是基于 Kotlin 语言 的一种 领域特定语言(DSL),用来更方便地在 Gradle 中编写构建脚本。为了让 Kotlin 能够适配 Gradle,Kotlin DSL 对 Gradle 的一些功能做了特定的调整和封装,使其能够以更自然、更 Kotlin 风格的方式使用。

goovy DSL是一个意思

所以gradle不是一个脚本而是一个构建工具,他是用java写的,运行的jvm上,所以有gradle和jdkc冲突的情况。Android是ART虚拟机,解释的是dex文件

脚本语言(Scripting Language)是一种用于编写脚本(脚本是一系列按照特定顺序执行的命令或指令)的计算机编程语言。与编译型语言不同,脚本语言的代码不需要事先通过编译生成机器码,而是在运行时由解释器逐行解释执行。比如python,就是脚本语言,不需要编译就可以运行,只需要解释器

这里有个gradlew很有用,因为这个可以在窗口中运行gradlew脚本 

gradlewgradlew.bat 都是 Gradle Wrapper(Gradle 包装器) 的一部分,它们的作用是让项目可以使用 Gradle 而无需提前在系统中安装 Gradle。两者的主要区别在于 操作系统环境文件格式,如下所示:

什么是Gradle Wrapper?

Gradle Wrapper Basics.   官网地址

Gradle Wrapper 的主要功能
  1. 统一 Gradle 版本

    • Gradle Wrapper 可以确保所有开发者使用项目指定的 Gradle 版本,避免版本不一致导致的问题。
    • Wrapper 会根据 gradle/wrapper/gradle-wrapper.properties 中配置的版本自动下载所需的 Gradle。
  2. 自动下载 Gradle

    • 如果本地没有所需的 Gradle 版本,Wrapper 会自动从官方仓库下载指定版本的 Gradle。
    • 下载的 Gradle 存储在本地缓存目录(默认在 ~/.gradle/wrapper/dists)。
  3. 无需手动安装 Gradle

    • 开发者无需手动安装 Gradle,只需运行项目中的 Wrapper 脚本即可。
  4. 跨平台支持

    • gradlewgradlew.bat 分别支持类 Unix 和 Windows 系统,让项目可以在不同操作系统中无缝构建。

环境依赖

  • gradlew 依赖于系统的 Shell 环境(如 Bash)。
  • gradlew.bat 依赖于 Windows 的批处理执行环境(如 CMD)。

如我在mac环境中执行:

  ./gradlew -v  ---查看当前的gradle版本信息

这里请注意:在这里使用的gradle是我们项目的wrap中配置的gradle

gradle是由一系列构建任务组成的

我们查看下gradle一共有提供多少任务:

在窗口中输入:./gradlew -v ,可以看到有很多任务

Android tasks
-------------
androidDependencies - Displays the Android dependencies of the project.
signingReport - Displays the signing info for the base and test modules
sourceSets - Prints out all the source sets defined in this project.Build tasks
-----------
assemble - Assemble main outputs for all the variants.
assembleAndroidTest - Assembles all the Test applications.
assembleUnitTest - Assembles all the unit test applications.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildKotlinToolingMetadata - Build metadata json file containing information about the used Kotlin tooling
buildNeeded - Assembles and tests this project and all projects it depends on.
bundle - Assemble bundles for all the variants.
clean - Deletes the build directory.
compileDebugAndroidTestSources
compileDebugSources
compileDebugUnitTestSources
compilePreSources
compilePreUnitTestSources
compileReleaseSources
compileReleaseUnitTestSources
debugSourcesJar - Assembles a jar archive containing the sources of target 'debug'.
extractDebugAnnotations - Extracts Android annotations for the debug variant into the archive file
extractReleaseAnnotations - Extracts Android annotations for the release variant into the archive file
releaseSourcesJar - Assembles a jar archive containing the sources of target 'release'.

比如:

 ./gradlew clean
清楚app的build下的缓存

如果嫌弃敲命令可以点击图形化的

gradle的一个配置流程

最开始读取setting.gradle,就知道一共有多少模块了

build.gradel是每个模块的构建脚本,可以读取这个模块依赖了哪些插件,支持哪些任务等,最为核心的东西

讲解几个方法,其实gradle中写的全是方法,比如:plugins

点击plugins,发现就是一个fun,因为kotlin中如果最后一个参数是方法的话,lamd表达式可以放在()后面,因为只有一个参数,所以()可以省略

    public final fun plugins(block: org.gradle.kotlin.dsl.PluginDependenciesSpecScope.() -> kotlin.Unit): kotlin.Unit { /* compiled code */ }

那alias函数呢?其实是PluginDependenciesSpecScope类中的,因为你传入的函数,给你弄成了

PluginDependenciesSpecScope的扩展函数he

gradle虽然是用java写的,运行在虚拟机上,但是他不支持用 java写脚本,只是支持kotin和goovy,因为java太繁琐了

这种都是gradle的脚本

 编写设置文件_哔哩哔哩_bilibili

 

pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}mavenCentral()gradlePluginPortal()}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()}
}rootProject.name = "My Application"
include(":app")
include(":suAssert")
include(":mylibrary")这些方法其实都是settings对象对象提供的
eg:
settings.include(":mylibrary")
只是为了方便,把settings去掉了

setting.gradle中也可以配置插件,但是这里配置了的都是全局的,一般都在module中配置

记得是一行一行往下执行

pluginManagement {       //这个是指定插件的仓库地址repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}mavenCentral()gradlePluginPortal()}
}
dependencyResolutionManagement {     //这是第三方依赖库的仓库地址repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()}
}

指定自定义的maven仓库:

maven{setUrl("")credentials {username = SCOPE_ACCOUNTpassword = SCOPE_PWD}
}

settings.gradle.kts,其实作用域是

SettingsScriptApi,他是继承setting的,所以返回的是setting对象

自定义任务:

tasks有两种注册方式:register和creat 。register是懒加载的意思

tasks.register("sujinbiao"){doLast{println("结束")}doFirst{println("开始")}
}

这样后:gradle的task ->others->sujinbiao

双击就可以执行或者命令行执行./gradlew sujinbiao 

新创建的task的组别是在other中,那么如何切换呢?

tasks.create("sujinbiao"){group = "build"description = "新建的task" //会出现在打印的日志中doLast{println("结束")}doFirst{println("开始")}
}

tasks.create("sujin"){group = "build"description = "新建的task"doLast{println("sujin")}doFirst{println("sujin")}
}tasks.create("sujinbiao"){group = "build"description = "新建的task"dependsOn("sujin")   //依赖别的任务,别人任务执行完再执行这个任务doLast{println("结束")}doFirst{println("开始")}
}

作用: 

如何修改现有的task    任务的配置的呢?比如在现有的任务的基础上依赖我的任务呢

tasks.named("build"){      //执行指定你要修改任务的名字就行dependsOn("sujin")
}

如何自定义一个Task,其实 register方法有一个扩展函数支持传入一个泛行的

public inline fun <reified T : org.gradle.api.Task> org.gradle.api.tasks.TaskContainer.register(name: kotlin.String, noinline configuration: T.() -> kotlin.Unit): org.gradle.api.tasks.TaskProvider<T> { /* compiled code */ }
open class myTask: DefaultTask(){private var name = ""@TaskAction           //标记了这个就是在最后默认调用fun taskAction(){    println("执行了")}fun taskName(name: String){this.name = nameprintln("name=${name}")}}tasks.register<myTask>("haha"){taskName("苏金标")println("name=${}")}

其实gradle也给我们提供一个内置的Task类型给我们使用:

gradle的几大重要信息,首先是加在顺序

最开始是加载电脑中国的全局配置文件gradle.properties,这个是所有的项目都可以用的,这个默认是没有的,得自己放置进去  .gradle/gradle.properties

再加载项目中的gradle.properties  -> setting.gradle (setting对象)-> 项目的build.gradle(rootproject和project ,发现这两个没什么区别) ->模块的 gradle.properties ->模块的 build.gradle(生成project对象)     注意一点,配置信息的等级是 .gradle/gradle.properties  > 模块的 >项目中的

gradle/gradle.properties等级是最高的,会覆盖其他的。

如何在build.gradle中读取配置信息呢?

goovy DSL

  project.属性 或者 project.findProperty("属性")

kotlin DSL 

project.findProperty("属性")

gradle的生命周期钩子

 

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

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

相关文章

Python 之 Excel 表格常用操作

示例文件 test.xlsx 将各个表单拆分成单独的 Excel 文件 import os.pathimport openpyxl import pandasdef handle_excel(file_path):dirname os.path.dirname(file_path)basename os.path.basename(file_path).split(".")[0]wb openpyxl.load_workbook(file_pat…

【C语言系列】深入理解指针(4)

深入理解指针&#xff08;4&#xff09; 一、回调函数是什么&#xff1f;二、qsort使用举例2.1使用qsort函数排序整型数据2.2使用qsort排序结构数据 三、qsort函数的模拟实现四、总结 一、回调函数是什么&#xff1f; 回调函数就是一个通过函数指针调用的函数。 如果你把函数的…

计算机网络 (56)交互式音频/视频

一、定义与特点 定义&#xff1a;交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术&#xff0c;包括语音、视频图像等多媒体实时通信。 特点&#xff1a; 实时性&#xff1a;音频和视频数据是实时传输和播放的&#xff0c;用户之间可以进行即时的交流。交互…

FFmpeg 头文件完美翻译之 libavcodec 模块

前言 众所周知&#xff0c;FFmpeg 的代码开发上手难度较高&#xff0c;源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发&#xff0c;需要借助它的头文件&#xff0c;FFmpeg 把很多代码库教程都写在头文件里面。因此&#xff0c;熟读头文件的内…

组件框架漏洞

一.基础概念 1.组件 定义&#xff1a;组件是软件开发中具有特定功能或特性的可重用部件或模块&#xff0c;能独立使用或集成到更大系统。 类型 前端 UI 组件&#xff1a;像按钮、下拉菜单、导航栏等&#xff0c;负责构建用户界面&#xff0c;提升用户交互体验。例如在电商 AP…

【C++图论】1761. 一个图中连通三元组的最小度数|2005

本文涉及知识点 C图论 LeetCode1761. 一个图中连通三元组的最小度数 给你一个无向图&#xff0c;整数 n 表示图中节点的数目&#xff0c;edges 数组表示图中的边&#xff0c;其中 edges[i] [ui, vi] &#xff0c;表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 …

C语言编译过程全面解析

今天是2025年1月26日&#xff0c;农历腊月二十七&#xff0c;一个距离新春佳节仅一步之遥的日子。城市的喧嚣中&#xff0c;年味已悄然弥漫——能在这个时候坚持上班的人&#xff0c;真可称为“牛人”了吧&#xff0c;哈哈。。。。 此刻&#xff0c;我在重新审视那些曾被遗忘的…

【橘子Kibana】Kibana的分析能力Analytics简易分析

一、kibana是啥&#xff0c;能干嘛 我们经常会用es来实现一些关于检索&#xff0c;关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI&#xff0c;你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…

生信软件管家——conda vs pip

pip vs conda&#xff1a; 安装过python包的人自然两种管理软件都用过&#xff0c; Pip install和Conda install在Python环境中用于安装第三方库和软件包&#xff0c;但它们在多个方面存在显著的区别 总的来说&#xff1a; pip是包管理软件&#xff0c;conda既是包管理软件&…

代码随想录——二叉树(二)

文章目录 前言二叉树最大深度二叉树的最小深度翻转二叉树对称二叉树完全二叉树的节点个数平衡二叉树二叉树的所有路径左叶子之和找左下角的值路径总和从中序与后序序列构造二叉树最大二叉树合并二叉树二叉搜索树中的搜索验证二叉搜索树二叉搜索树的最小绝对差二叉树中的众数二叉…

深入剖析 Adam 优化器:原理、优势与应用

在深度学习领域&#xff0c;优化器的选择对模型的训练效率和性能起着决定性作用。Adam优化器作为一种自适应优化算法&#xff0c;凭借其根据历史梯度信息动态调整学习率的特性&#xff0c;备受研究者和工程师的青睐。它巧妙融合了RMSProp和Momentum两种优化算法的理念&#xff…

Mybatis入门

Mybatis入门 一、mybatis的快速入门 1、创建springboot项目 直接选择必须的依赖&#xff1a;MyBatis Framework和MySQL Driver在项目下创建pojo包&#xff0c;用来存放数据库表对应的实体类 2、配置连接信息 在springboot项目的配置文件中application.properties写入一下信…

消息队列篇--通信协议篇--MQTT(通配式主题,消息服务质量Qos,EMQX的Broker,MqttClient示例,MQTT报文等)

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议。它基于发布/订阅模式&#xff0c;专为低带宽、高延迟或不可靠网络设计。它主要用于物联网&#xff08;IoT&#xff09;设备之间的通信&#xff0c;但也广泛应用于其他需要高效消息传递…

dmfldr实战

dmfldr实战 本文使用达梦的快速装载工具&#xff0c;对测试表进行数据导入导出。 新建测试表 create table “BENCHMARK”.“TEST_FLDR” ( “uid” INTEGER identity(1, 1) not null , “name” VARCHAR(24), “begin_date” TIMESTAMP(0), “amount” DECIMAL(6, 2), prim…

基于OSAL的嵌入式裸机事件驱动框架——消息队列osal_msg

参考B站up主【架构分析】嵌入式祼机事件驱动框架 感谢大佬分享 消息队列 消息分为hdr和bdy&#xff0c;把消息的头dhr和内容bdy做了一个分离的设计 dhr包括指向下一个消息的指针next&#xff0c;len在创建消息的时候使用&#xff0c;dest_id即目标任务&#xff0c;将消息和任务…

关于MySQL InnoDB存储引擎的一些认识

文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的&#xff1f;1.1 MySQL的存储引擎有哪些&#xff1f;1.2 MyIsam和InnoDB有什么区别&#xff1f; 2.MySQL表的结构是什么&#xff1f;2.1 行结构是什么样呢&#xff1f;2.1.1 NULL列表&#xff1f;2.1.2 char和varc…

单相可控整流电路——单相桥式全控整流电路

以下是关于单相桥式整流电路的介绍&#xff1a; 电路构成&#xff08;带阻性负载的工作情况&#xff09; - 二极管&#xff1a;是电路0的核心元件&#xff0c;通常采用四个同型号或根据需求选择不同型号的二极管&#xff0c;如1N4001、1N4007等&#xff0c;如图Vt1和Vt4是一对…

Linux(Centos、Ubuntu) 系统安装jenkins服务

该文章手把手演示在Linux系统下如何安装jenkins服务、并自定义jenkins数据文件位置、以及jenkins如何设置国内镜像源加速&#xff0c;解决插件下载失败问题 安装方式&#xff1a;war包安装 阿里云提供的war下载源地址&#xff1a;https://mirrors.aliyun.com/jenkins/war/?s…

力扣算法题——11.盛最多水的容器

目录 &#x1f495;1.题目 &#x1f495;2.解析思路 本题思路总览 借助双指针探索规律 从规律到代码实现的转化 双指针的具体实现 代码整体流程 &#x1f495;3.代码实现 &#x1f495;4.完结 二十七步也能走完逆流河吗 &#x1f495;1.题目 &#x1f495;2.解析思路…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】 1.3 广播机制:维度自动扩展的黑魔法

1.3 《广播机制&#xff1a;维度自动扩展的黑魔法》 前言 NumPy 的广播机制是 Python 科学计算中最强大的工具之一&#xff0c;它允许不同形状的数组进行运算&#xff0c;而无需显式地扩展数组的维度。这一机制在实际编程中非常有用&#xff0c;但初学者往往对其感到困惑。在…