Gradle学习总结

Gradle基础:从入门到掌握 Gradle是一个基于DSL(领域特定语言)进行声明性配置的开源构建自动化工具。它结合了Apache Ant的灵活性和Apache Maven的依赖管理功能,可以用于编译、测试、部署和发布代码。Gradle最初设计是为了Java项目,但现在它也广泛支持Kotlin、Scala、Groovy、C++等多种语言和平台。Gradle作为一个强大的构建工具,为开发者提供了极大的灵活性和控制力。从基本的项目构建到复杂的多项目管理,Gradle都能很好地应对。 阅读详情

转自:https://blog.youkuaiyun.com/guofudong2/article/details/81286905


目录

1.Gradle简介

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。

Gradle 是基于 Groovy 语言的,他们之间的关系就像《Android 群英传:神兵利器》中说的:Groovy 对于 Gradle,就好比 Java 对于 Android。

Groovy

Groovy的基本语法这里不做阐述,它对Java代码进行了扩展,完全可以使用Java代码,这里简单介绍一下闭包的用法,方便下面的代码阅读。

闭包Closure

    { 参数 -> 代码 }

{ String name, int age ->
            println name
            println age
 }

 

在groovy中调用方法时,“()”可以省略

/** 定义一个方法,参数为闭包 */
def project(Closure configureClosure){
    ...........
}

//调用方法,()省略,方法名后面跟的是要传入的参数
project {
}

Gradle的构建脚本生命周期

对应的方法

/** 配置阶段开始前的执行 */
this.beforeEvaluate {
    println '配置开始'
}

/** 配置阶段完成以后执行*/
this.afterEvaluate {
    println '配置完成,开始执行'
}

/** gradle执行完毕后执行 */
this.gradle.buildFinished {
    println '执行完毕'
}

 

在初始化阶段会执行settings.gradle,所以可以在该文件中监听初始化开始。


2.Project

2.1Project简介

在Gradle中每个待编译的工程都是一个Project(每个工程的build.gradle对应一个Project对象),每个Project在构建的时候都包含一系列Task,这些Task中很多又是Gradle的插件默认支持的。每一个Project对象和build.gradle一一对应。


2.2Project相关API

/** 获取所有的Project */
this.getAllprojects()

/** 获取跟节点的Project */
this.getRootProject()

/** 获取当前节点的子节点Project */
this.getSubprojects()

/** 获取当前节点的父节点Project */
this.getParent()

 

/** 直接获取指定的Project */
Project project(String path);
Project project(String path, Closure configureClosure);
eg:
project('app') { Project project ->
    //通过参数project就可以直接配置project了,比如指定版本号,分组,应用插件,依赖等一系列操作
    println project.name
    apply plugin: 'com.android.application'
    dependencies {}
    android {}
}

/** 配置当前节点工程和其所有子节点工程 */
allprojects {

}
/** 配置当前节点d的所有子节点工程 */
subprojects {

}

2.3属性相关API

默认提供的属性,查看Project 源码
 

@HasInternalProtocol
public interface Project extends Comparable<Project>, ExtensionAware, PluginAware {
    /**
     * The default project build file name.
     */
    String DEFAULT_BUILD_FILE = "build.gradle"; // 默认的构建文件
    /**
     * The hierarchy separator for project and task path names.
     */
    String PATH_SEPARATOR = ":"; //默认的文件分隔符
    /**
     * The default build directory name.
     */
    String DEFAULT_BUILD_DIR_NAME = "build"; //默认的输出文件

    String GRADLE_PROPERTIES = "gradle.properties"; //扩展属性文件

    String SYSTEM_PROP_PREFIX = "systemProp";

    String DEFAULT_VERSION = "unspecified";

    String DEFAULT_STATUS = "release";
    //省略其他代码
}
    Project默认提供的属性不过,下面我们可以通过扩展属性来增加Projec的属性。

自定义扩展属性

    方式一:

//定义扩展属性
ext{
    /*扩展的的属性*/
    compileSdkVersion = 25
}
//调用
this.compileSdkVersion

    方式二:
    在工程提供的gradle.properties文件中直接定义,只能以key-value的方法定义。

android.useDeprecatedNdk = true
isLib = false
compileSdkVersion = 25

 

2.4文件相关API

路径相关

/** 获取根工程的路径 */
this.getRootDir().absolutePath

/** 获取当前project 的路径 */
this.getProjectDir().absolutePath

/** 获取Build文件夹的路径 */
this.getBuildDir().absolutePath

