Gradle插件开发

一、Gradle插件的概念

Gradle是一个构建工具,让工程构建更加自动化,不过它只是一个执行环境,提供了基本的框架,真正的构建行为不是Gradle提供,Gradle负责在运行时,找到所有需要执行的任务一一去执行。

上面提到的任务有两种方式创建,一是手动创建,如在自定义任务里编译工程的java代码;二是通过插件,将相似的代码进行封装,几乎所有的功能都是以插件的形式提供。插件负责封装或者提供Gradle运行期间需要的Task,在工程中依赖某个插件后,就能复用这个插件提供的构建行为。

Android Gradle插件就是基于java插件扩展的,在编译java代码的基础上,添加了编译资源、打包APK的功能。

二、Gradle插件的分类

Gradle插件分为两种:二进制插件和脚本插件。

脚本插件:轻量级,独立的Gradle脚本。脚本中可以对工程的build.gradle脚本中的配置进行进一步配置或补充,既可存在于工程的目录里,又可存在于某远程服务器的地址中。

二进制插件:实现了plugin接口,可存在于独立的编译脚本里,也可作为独立的工程去维护,对外发布成插件Jar包,如Android插件。

插件最开始的形式是脚本插件,当脚本中的代码需要复用时,可将脚本插件包装成一个二进制插件,方便在不同的团队或工程进行共享。

2.1 二进制插件的用法

二进制插件的用法分为三部:声明插件的ID与版本号

1)声明插件的ID与版本号

进入根目录build.gradle,在buildscript内dependencies中通过classpath声明需要使用的插件的ID与版本号,如

classpath "com.android.tools.build:gradle:4.1.3"
复制代码

然后Gradle将这个插件下载到本地。

2)应用插件

在子工程的build.gradle,通过apply应用插件,绑定插件与工程,如

apply plugin:'com.android.application'
复制代码

apply plugin后面引用的名称由发布插件方在说明中给出

3)插件参数配置(可选)

插件自定义是否需要配置,有些插件无需配置参数。如

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    defaultConfig {
        applicationId "com.example.router"
        minSdkVersion 29
        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'
        }
    }
}
复制代码

2.2 脚本插件的用法

在工程的根目录新建文件other.gradle,写上代码

println("我是脚本插件的代码")
复制代码

在子工程build.gradle加上代码

println("我是 app-build.gradle 的代码")
apply from: project.rootProject.file("other.gradle")
复制代码

三、Gradle二进制插件自定义

插件自定义包括三个步骤:建立插件工程、配置参数、发布插件与使用插件。

3.1 建立插件工程

复杂的或者需要被复用的构建逻辑可以被实现成为二进制插件,二进制插件开发形式可以有两种,一是实现成为普通的独立工程,调试时需要手动发布成Jar包给其他工程引用进行测试;二是实现成buildSrc工程,属于子工程,如果把插件的逻辑写在里面,在构建时Gradle会自动将它打包成一个二进制插件Jar包,更方便。

1)建立buildSrc子工程

建立普通工程如Router,在根目录下建立子工程buildSrc(Gradle约定必须以该名字命名),在该工程添加build.gradle文件来配置该工程。

用Gradle里面的groovy语言来实现该插件,需要依赖groovy插件编译groovy代码。声明将使用到的第三方包所属仓库。指定需要的第三方包。代码如下

apply plugin:'groovy'

repositories {
    jcenter()
}

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}
复制代码

2)建立插件运行入口

在buildSrc中建立源码目录,新建文件RouterPlugin.groovy,该类需要实现Plugin接口并实现apply方法,当我们采用apply关键字在工程中引用插件时,apply方法里的逻辑会被执行,可以在apply方法里注入插件的逻辑,如往工程里动态添加一个Task。代码如

package com.immoc.router.gradle

import org.gradle.api.Plugin
import org.gradle.api.Project

class RouterPlugin implements Plugin<Project> {
    void apply(Project project) {
        println("I am from RouterPlugin, apply from ${project.name}")
    }
}
复制代码

在META-INF.gradle-plugins文件夹下新建properties文件,添加代码

implementation-class=com.immoc.router.gradle.RouterPlugin
复制代码

在app工程build.gradle应用插件如

apply plugin:'com.imooc.router'
复制代码

3.2 实现参数配置

实现参数配置需要4个步骤:定义Extension、注册Extension、使用Extension

1)定义Extension

在Plugin同级目录新建Extension.groovy文件,添加文档保存路径参数,如

package com.immoc.router.gradle

class RouterExtension {
    String wikiDir
}
复制代码

2)注册Extension

在Plugin子类的apply方法中注册Extension,代码如加粗部分

package com.immoc.router.gradle

import org.gradle.api.Plugin
import org.gradle.api.Project

class RouterPlugin implements Plugin<Project> {
    void apply(Project project) {
        println("I am from RouterPlugin, apply from ${project.name}")
        **project.getExtensions().create("router", RouterExtension)**
    }
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享