一、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)**
}
}
复制代码