插件的概念

Gradle自身提供了根本的概念和 核心框架,这两样东西,完全不涉及到 事务内容,它们只提供事务可能用到的抽象过程,而事务内容(涉及到实在运用场景的逻辑性质的代码)悉数以外来扩展插件的方法完成。Gradle自身内置了一些常用插件,他们根本上能协助咱们处理大部分场景,但是也有破例,有些插件需求咱们手动去开发,乃至发布。

插件的作用

上面说过,插件是核心模块的扩展。咱们将一个gradle plugin运用到咱们的项目中之后,能够帮咱们处理构建过程中的许多工作,举个例子:

  1. 增加扩展属性

    android{} 内部诸多的装备项,便是 com.android.tools.build:gradle插件为project对象(gradle默许的顶层对象)增加的一个扩展,咱们在android{}中指定sdk版别以及其他参数

  2. 增加新的task到你已有的task列表中

    增加自定义的task,然后与已有任务挂钩,是十分基础的改变打包流程的做法。

  3. 增加依靠装备

    当咱们编译项目时,假如需求用到第三方依靠,gradle插件能够协助咱们设定第三方依靠库的地址

  4. 预设约定

    比方咱们的java源代码的方位,默许便是src/main/java,假如咱们想把其他某些当地的java文件也打成class,dex到终究的apk内部,也能用插件来做到。

怎么运用插件

假如有一个新的插件,咱们希望它在咱们的项目中发挥作用,应该怎么做?

首要来看看插件的分类:

二进制插件

二进制插件有几个要素:

  1. 完成 org.gradle.api.Plugin接口
  2. 进行大局id的注册

它的实质是一个jar包,内部包含了插件逻辑,可编写的语言包含 java, kotlin以及groovy,

假如咱们完成了一个二进制插件,完整类名为:com.test.my.MyPlugin,那么运用它的写法为:

apply plugin: ‘com.test.my.MyPlugin’

有必要确保完整类名大局唯一。

脚本插件

脚本插件,则是 以纯 gradle文件的方法表现的 插件逻辑。

比方,咱们设定了一个version.gradle用于保存一切的版别号:

// ext是rootProject的成员属性,
// 留意,一切的gradle文件都默许引用了 大局的rootProject
ext {
    versionName = '1.0.0'
    versionCode = 100
}

那么,咱们在同级目录下的build.gradle文件中则能够直接这么用:

相对路径的写法:

apply from: "../version.gradle"

或者 用 rootProject对象来获取文件:

apply from: rootProject.file('version.gradle')

总是便是让当时的build.gradle引用到 其他方位的gradle文件,类似 java的import操作。

相同,假如是网络上的 gradle文件,则能够直接运用:

apply from: 'https://example.com/version.gradle'

apply的多种用法

map方法

剖析刚才的 apply from的写法,其实后面的 from:'xxxx' 是一个 Map的写法,方法的原型是:

void apply(Map<String, ?> options);

闭包方法

还有闭包的写法:

apply {
    from '../version.gradle'
}

它的原型则是:

void apply(Closure closure)

另外,还有 action的写法:

action方法

void apply(Action<? super ObjectConfigurationAction> action);

详细写法为:

apply (new Action<ObjectConfigurationAction>() {
    @Override
    void execute(ObjectConfigurationAction objectConfigurationAction) {
        objectConfigurationAction.from('../version.gradle')
    }
})

以上三种写法作用同等。

运用第三方插件

常规方法

第三方发布的二进制插件,咱们有必要在 运用之前先下载它的下载库房,方位在 大局的build.gradle中:

比方:

buildscript {
    repositories {
        google()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.0'
    }
}

比方上面的写法,buildScript装备,便是装备了 远程库房地址为:google(). 实际地址为:https://dl.google.com/dl/android/maven2/

然后设定要运用的插件的 DSL参数,包含 groupname,以及version,别离对应上面的:com.android.tools.build , gradle, 4.0.0 这3个。

除此之外,还有另外一种写法:

运用plugins DSL

plugins {
    id 'com.android.tools.build:gradle' version '4.0.0'
}

作用同等。

有必要留意的是

假如是要apply一个官方库房的插件的话,前面 buildScript 的装备能够不写,因为内置了,官方插件库房的地址是:https://plugins.gradle.org/,许多优异的插件,好用的轮子,能够直接找到而不需求自己开发,这便是gradle的生态。