开发一个插件的步骤
- 新建一个Android library类型的module, 删掉
src
目录下的androidTest
,test
目录。 - 在
src/main
目录下,新建一个groovy
目录,用来放相关的groovy
文件 - 在
src/main/groovy
目录下新建一个目录com.fred.asm
(请注意是一个目录名为com.fred.asm
, 不是建了一个com/fred/asm
目录) - 在
src/main/groovy/com.fred.asm/
目录下,新建一个类, 这个类是我们的插件入口,我最初的想法是想写一个插件来统计方法的执行时间,所以写了一个类MethodStatPlugin.groovy
public class MethodStatPlugin implements Plugin<Project> {
@Override
void apply(Project target) {
println "plugin execute";
}
}
复制代码
- 在
src/main
目录下面新建一个resources
目录 - 在
src/main/resources/
下新建一个目录META-INF
, 在META-INF
下面再建一个目录gradle-plugins
- 以上步骤完成,便有了
src/main/resources/META-INF/gradle-plugins
目录,接着在这个目录下,我们建一个performance.methodstat.properties
文件 - 在
performance.methodstat.properties
文件中,添加如下代码
implementation-class=com.fred.asm.MethodStatPlugin
复制代码
- 在
build.gradle
文件中添加如下代码:
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation gradleApi()
implementation localGroovy()
implementation 'com.android.tools.build:gradle:3.4.2'
implementation 'org.ow2.asm:asm:7.1'
implementation 'org.ow2.asm:asm-commons:7.1'
}
group='com.fred.asm.plugin'
version='1.0.0'
uploadArchives {
repositories {
mavenDeployer {
//本地的Maven地址设置
repository(url: uri('../asm_plugin_repo'))
}
}
}
复制代码
这一波操作完了,我们的插件module便完成了,其结构如下:
需要注意
- 图片中的
META-INF.gradle-plugins
是android studio折叠后的显示效果,其对应的物理路径是META-INF/gradle-plugins
,performance.methodstat.properties
文件必须是要在src/main/resources/META-INF/gradle-plugins
目录下。
与此同时,我们双击执行android studio右侧的uploadArchives
task, 如下:
便会生成一个本地仓库,将打好的jar包放到这个目录下。
使用插件
在我们的应用的build.gradle
文件中,我们需要引入这个插件:
- 设置依赖库
buildscript {
repositories {
google()
jcenter()
//自定义插件maven地址
maven { url '../asm_plugin_repo' }
}
dependencies {
//加载自定义插件 group + module + version
classpath 'com.fred.asm.plugin:asm-tool:1.0.0'
}
}
复制代码
- 添加插件
apply plugin: 'performance.methodcost'
还记得我们上面插件开发的时候有src/main/resources/META-INF/gradle-plugins
目录下有一个performance.methodstat.properties
文件不,这里的 apply plugin: {pluginId}
, {pluginId}
便是和上面的performance.methodstat.properties
文件相对应。
3.当我们编译应用时如执行assembleDebug
, 可以看到控制台会打印出plugin execute
再来用java写一次
我们知道Groovy也是JVM类的语言,它能做的事,java也可以,我们来用java写一次。还是一样:
- 新建一个Android library类型的module, 删掉
src
目录下的androidTest
,test
目录。 - 在
src/main/java
目录下,新建一个包com.fred.asm
, 注意这是java的包结构,对应到物理目录便是src/main/java/com/fred/asm
- 在
src/main/java/com/fred/asm
下新建一个java类MethodStatPlugin.java
和上面用groovy
写时是一样的命名,这样我们的src/main/resources/META-INF/gradle-plugins
下的配置,还有pluginId都可以保持一致。 MethodStatPlugin.java
中写入如下代码:
public class MethodStatPlugin implements Plugin<Project> {
@Override
public void apply(Project target) {
System.out.println("plugin execute [write by java]");
}
}
复制代码
- 同样用
uploadArchives
编译, 打包,上传插件到本地仓库 - 再重新编译一下使用插件的模块,可以看到控制台输出了
plugin execute [write by java]
, 插件应用成功
采用buildSrc
简化开发
先来了解一下什么是buildSrc?当我们需要写一些插件的时候,可以在Android Studio中创建一个buildSrc
的module, 一个android工程中该module只能有一个。
- Gradle在编译某个module时,会先编译
buildSrc
这个项目, 并配置到classpath下 - 如果
buildSrc
是一个插件项目,Gradle默认会自动配置该Gradle插件,在项目中直接apply
开发的插件即可。
开发步骤
- 用Android studio新建一个java类型的module, 并命名为
buildSrc
(名字必须得是这个) - 修改
build.gradle
添加相关的依赖,如下:
apply plugin: 'java-library'
repositories {
maven { url 'https://jitpack.io' }
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
google()
jcenter()
}
dependencies {
//添加gradle版本
implementation 'com.android.tools.build:gradle:3.4.2'
//添加gradle对应api
implementation gradleApi()
}
复制代码
- 编写插件
public class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project target) {
System.out.println("[App Log]-------------->MyPlugin" );
}
}
复制代码
- 插件的配置
- 在需要使用插件的位子添加的引用
apply plugin: 'com.fred.plugin'
复制代码
至此gradle插件的开发已介绍完毕,后续便是需要熟悉相关的api,根据自己的项目需要,做相关的业务开发。