文件定位

/** 在当前的Project下寻找指定的文件 */
File file(Object path);

def file = file('build.gradle')
println file.text  //打印文件的内容

文件拷贝

/**  拷贝文件,参数为闭包 */
WorkResult copy(Closure closure);

copy {
    //将输出的apk拷贝到指定的文件夹中
    from file('build/outputs/apk/')
    into getRootProject().getBuildDir().path + '/apk/'
    exclude{
        //可以去除不想拷贝的文件
    }
    rename {
        //可以对文件重命名
    }
}

文件树遍历

ConfigurableFileTree fileTree(Object baseDir, Closure configureClosure);

fileTree('build/outputs/apk/'){ fileTree fileTree ->
    fileTree.visit { FileVisitDetails details ->
        println details.file.name //输出指定文件夹下所有的文件名
    }
}

2.5依赖相关API

/** 调用buildscript方法配置我们的依赖 */
buildscript { ScriptHandler scriptHandler ->
    /** 配置工程的仓库地址 */
    scriptHandler.repositories { RepositoryHandler repositoryHandler ->
        repositoryHandler.maven {}
        repositoryHandler.mavenCentral()
        repositoryHandler.mavenLocal()
        repositoryHandler.jcenter()
        repositoryHandler.ivy {}

    }
    /** 配置工程的“插件”依赖地址(Gradle本身的依赖) */
    scriptHandler.dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0'
    }
}
    在闭包中,参数是可以省略的,这里为了更直观的看出调用的具体是谁的方法,所以写了参数。
/** 为我们的应用程序配置依赖 */
dependencies {
    //依赖文件树
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:25.+'
    //依赖project
    compile project(':EaseUI_CN')
    compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
    compile 'com.orhanobut:logger:2.1.0'
}

 

解决依赖冲突

当我们依赖的库中,如果某些库都引入了一个相同的包或者库,并且版本不一致,这样就会导致依赖冲突。我们通过配置可以删除指定库中的依赖。

 compile(rootProject.ext.dependence.libAutoScrollViewPager) {
        exclude module: 'support-v4' //排除依赖,单个
        exclude group: 'com.android.support' //排除该组下所有的依赖(排除support下的所有包的依赖)
        transitive false //禁止传递依赖
 }

 

    exclude 后面跟key-value ; key:表示类型 value:表示具体的内容
    传递依赖:我们依赖的库中可能会依赖别的三方库,如果传递依赖为true:表示我们可以使用三方库所依赖的库中的东西。transitive 默认值就是false。

provided依赖

//Tinker相关依赖
compile(rootProject.ext.dependence.libTinker) {
    changing = true //每次都从服务端拉取
}
provided(rootProject.ext.dependence.libTinkerAndroid) {
    changing = true
}
通过compile依赖的方法,最终打包的时候会把所以来的库中的类和资源打包到apk中。而通过provided依赖的话资源不会被打包到apk中,只是在编译的时候会读取类和资源。

provided的使用场景

provided(rootProject.ext.dependence.libTinkerAndroid)像这种依赖,libTinkerAndroid的作用只是生成对应的Application文件的,所以在编译的时候生成Application文件后,就没有用了,所以不需要打包到APK中。
第二种情景是:假设我们的库工程中引入了okhttp3.1,而我们的主工程依赖该库工程。那么我们的主工程就可以使用provided方法依赖okhttp3.1,在编译的时候通过。不用再重复依赖了。


3.Task

3.1创建Task

方式一:
Task task(String name, Closure configureClosure);

task MyTask {
    println 'is MyTask'
}

方式二:
//通过TaskContainer的create方法
this.tasks.create(name:'MyTask'){
    println 'is MyTask'
}

 

3.2配置Task

配置分组和描述信息。

task MyTask(group:'TestTask',description:'task study'){
    println 'is MyTask'
}

//通过TaskContainer的create方法
this.tasks.create(name:'MyTask'){
    setGroup('TestTask')
    setDescription('task study')
    println 'is MyTask'
}

   

相同组名会被放在同一文件夹下,便于管理。

让Task的代码执行在执行阶段

task MyTask(group: 'TestTask', description: 'task study') {
    doFirst {//执行开始的时候
    }
    doLast{//执行结束的时候
    }
}
MyTask.doFirst{
}

 

    通过doFirst 或者doLast可以让代码执行在执行阶段,只有Task才能让代码执行在执行阶段。
