Gradle 相关总结

2021-05-25  本文已影响0人  有没有口罩给我一个

Gradle 相关总结
APT 和 AGPTransform 区别
Gradle+Transform+Asm自动化注入代码
Android 360加固+Walle多渠道自动化打包上传蒲公英

gradle 是什么?

Gradle基础

基本概念

开始学习Gradle前,我们应该先大概了解关于Gradle中的一些基础概念:

Type of script Delegates to instance of
Build script (build.gradle) Project
Init script Gradle
Settings script(settings.gradle) Settings

你可以在脚本中使用委托对象的属性和方法。

1. Gradle构建生命周期 Build Lifecycle

1.1初始化阶段(Initialization):
1.2配置阶段(Configuration):
1.3执行阶段(Execution):

*执行阶段主要做的事情就是执行 Task,进行主要的构建工作;

小结:

Initialization(初始化阶段)

1.Init Script(初始化脚本)

涉及到的脚本执行顺序如下:

GRADLE_USER_HOME/init.gradle → GRADLE_USER_HOME/init.d/*.gradle

这一步生成 Gradle 对象,并且会优先执行GRADLE_USER_HOME/init.gradle脚本和GRADLE_USER_HOME/init.d/*.gradle脚本,如果存在的话,下面是Gradle类部分源码如下:

public interface Gradle extends PluginAware {
    String getGradleVersion();//执行此次构建的Gradle版本;
    File getGradleUserHomeDir();//Gradle User Home目录;
    File getGradleHomeDir();//执行此次构建的Gradle目录;
    Project getRootProject()// 获取当前构建的根项目
    StartParameter getStartParameter();//获取传入当前构建的所有参数
    TaskExecutionGraph getTaskGraph();//获取当前构建的task graph,此对象在taskGraph.whenReady { } 后才具有内容
}

Gradle父类 PluginAware 源码 :

public interface PluginAware {
      PluginContainer getPlugins();
      void apply(Closure closure);
      void apply(Action<? super ObjectConfigurationAction> action);
      void apply(Map<String, ?> options);
      PluginManager getPluginManager();
 }

2. Settings Script(设置脚本)

配置阶段(Configuration)

1.Build Script(构建脚本build.gradle脚本)

build.gradle用于配置模块的构建所需要信息,分为根目录的 Root Build Script 和 子模块的 Module Build Script。

1.1、Root Build Script

1.2、Module Build Script

1.2.1 插件引入

Gradle插件是什么,官方解释

Gradle at its core intentionally provides very little for real world automation. All of the useful features, like the ability to compile Java code, are added by plugins. Plugins add new tasks (e.g. JavaCompile), domain objects (e.g. SourceSet), conventions (e.g. Java source is located at src/main/java) as well as extending core objects and objects from other plugins.

1.2.1 .1 插件类型

Gradle中有两种通用的插件类型,即二进制插件和脚本插件。

示例:
引用二进制插件:

apply plugin: 'com.android.application'

应用工程目录下的脚本插件:

 apply from: rootProject.file("script_plugin.gradle")
1.2.2 插件属性配置和方法调用

如果项目中应用了某个插件,就可以使用此插件提供的DSL进行配置,以此干预模块的构建过程。以com.android.application插件构建为例:

 // 引入android.application插件 
 apply plugin: 'com.android.application'

android {
  compileSdkVersion 30
  buildToolsVersion "30.0.3"

  defaultConfig {
    applicationId "com.github.gradle"
    minSdkVersion 21
    targetSdkVersion 30
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
                'proguard-rules.pro'
    }
}

sourceSets {
    main {}
}
}

关于自定义插件请移步Gradle+Transform+Asm自动化注入代码

Gradle 相关API介绍

由于Gradle类的方法属性很多,Gradle API文档,我就挑几个平时可能会常用的的方法说一说:

API 描述
void beforeProject(Closure closure) 当每个Project对象配置之前被调用,包括根Project
void afterProject(Closure closure) 当每个Project对象配置完毕之后被调用,包括根Project
buildStarted(Closure closure) 当构建开始时回调,这个一般是看不到打印的
settingsEvaluated(Closure closure) 当Settings对象配置完成时回调
projectsLoaded 在初始化阶段中所有的Project对象创建完成时回调
projectsEvaluated 当所有的Project配置完成时回调
buildFinished 当构建完成时回调
addBuildListener 添加构建监听
getRootProject 返回Root Project
TaskExecutionGraph getTaskGraph() 返回此次构建TaskExecutionGraph,此对象在taskGraph.whenReady { } 后才具有内容,因为task还没填充完毕。
String getGradleVersion() 执行此次构建的Gradle版本
File getGradleUserHomeDir() Gradle User Home目录
File getGradleHomeDir() 执行此次构建的Gradle目录
Project getRootProject() 获取当前构建的根项目
StartParameter getStartParameter() 获取传入当前构建的所有参数

TaskExecutionGraph 相关API介绍

TaskExecutionGraph负责管理作为构建部分的Task实例的执行。 TaskExecutionGraph维护要执行(或已执行)的任务的执行计划,您可以从构建文件中查询该计划。 您可以通过调用Gradle.getTaskGraph()访问TaskExecutionGraph。在构建文件中,您可以使用gradle.taskGraph对其进行访问。 仅在配置了此次构建中的所有Project之后,才填充TaskExecutionGraph。在此之前是空的。当填充Graph时,可以使用whenReady或addTaskExecutionGraphListener方法接收通知。

API 描述
addTaskExecutionGraphListener 向TaskExecutionGraph添加TaskExecutionGraphListener监听,在填充TaskExecutionGraph之后以及执行任何任务之前调用此方法
whenReady(Action<TaskExecutionGraph> action) 当TaskExecutionGraph填充完成时被调用
addTaskExecutionListener 向TaskExecutionGraph添加TaskExecutionListener监听
beforeTask(Action<Task> action) 当TaskExecutionGraph管理的某个任务执行之前被调用
afterTask(Action<Task> action) 当TaskExecutionGraph管理的某个任务执行完成之后被调用
hasTask(Task task) 查询TaskExecutionGraph是否存在该task
getAllTasks 获取TaskExecutionGraph管理的所有的Task
Set getDependencies(Task task) 返回TaskExecutionGraph管理的与参数Task的依赖关系

Project相关API介绍

该接口是用于与构建文件中的Gradle对象交互的主要API。可以通过Projec对象以编程方式访问Gradle的所有功能。Project本质上是Task对象的集合

Project生命周期Lifecycle

Project对象和"build.gradle"文件之间存在一对一的关系。在构建初始化期间,Gradle 为要参与构建的每个模块创建一个Project对象,如下所示:

这里仅仅只介绍常用的API,详细API请看-官方文档

API 描述
void beforeEvaluate(Action <? super Project> action) 在配置该Project之前立即调用方法。
void afterEvaluate(Action <? super Project> action) 在配置该Project之后立即调用方法。
getRootProject() 获取根Project
getRootDir 返回该Project根目录。根目录是根Project的Project目录。
getBuildDir 返回该项目的构建目录,构建目录是构建过程中build产物都放入到这个里面,构建目录的默认值为projectDir / build。
setBuildDir(File path) 设置该Project的构建目录。构建目录是构建过程中build产物都放入到这个里面。
getParent() 获取此Project的父Project
getChildProjects 获取此Project的所有直接子Project
setProperty(String name, Object value) 为Project的属性设置新值
getProject() 返回当前Project对象,可用于访问当前Project的属性和方法
getAllprojects 返回当前Project,以及子Project的集合
allprojects(Closure configureClosure) 在配置阶段,闭包中返回Project及其子Project。
getSubprojects 返回当前Project下的所有子Project
subprojects(Closure configureClosure) 返回当前Project下的所有子Project到闭包中
Task task(String name) 创建一个Task,添加到此Project
getAllTasks(boolean recursive) 如果recursive为true那么返回当前Project和子Project的全部Task,如果为false只返回当前Project的所有task
getTasksByName(String name, boolean recursive) 根据名字返回Task,如果recursive为true那么返回当前Project和子Project的Task,如果为false只返回当前Project的task
hasProperty(String propertyName) 查看是否存在此属性
getProperties() 获取所有属性
dependencies(Closure configureClosure) 为Project配置依赖项
buildscript(Closure configureClosure) 为该Project配置构建脚本classpath。
getTasks() 返回此Project中所有的tasks
WorkResult copy(Action<? super CopySpec> action) 复制指定的文件.
CopySpec copySpec(Action<? super CopySpec> action) 创建一个CopySpec,以后可以将其用于复制文件或创建存档。给定的操作用于在此方法返回CopySpec之前对其进行配置。
delete<? super DeleteSpec> action) 删除指定的文件。
Task task(String name, Closure configureClosure) 使用给定名称创建一个Task并将其添加到该Project中。
Task task(Map<String,?) args,String name) 使用给定名称创建一个Task并将其添加到该项目中。可以将创建参数的Map传递给此方法,以控制Task的创建方式

Task介绍

Project本质上是Task对象的集合。每个任务执行一些基本工作,例如编译类,运行单元测试或压缩WAR文件。可以使用TaskContainer的create方法将任务添加到Project中。还可以使用TaskContainer上的查找方法,例如:TaskCollection.getByName(String)方法查找现有Task。

每个Task都会附属一个Project,可以在TaskContainer上使用各种方法来创建和查找任务实例。例如,TaskContainer.create(String)使用给定名称创建一个空任务。您还可以在构建文件中使用task关键字:

task myTask
task myTask1 { Task task ->}
task myTask2(type: JavaCompile)
task myTask3(type: JavaCompile) { Task task -> }
task myTaskDepends { Task task ->
      task.doLast {
    println("execute task: " + task.getName())
}
}

task myTaskDepends1 { Task task ->
task.dependsOn("myTaskDepends")
task.doLast {
    println("execute task: " + task.getName())
}
}


task myTaskDepends2 { Task task ->
task.setDependsOn([myTaskDepends,"myTaskDepends1"])
task.doLast {
    println("execute task: " + task.getName())
}
}

特点:

task排序

在某些情况下, 我们希望能控制Task的执行顺序, 这种控制并不是像上面显式地加入(dependsOn(Object ...)或setDependsOn(Iterable)进行控制)依赖关系。 最主要的区别是我们设定的排序规则不会影响那些要被执行的任务, 只是影响Task执行的顺序本身.

task myTaskX { Task task ->
task.doLast {
    println("execute task: " + task.getName())
}
}

task myTaskY { Task task ->
task.doLast {
    println("execute task: " + task.getName())
}
}
myTaskY.mustRunAfter(myTaskX)

gradlew myTaskY myTaskX -q 的输出:

execute task: myTaskX
execute task: myTaskY

注意 B.mustRunAfter(A) 或者 B.shouldRunAfter(A) 并不影响任何Task间的执行tasks AtaskB可以被独立的执行。排序规则只有当 2 个任务同时执行时才会生效。

上一篇 下一篇

猜你喜欢

热点阅读