gradle学习2

本文详细介绍了Gradle的学习,涵盖了生命周期、获取Project、配置与设置、扩展、文件操作、依赖管理、Task创建与配置、输入输出、sourceSets以及自定义插件等内容。在生命周期中,讨论了初始化、配置和执行阶段,而在Task部分,讲解了如何创建、配置Task及其依赖关系。同时,还探讨了如何在不同Project间共享扩展函数和配置文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gradle 学习

gradle生命周期

生命周期

初始化阶段=》配置阶段=》执行阶段

生命周期回调

![在这里插入图片描述](https://img-blog.csdnimg.cn/2在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

获取project

获取所有project

this.projects()
def projects() {

    this.getAllprojects().eachWithIndex { project, index ->
        if (index ==0 ) {
            println "root = ${project.name}"
        } else {
            println "sub ${project.name}"
        }
    }
}


在这里插入图片描述

获取子project
this.subProject()
def subProject() {
    this.getSubprojects().eachWithIndex { Project entry, int i ->
        println "sub project ${entry.name}"
    }
}

在这里插入图片描述

得到父的project

方式一,该方式不能在父project调用会报错

在这里插入图片描述

this.getParentProject()

def getParentProject() {
    def name = this.getParent().name
    println "parent = ${name}"
}

在这里插入图片描述

方式二,该方式可以在父project调用

this.rootProject()

def rootProject() {
    def name = this.rootProject.name
    println "root name ${name}"
}

在这里插入图片描述

对某一project进行设置

添加plugin、dependencies
project('app') { Project project ->

    apply { ObjectConfigurationAction objectConfigurationAction ->
//        objectConfigurationAction.plugin('com.android.library')
    }


    project.afterEvaluate {
        dependencies {  DependencyHandler dependencyHandler ->
            dependencyHandler.add('implementation', 'com.google.code.gson:gson:2.6.2')
        }
    }
}
    apply { ObjectConfigurationAction objectConfigurationAction ->
        // objectConfigurationAction.plugin('com.android.library')
    }

apply是追加插件,如果已经存在com.android.application,如继续追加com.android.library插件会报错

在这里插入图片描述
在这里插入图片描述

配置当前工程和所有子工程

allprojects {
    group 'com.answer'
    version '1.0.0-release'
}
println "aaa" + project("app").group

在这里插入图片描述

配置子project,不包括当前project

subprojects { Project project ->
    if(project.getPlugins().hasPlugin('com.android.library')) {
        apply from: '../publishToMaven.gradle'
    }
}

判断子project是不是library,如果是,就增加发不到maven仓库功能

扩展

在根工程使用ext
ext {
    compileSdkVersion = 29
    libAndroidx = 'androidx.appcompat:appcompat:1.2.0'
}

子工程使用根工程的扩展函数

方式一

android {
    compileSdkVersion this.rootProject.compileSdkVersion
    buildToolsVersion "29.0.2"

方式二

因为是继承关系,所以可以省略掉rootProject

android {
    compileSdkVersion this.compileSdkVersion
    buildToolsVersion "29.0.2"
导入文件使用扩展函数

创建一个common.gradle文件
在这里插入图片描述
在跟工程进行引用

在这里插入图片描述

在子工程进行使用

在这里插入图片描述

使用属性

在这里插入图片描述

在这里插入图片描述

文件操作

文件路径

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查找文件

相对于当前的project工程开始查找

println buildContent("common.gradle")
def buildContent(String path) {
    try {
        def file = file(path)
        return file.text
    } catch (GradleException e) {
        println 'file not found.'
    }
    return null
}

在这里插入图片描述

复制文件
复制单个文件
copy {
    from file('hahaha.jks')
    into getRootProject().getBuildDir().absolutePath
}

在这里插入图片描述

复制目录
copy {
    from file('build/outputs/apk/')
    into getRootProject().getBuildDir().path + '/apk'
}

在这里插入图片描述

遍历文件树
fileTree('build/outputs/apk/') { FileTree fileTree ->
    fileTree.visit { FileTreeElement element ->
        println 'the file name is ' + element.file.name
    }
}

在这里插入图片描述
在这里插入图片描述

依赖

buildscript { ScriptHandler scriptHandler ->
	// 配置工程的仓库地址
    scriptHandler.repositories { RepositoryHandler repositoryHandler ->
        repositoryHandler.jcenter()
        repositoryHandler.mavenCentral()
        repositoryHandler.mavenLocal()

        repositoryHandler.google()
        repositoryHandler.maven { MavenArtifactRepository mavenArtifactRepository ->
            mavenArtifactRepository.setName('')
            mavenArtifactRepository.setUrl('')
            mavenArtifactRepository.credentials(new Action<PasswordCredentials>() {
                @Override
                void execute(PasswordCredentials passwordCredentials) {
                    passwordCredentials.setUsername()
                    passwordCredentials.password()
                }
            })
        }
    }
	// 配置工程的"插件"依赖地址
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.3'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

排除依赖

exclude
transitive

执行终端命令

task(pwdCommand {
    doLast {
        def command = "pwd"
        exec {
            try {
                executable 'bash'
                args '-c', command
            }catch(GradleException e) {
                println 'the command is executed failed'
            }
        }
    }
})

task

创建task
方式一
task(helloTask {
    println 'hello task'
})

方式二
this.tasks.create(name: 'helloTask2') {
    println 'hello task222'
}

对task进行配置
方式一
task(helloTask(group: 'yaoyan', description: 'this is yaoyan') {
    println 'hello task'
})
方式二
this.tasks.create(name: 'helloTask2') {
    setGroup('xixi')
    setDescription('this is xixi')
    println 'hello task222'
}

在这里插入图片描述

在gradle执行阶段处理逻辑
task(helloTask(group: 'yaoyan', description: 'this is yaoyan') {
    println 'hello task'
    doFirst {
        println 'the task group is: ' + group
    }
    doLast {

    }
})
helloTask.doFirst {
    println 'the task description is: ' + description
}

在这里插入图片描述
外面的doFirst先执行

task依赖关系
单个依赖
task taskX {
    doLast {
        println 'taskX'
    }
}

task taskY {
    doLast {
        println 'taskY'
    }
}

task taskZ(dependsOn: taskX) {
    doLast {
        println 'taskZ'
    }
}

在这里插入图片描述

多个依赖
task taskX {
    doLast {
        println 'taskX'
    }
}

task taskY {
    doLast {
        println 'taskY'
    }
}

task taskZ(dependsOn: [taskX, taskY]) {
    doLast {
        println 'taskZ'
    }
}

在这里插入图片描述

动态添加task
task lib1 {
    doLast {
        println 'lib1'
    }

}

task lib2 {
    doLast {
        println 'lib2'
    }
}

task noLib {
    doLast {
        println 'noLib'
    }

}

task taskX {
    dependsOn this.tasks.findAll { task ->
        return task.name.startsWith('lib')
    }
    doLast {
        println 'taskX'
    }
}

在这里插入图片描述

gradle 输入输出


}

task writeTask {
    inputs.property('versionCode', this.versionCode)
    inputs.property('versionName', this.versionName)
    inputs.property('versionInfo', this.versionInfo)
    outputs.file this.destFile
    doLast {
        println '开始写了'
        //将输入的内容写入到输出文件中去
        def data = inputs.getProperties()
        File file = outputs.getFiles().getSingleFile()
        def versionMsg = new VersionMsg(data)
        //将实体对象写入到xml文件中
        def sw = new StringWriter()
        def xmlBuilder = new MarkupBuilder(sw)
        if (file.text != null && file.text.size() <= 0) {
            //没有内容
            xmlBuilder.releases {
                release {
                    versionCode(versionMsg.versionCode)
                    versionName(versionMsg.versionName)
                    versionInfo(versionMsg.versionInfo)
                }
            }
            //直接写入
            file.withWriter { writer -> writer.append(sw.toString())
            }
        } else {
            //已有其它版本内容
            xmlBuilder.release {
                versionCode(versionMsg.versionCode)
                versionName(versionMsg.versionName)
                versionInfo(versionMsg.versionInfo)
            }
            //插入到最后一行前面
            def lines = file.readLines()
            def lengths = lines.size() - 1
            file.withWriter { writer ->
                lines.eachWithIndex { line, index ->
                    if (index != lengths) {
                        writer.append(line + '\r\n')
                    } else if (index == lengths) {
                        writer.append('\r\r\n' + sw.toString() + '\r\n')
                        writer.append(lines.get(lengths))
                    }
                }
            }
        }
    }
}

class VersionMsg {
    String versionCode
    String versionName
    String versionInfo
}

task readTask {
    //指定输入文件为上一个task的输出
    inputs.file this.destFile
    doLast {
        //读取输入文件的内容并显示
        def file = inputs.files.singleFile
        println file.text
    }
}


task taskZ {
    dependsOn writeTask, readTask
    doLast {
        println '输入输出任务结束'
    }
}

task指定顺序

task taskA {
    doLast {
        println 'taskA'
    }
}

task taskB {
    mustRunAfter taskA
    doLast {
        println 'taskB'
    }
}

task taskC {
    mustRunAfter taskB
    doLast {
        println 'taskC'
    }
}

在这里插入图片描述

sourceSets

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"

    defaultConfig {
        applicationId "com.answer.myapplication"
        minSdkVersion 17
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

    sourceSets {
        main {
            res.srcDirs = ['src/main/res', 'src/main/res-ad']
        }
    }
}

在这里插入图片描述
增加了一个res目录

自定义插件

工程目录

在这里插入图片描述

自定义插件
/**
 * 自定义Plugin
 */
class GradleStudyPlugin implements Plugin<Project> {

    /**
     * 唯一需要实现的就是这个方法,参数就是引入了当前插件的Project对象
     * @param project
     */
    @Override
    void apply(Project project) {
        project.extensions.create('yaoyanInfo', ReleaseInfoExtension)
        //创建Task
        project.tasks.create('yaoyanReleaseInfoTask',
                ReleaseInfoTask)
    }
}
自定义属性
class ReleaseInfoExtension {
    String versionCode
    String versionName
    String versionInfo
    String fileName

    ReleaseInfoExtension() {

    }

    @Override
    String toString() {
        """| versionCode = ${versionCode}
           | versionName = ${versionName}
           | versionInfo = ${versionInfo}
           | fileName = ${fileName}
        """.stripMargin()
    }
}
自定义task
import groovy.xml.MarkupBuilder
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

class ReleaseInfoTask extends DefaultTask {
    ReleaseInfoTask() {
        group = 'yaoyan'
        description = 'update the release info'
    }

    /**
     * 执行于gradle执行阶段的代码,在doFirst之后,doLast之前执行
     */
    @TaskAction
    void doAction() {
        updateInfo()
    }

    //真正的将Extension类中的信息呢,写入指定文件中
    private void updateInfo() {
        //获取将要写入的信息
        String versionCodeMsg = project.extensions.
                yaoyanInfo.versionCode
        String versionNameMsg = project.extensions.
                yaoyanInfo.versionName
        String versionInfoMsg = project.extensions.
                yaoyanInfo.versionInfo
        String fileName = project.extensions.
                yaoyanInfo.fileName
        def file = project.file(fileName)
        if (!file.exists()) {
            file.createNewFile()
        }
        //将实体对象写入到xml文件中
        def sw = new StringWriter()
        def xmlBuilder = new MarkupBuilder(sw)
        if (file.text != null && file.text.size() <= 0) {
            //没有内容
            xmlBuilder.releases {
                release {
                    versionCode(versionCodeMsg)
                    versionName(versionNameMsg)
                    versionInfo(versionInfoMsg)
                }
            }
            //直接写入
            file.withWriter { writer -> writer.append(sw.toString())
            }
        } else {
            //已有其它版本内容
            xmlBuilder.release {
                versionCode(versionCodeMsg)
                versionName(versionNameMsg)
                versionInfo(versionInfoMsg)
            }
            //插入到最后一行前面
            def lines = file.readLines()
            def lengths = lines.size() - 1
            file.withWriter { writer ->
                lines.eachWithIndex { line, index ->
                    if (index != lengths) {
                        writer.append(line + '\r\n')
                    } else if (index == lengths) {
                        writer.append('\r\r\n' + sw.toString() + '\r\n')
                        writer.append(lines.get(lengths))
                    }
                }
            }
        }

    }
}
配置文件

main/resources/META-INF/gradle-plugins/com.yaoyan.gradle.study.properties

implementation-class=com.yaoyan.gradle.study.GradleStudyPlugin
使用

在这里插入图片描述

apply plugin: 'com.yaoyan.gradle.study'
yaoyanInfo {
     versionCode = '1.0.0'
     versionName = '100'
     versionInfo = 'xixi'
     fileName = 'releases.xml'
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值