task MyTask << {
    println 'MyTask' // << 等价于doLast{}
}


3.3Task的执行顺序

依赖方式指定:

task taskA {
    doLast {
        println 'taskA'
    }
}

task taskB {
    doLast {
        println 'taskB'
    }
}

task taskC(dependsOn: [taskA, taskB]) {
    doLast {
        println 'taskC'
    }
}
//或者
taskC.dependsOn(taskA, taskB)
    taskC依赖taskA和taskB,所以taskC在两者之后执行

动态指定

task MyTask {
    //依赖所有名字以lib开始的task
    dependsOn this.tasks.findAll {
        task -> return task.name.startsWith('lib')
    }
}

 

通过输入输出指定顺序

ext{
    destFile = file('test.xml')
}

task writeTask{
    ...................
    //为Task指定输出
    outputs.file = this.destFile
}

task readTask{
    //为Task指定输入
    inputs.file = this.destFile
    .....................
}
    readTask的输入为writeTask的输出,所以readTask在writeTask之后执行。
task taskB {
    mustRunAfter taskA //在taskA 之后执行
    doLast {
        println 'taskB'
    }
}

 

4.Settings类

Settings实例与settings.gradle文件一一对应,Settings的实例就是通过settings.gradle文件来实例化的。它用来进行一些项目设置的配置,主要用来指定该工程加载那些Project。该文件在初始化阶段被执行,对于多项目构建必须保证在根目录下有settings.gradle文件,对于单项目构建设置文件是可选的,不过建议还是写上。

5.sourceSets类

SourceSets被称作原集合,一般用它来指定资源的路径。默认的java文件夹下存在我们的源代码文件,res文件夹下存在我们的资源文件。我们可以通过SourceSets类提供的方法来修改。

sourceSets {
        main {
            jniLibs.srcDirs = ['libs'] //修改so库存放位置
            //指定资源文件夹,让资源文件也分模块
            res.srcDirs = ['src/main/res',
                           'src/main/res-ad',
                           'src/main/res-player']
        }
}

 

总结

Gradle 的核心是基于 Groovy 的 领域特定语言 (DSL), 具有十分优秀的扩展性. Gradle 通过提供可以随意集成的声明式语言元素将声明性构建推到了一个新的高度。它可以被充分利用在你的构建中,它具有强大的灵活性, 可以满足使用者对 Gradle 的一些特别的需求。它不仅仅是一个构建工具。我更愿意把他理解为一个编程框架。


Gradle实战
关注微信公众号获取更多相关资源

 

RepositoryHandler:RepositoryHandler是一个python库,用于通过通用接口处理代码存储库 仓库处理程序 描述 RepositoryHandler是一个python库,用于通过通用接口处理代码存储库。 如何获得RepositoryHandler 最新版本: git clone https://github.com/MetricsGrimoire/RepositoryHandler.git 支持的存储库类型 CVS SVN GIT BZR(初步支持) 塔球 可选的: ARCH(尚未实现) DARCS(尚未实施) 依存关系 Python> = 2.4 CVS客户端 SVN客户端 Git客户端 WGET或卷曲 Autoconf(用于安装) 如何安装 要从其他软件包中使用,应安装RepositoryHandler: $ python setup.py install 如果无法进行超级用户访问,则将不会运行“ sudo”命令,并且程序包将保持安装在当前目录中。 通过将 立即下载

相关推荐

kettle写doris操作

文件在目录:doris-master\extension\kettle\assemblies\plugin\target\doris-stream-loader-plugins-9.4.0.0-343.zip。官方提供了doris stream load插件,下载源码编译后放到kettle的插件目录即可使用。地址:https://github.com/apache/doris.git。注意:需要doris插件或者kettle转换生成模板的私聊博主。使用PDmaner同步业务库生成建表语句。

weixin_44449054的博客 3032

Gradle 学习 ----Gradle 入门

Gradle是一款Google推出的基于JVM、通用灵活的项目构建工具,支持Maven,JCenter多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml文件,转而使用简洁的、支持多种语言(例如java、groovy等)的build脚本文件。官网地址https目前已经有相当一部分公司在逐渐使用Gradle作为项目构建工具了。作为Java开发程序员,如果想下载Spring、SpringBoot等Spring家族的源码,基本上基于Gradle构建的。...............

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 5万+

深入解析STM32H743双精度FPU:从配置误区到三角函数加速技巧

