文章目录
gradle自定义插件实现
Gradle插件实现的基本情况共有三种:
插件实现方式 | 解释说明 |
---|---|
buildScript脚本 | 把插件写在build.gradle文件中,一般用于简单的逻辑,只在该build.grade文件可见 |
buildSrc目录 | 将插件源代码放在buildSrc/src/main中,只对该项目可见 |
独立项目 | 个独立的Java项目/模块,可以将文件包发布到仓库(Jecenter,Maven),使其他项目方便引入 |
下面分别对三种方式一一说明:
1、build script 脚本
这种方式实现的插件只有build.gradle文件可见,例如在app的build.gradle中,插件名PluginDemo实现方式:
apply plugin: PluginDemo //引入插件
//定义插件
class PluginDemo implements Plugin<Project> {
@Override
void apply(Project project) {
println '第一种方式实现插件'
}
}
执行结果
2、buildSrc目录
这种方式创建的Module是一个独特的,AndroidStudio会自动识别buildSrc插件模块。
首先,在项目的根目录下创建一个buildSrc文件夹,然后在buildSrc文件夹里创建一个build.gradle文件,build.gradle文件代码如下:
apply plugin: "java"
apply plugin: 'java-gradle-plugin'
然后,点击Sync同步项目,就会发现buildSrc文件夹下会多出一些gradle的相关文件,截图如下:
接下来在buildSrc上右键新建文件夹,会发现多出一些文件夹选择,如下:
选择Java文件夹,在其下面创建一个MyPlugin.java文件, 截图如下:
// MyPlugin.java
import org.gradle.api.Plugin;
import org.gradle.api.Project;
class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project target) {
System.out.println("第二种实现插件方式 buildSrc 实现插件");
}
}
还是一样在App模块的build.gradle中加入如下代码
apply plugin: MyPlugin
运行结果如下:
3、通过Module/Library自定义插件
如果是通过Android Library自定义插件的话,该module下的build.gradle生成的内容并不需要,全部删除,新加上 Gradle 插件开发需要的 Gradle 插件、依赖等。
plugins {
id 'java-library'
id 'groovy' // 应用 'groovy' 插件是因为我们的项目是使用 Groovy 语言开发的
}
java {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
plugins {
id 'java-library'
id 'groovy' // 应用 'groovy' 插件是因为我们的项目是使用 Groovy 语言开发的
}
java {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
apply plugin: 'maven-publish' // 发布到maven仓库需要的插件
// 后面发布仓库的时候添加
//publishing {
// publications {
// MyPlugin(MavenPublication) {
// from components.java
// groupId 'com.example.mylibrary' // 唯一标识(通常为模块包名,也可以任意)
// artifactId 'plugin' // 项目名称(通常为类库模块名称,也可以任意)
// version '1.0.0' // 版本号
// }
// }
//}
3.1 新建一个Library
比如说新建一个Android Library
3.2 创建resources/META-INF/gradle-plugins/XXXX.properties文件
其中,resources 和Java同级,resources 可以通过在main文件夹右键提示创建。resources 文件夹下是固定格式的 META-INF/gradle-plugins/XXXX.properties,必须是这个路径,XXXX 就代表以后使用插件时需要指定的 plugin id。
比方说创建com.example.plugins.properties ,以后使用插件的时候,插件的id必须是
com.example.plugins
apply plugin: 'com.example.plugins'
创建图片如下:
说明一下com.example.plugins.properties文件的含义:
文件名com.example.plugins就是我们项目中要引入的插件的名称,插件名称可以自定义。.properties文件的内容要填什么?就是从入口找到的插件类。
示例代码:
com.example.plugins.properties
/*
Gradle 插件并不会自动寻找入口类,而是要求开发者把入口类的类名写在
resources/META-INF/gradle-plugins/XXXX.properties 里,
内容格式为 “implementation-class=入口类的全限定名”
*/
implementation-class =com.example.mylibrary.MyPlugin
package com.example.mylibrary;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
//Project 和 Plugin 都是在这个包 org.gradle.api下的
class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project target) {
System.out.println("第三种实现 自定插件方式");
}
}
3.3 发布到仓库(这里弄到本地仓库,不弄到远程仓库了)
在插件的build.gradle再添加如下脚本,这里需要发布,后面才可以使用。
apply plugin: 'maven-publish' // 发布到maven仓库需要的插件
publishing {
publications {
MyPlugin(MavenPublication) {
from components.java
groupId 'com.android' // 唯一标识(通常为模块包名,也可以任意)
artifactId 'plugin' // 项目名称(通常为类库模块名称,也可以任意)
version '1.0.0' // 版本号
}
}
}
// gradle旧版发布方式
//uploadArchives{
// repositories.mavenDeployer {
// //本地仓库路径,以放到项目根目录下的 repo 的文件夹为例
// repository(url: uri('../repo'))
// //groupId ,自行定义
// pom.groupId = 'com.android'
// //artifactId
// pom.artifactId = 'plugin'
// //插件版本号
// pom.version = '1.0.0'
// }
//}
3.4 点击task发布
单击 rebuild,进行编译,之后点击右侧菜单栏在打开Gadle
双击3的位置,进行本地发布,完了以后这个插件就可以使用了;
3.5 引入插件到工程
在主工程的build.gradle文件中添加如下:
buildscript {
repositories {
mavenLocal() //默认路径在C:/Users/用户名/.m2/repository下面,(本机电脑)
// 如果是发布到指定的目录,声明的时候要显示声明路径
// maven{
// // 刚刚我们把插件发布到了根目录下面的 repo 文件夹
// url 'repo'
// }
}
dependencies {
classpath 'com.android:plugin:1.0.0'//引入插件
}
}
3.6 使用插进
在app项目的build.gradle中添加
apply plugin: 'com.example.plugins'
3.7 运行代码
打印说明,自定义插件成功实现。
as gradle插件开发不友好的地方
目前 Android Studio 对于 Gradle 插件开发的支持不够好,很多 IDE 本可以完成的工作都需要我们手动完成,例如
-
Android Studio 不能够直接新建 Gradle 插件的 Module,只能先新建一个 Java Library 类型的 Module,再把多余的文件夹删除;
-
新建类默认是新建 Java 的类,新建的文件名后缀是 “.java”,想要新建 Groovy 语法的类需要手动新建一个后缀为 “.groovy” 的文件,然后添加上 package、class 声明;
-
resources 整个都需要手动创建,文件夹名需要注意拼写;
-
删除掉 Module 的 build.gradle 全部内容,新加上 Gradle 插件开发需要的 Gradle 插件、依赖等