Gradle_03 gradle核心API

396 阅读3分钟

Gradle概述

gradle 主要是用来构建项目的 gradle由三个部分组成

  • groovy核心语法
  • build script block
  • gradle api

相对于maven,ant,gradle在灵活性、粒度性、兼容性上要强很多

1.gradle生命周期

在安卓项目的gradle文件中添加以下声明周期监听方法

/**
 * 配置阶段开始前的监听回调
 */
this.beforeEvaluate {
    println '配置即将开始...'
}
/**
 * 配置阶段完成以后监听回调
 */
this.afterEvaluate {
    println '配置阶段执行完毕...'
}
/**
 * gradle执行完毕监听回调
 */
this.gradle.buildFinished {
    println '执行阶段执行完毕...'
}
//同beforeEvaluate
this.gradle.beforeProject {}
//同afterEvaluate
this.gradle.afterProject {}

输出如下

2. project 核心 API

2.1 getAllprojects()获取所有project

getSubprojects()获取子project
项目根目录下build.gradle敲以下代码

this.getProjects()
def getProjects(){
    println '----------'
    println 'Root Project'
    println '----------'
    this.getAllprojects().eachWithIndex{ Project project, int index ->
        if(index == 0){
            println "Root project ':${project.name}'"
        }else{
            println "+--- project ':${project.name}'"
        }
    }
}
//Terminal下 ./gradlew clean 命令 输出
// ----------
//Root Project
//----------
//Root project ':DSH_JAVA'
//+--- project ':app'
//+--- project ':libmodule'
2.2 getParentProject() module工程下build.gradle敲击以下代码
//获取父project
this.getParentProject()
def getParentProject(){
    def name = this.getParent().name
    println "the parent project name is:${name}"//the parent project name is:DSH_JAVA

}
2.3 getRootProject() 获取根project
this.getRootPro()
def getRootPro(){
    def name = this.getRootProject().name
    println "the root project name is:${name}"//the root project name is:DSH_JAVA

}
2.4 通过project() 可以在根目录下为所有子工程进行配置
//通过project() 可以在根目录下为所有子工程进行配置
project('app'){Project project ->
    apply plugin:'com.android.application'
    version '1.0.0-release'
    group 'com.java.dsh'
    android{}
    dependencies {}
}
project('libmodule'){
    apply plugin: 'com.android.library'
    group 'com.java.dsh'
    android{}
    dependencies {}
}
2.5 为整个工程配置(当前节点project和所有subprojects)
allprojects {
    group 'com.dsh.java'
    version '1.0.0-release'
    repositories {
        google()
        jcenter()
    }
}
2.6 subprojects()为所有子工程进行配置
//subprojects() 子工程
//不包括当前节点工程,只包括它的subproject
subprojects {
    //子工程中的库工程推送到maven
    if (project.plugins.hasPlugin('com.android.library')) {
        apply from '../publishToMaven.gradle'
    }
}

3. 属性相关API

3.1 ext 拓展属性

①在项目根目录下新建config.gradle

//ext+闭包 扩展属性
ext{
    compileSdkVersion = 28
    //定义一个map
    android = [
            versionCode       : 100,
            versionName       : "1.0.0",
    ]
}

②在根目录build.gradle中引入onfig.gradle

apply from: "config.gradle"
//或者
apply from: this.file("config.gradle")

③然后在子工程目录build.gradle中使用拓展属性

apply plugin: 'com.android.application'


android {
    //config.gradle 扩展属性 ext
//    compileSdkVersion this.rootProject.ext.compileSdkVersion
    // 也可以直接调用
    compileSdkVersion this.compileSdkVersion
    defaultConfig {
        applicationId "com.dsh.java"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode this.rootProject.ext.android["versionCode"]
        versionName this.rootProject.ext.android["versionName"]
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}
3.2 gradle.properties 拓展属性

①gradle.properties中添加如下代码

enableLib = true
applicationId = com.dsh.java

②根目录下settings.gradle中配置模块加载

include ':app'
//通过gradle.properties中enableLib属性 配置libModule是否加载
if (hasProperty('enableLib')?enableLib.toBoolean():false){
    include ':libmodule'
}

③子工程build.gradle中直接使用applicationId属性

defaultConfig {
        applicationId applicationId
        ...
    }
3.3 文件操作api

①获取路径

//1. 获取路径
println 'the root file path is:'+getRootDir().absolutePath
println 'the build file path is:'+getBuildDir().absolutePath
println 'the project file path is:'+getProjectDir().absolutePath

②定位文件

//2. file 定位文件
println getContent('README.md')
def getContent(String path){
    try {
        //file 定位一个文件 相对于当前的project工程开始查找无需传入绝对路径
        def file = file(path)
        return file.text
    } catch (GradleException e) {
        println 'file not found'
    }
}

③拷贝文件

//3. copy拷贝
copy {
    from file('build/outputs/apk')
    into getRootProject().getRootDir().path +"/apl/"
    exclude {}
    rename {}
}

④对文件树遍历

//4. 对文件树进行遍历 以及拷贝
fileTree('app/build/outputs/logs/'){FileTree fileTree ->
    fileTree.visit {FileTreeElement element ->
        println 'the file name is : '+element.file.name
        copy {
            from element.file
            into getRootProject().getRootDir().path+'/test/'
        }
    }
}

4.依赖相关api

4.1 buildscript

根目录build.gradle中的配置

buildscript { ScriptHandler scriptHandler ->
    //配置工程的仓库地址
    repositories {
        google()
        jcenter()
        maven{//配置maven仓库
            name "${name}"
            url   "${url}"
             credentials {
                 username = 'joe'
                 password = 'secret'
               }
        }
    }
    //配置工程的"插件"依赖地址
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
    }
}
4.2 dependencies

子工程app目录下build.gradle中的配置

//为应用程序添加第三方依赖
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    implementation ('com.xxxxxx.sdk:1.0.0'){
        exclude module:'picture_edit'//排除依赖
        transitive false //传递依赖  false 禁止,尽量不使用
    }
    provided 'xxx' //占位编译,编译时起作用,运行时不起作用,可以减少输出包大小
}

5. Task

5.1执行外部命令

app/build.gradle 下添加apk复制task,终端下输入.gradlew apkcopy执行命令

//5 执行外部命令
task apkcopy(name:'apkcopy'){
    doLast {
        //gradle的阶段去执行
        def sourcePath = this.buildDir.path+'/outputs/apk'
        def desationPath = getRootProject().getRootDir().path+'/test/'
        def command = "mv -f ${sourcePath} ${desationPath}"
        exec{
            try {
                executable 'bash'
                args '-c',command
                println 'the command is execute success'
            } catch (GradleException e) {
                println 'the command is execute failed'
            }
        }
    }
}