本文深入解析STM32H743双精度FPU的配置与优化技巧,涵盖常见误区、三角函数加速及飞控系统应用。通过实测数据展示如何利用FPU提升数学运算效率,特别适合工业控制、无人机飞控等高精度实时应用场景。

weixin_29190651的博客 641

Gradle最详细教程,关于Gradle,学习这些就够了.......

学习一个东西的时候,要了解其概念,下面先了解一下gradle的相关概念:Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置,面向Java应用为主。当前其支持的语言C++、Java、Groovy、Kotlin、Scala和Swift,计划未来将支持更多的语言。----摘自百度百科。

只为code醉的博客 1万+

Frida精准定位Shopee x-sap-ri动态签名生成函数

x-sap-ri是Shopee客户端生成的上下文感知型动态令牌,本质为基于设备标识、请求路径与毫秒级时间戳三元组的SHA256哈希值,经Base64编码后作为防重放与防批量伪造的核心校验字段。其生成逻辑深度混淆且跨Java/Native层,静态分析失效,而Frida凭借内存级函数调用拦截与JNI层穿透能力,成为唯一可行的技术路径。本文聚焦Frida在加固App中的实战适配——通过libcrypto.so API特征扫描反向定位被抹名的生成函数,实现对x-sap-ri输入参数(如16字节device_id加密

weixin_33978578的博客 611

51单片机独立按键控制LED(二)

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。独立按键控制LED显示二进制。独立按键控制LED灯亮灭。独立按键控制LED状态。独立按键控制LED移位。

m0_50562428的博客 5383

gradle需要学习

gradle学习

wolfcrane的博客 304

Tesla v100 4张显卡组装机安装vllm和ollama在Ubuntu系统上的安装---AI大模型系统从零开始0032

本文提供Ubuntu22.04系统下vLLM的完整安装指南,适配4×32G Tesla显卡的单机4卡张量并行部署。教程包含:1)硬件要求(Ubuntu22.04、NVIDIA驱动≥535、CUDA12.1+);2)NVIDIA驱动自动安装方法;3)Python3.10虚拟环境配置;4)vLLM官方预编译包一键安装;5)单机4卡启动Qwen3.6-27B模型的完整参数说明(含FP8量化、多进程并行等关键配置)。文末附分布式部署的Ray集群方案参考链接,适用于多机8卡场景。

添柴程序猿的专栏 181

Gradle-学习

gradle基础认识

ZRL1996的博客 1181

PC 端微信页面拆分及 JavaFx 使用

一、前言 对于一个知识点的学习过程来说,往往使用自己熟悉的工具或方式才更易于上手。因为所有同类型的知识点在抛出复杂的流程拨云见日后,所能得到的几乎都是同样的设计思想和实现理论。 在 Java 语言桌面版开发中,直至目前共提供了三套 UI 开发方式;Awt、Swing、JavaFx,以及一些扩展组件 SWT 等。在这三套 UI 组件中,JavaFx 是最新也是最为好用的,因为他提供了丰富的功能,以及...

bugstack虫洞栈 3611

Word2vec核心模型精讲:CBOW与Skip-gram

Word2vec是Google提出的词向量模型,通过CBOW和Skip-gram两种神经网络架构将词汇映射到低维向量空间。CBOW通过上下文预测中心词,训练速度快但高频词表现更好;Skip-gram则相反,通过中心词预测上下文,适合处理生僻词。为解决softmax计算效率问题,Word2vec引入基于哈夫曼树的Hierarchical Softmax优化技术,将复杂度从O(V)降至O(logV)。文章详细解析了两种模型的原理差异,并演示了哈夫曼树的构造过程及其在词向量训练中的关键作用,这种结合词频的优

Trisyp的博客 530

gradle 学习备忘

所学版本:

sdaujz的博客 448

基于SAHI算法优化YOLOv8的小目标检测性能研究

SAHI(SliceAwareHyperInference)是一种推理优化算法,通过将大图切片为小块并分别推理的方式,实现更精细的小目标检测。提升小目标检测精度:切片后的小目标在每个小块中占比更大,模型能够更好地聚焦。兼容性强:可直接集成到现有目标检测框架中(如YOLO系列、Detectron2等)。支持大分辨率图片和视频推理:减少硬件对大图推理的限制。本文详细探讨了如何通过SAHI(切片辅助超推理算法)结合YOLOv8模型,有效提升小目标检测性能,尤其是在高分辨率图片和视频场景中表现优异。

博客 2371

gradle 学习资料汇总

android studio project site 官网地址。英文版 http://tools.android.com/tech-docs/new-build-system 中文翻译-快速预览 http://wiki.jikexueyuan.com/project/android-gradle-guide/basic-project.html 中文翻译,可能版本比较旧 https://g

乌龟 450

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Gradle入门学习

1.Gradle是什么? Gradle也是一个构建工具,类似maven,ant,也是apache旗下的。那与maven构建相比有什么好处,maven构建的坐标信息定义在xml中,如果依赖非常多,xml文件会非常臃肿。而Gradle基于Groovy脚本语言,编写依赖等信息非常简洁。 2.Gradle安装 下载地址:点我 按需下载对应版本,我这里下载的是 解压文件即可,然后配置环境变量输入 grad...

中森明菜的博客 314

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Gradle学习心得

学习Gradle直接看官方文档是比较合适的,书籍就没有推荐的,并且边学边自己做个demo。然后Gradle有些内容(比如自定义的configuration)我不太理解且找不到应用场景,这部分就慢慢理解吧。也许以后会做android,在android这里应用场景更广阔。

rehjgjdk11的博客 396

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Gradle学习笔记

在安卓开发过程中Gradle构建工具时必不可少的,有时遇到Gradle构建的问题,虽然解决了,但是有点乱拳打死老师傅的感觉,稀里糊涂的,通过阅读Gradle相关知识可以拓展下自己的技术栈,提高开发效率...

欢迎来到“無昂博奥”的博客 2148

Gradle学习

Gradle学习 第一章:Gradle 入门 1. 环境搭建 基础环境为Ubuntu16.04 java 安装 sudo apt install openjdk-8-jdk gradle安装 在官网下载安装包解压到安装目录,在用户目录下.bashrc 文件中或者/etc/profile中添加环境变量配置。 GRADLE_HOME=/root/UbuntuHome/gradle-2.14 PATH=${PATH}:${GRADLE_HOME}/bin export GRADLE_HOME PATH 在sh

d0d0bird的博客 528

学习gradle

学习gradle Building and Testing with Gradle.pdf Gradle Beyond the Basics.pdf Gradle Dependency Management.pdf Gradle for Android.pdf Gradle in Action.pdf Gradle Recipes for Android.pdf Intr

706

Gradle学习之四Gradle生命周期

文章目录前言一、gradle基本概念二、gradle优势三、gradle执行流程 前言 一、gradle基本概念 构建工具和maven,ant统一对待。它也是一种编程框架。maven 和ant功能比较固定。Gradle更加灵活。 二、gradle优势 灵活性。 gradle可以写脚本 粒度性。 Gradle 通过task一步一步执行的。 扩展性。 基于插件的扩展 兼容性。 兼容Maven和ant的功能 三、gradle执行流程 /** * 配置阶段开始前的监听 */ this.beforeEv..

C安君的博客 476

读书——Gradle使用指南学习之Installing Gradle

真正的错误是,当你知道应该如何去提高时仍然选择做一名初学者! 688

Android Gradle 学习项目教程

Android Gradle 学习项目教程 1. 项目的目录结构及介绍 android-gradle-study/ ├── asm-demo/ ├── aspectj-demo/ ├── javassist-demo/ ├── .gitignore ├── LICENSE ├── README.md └── settings.gradle asm-demo: 包含使用 ASM 进行字节码操作的...

gitblog_00209的博客 829

Gradle学习记录

本文只是作为自己平时学习和工作记录  http://groovy-lang.org/gdk.html 1.  如何同步Intellij和Gradle项目,解决加入新的build.gradle后,但是intellij探测的问题。 方法: 1)打开Gradle Tool Window,View | Tool Windows | Gradle  2)  单击Refresh

花果山 1613

Gradle学习之一入门介绍

文章目录第一章 课程导学第二章 快速入门2.1 概述2.2 特定语言DSL2.3 groovy初探第三章 开发环境搭建3.1 mac 安装3.1.1 下载Groovy SDK3.2 idea配置 第一章 课程导学 gradle的功能强大,maven和ant可以做的,它也可做。并且它使用SDL语言,是的配置更加灵活。掌握gradle: 可以完善Android和Java技术体系 提供自动化构建技术深度 全语言全平台的自动化构建工具 主要内容 Gradle开发环境的搭建 核心语法讲解和实战 字符串、.

C安君的博客 1168
上一篇: Gradle基础知识
下一篇: Android自定义属性,format详解
blueangle17
博客等级 码龄16年 78粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值