一、自定义Gradle插件
步骤如下:
创建空目录,命名HelloPlugin。
进入HelloPlugin目录下,新建build.gradle,写如下脚本代码:
apply plugin: 'groovy' apply plugin: 'maven' dependencies { implementation gradleApi() implementation localGroovy() } repositories { google() jcenter() } //将插件打包上传到本地maven仓库 uploadArchives { repositories { mavenDeployer { pom.groupId = 'com.mtan' pom.artifactId = 'HelloPlugin' pom.version = '1.0.0' repository(url: uri('../repos')) } } }
新增目录src/main/groovy/com/mtan/plugin,新建HelloPlugin.groovy类,代码:
package com.mtan.plugin; import org.gradle.api.Plugin import org.gradle.api.Project public class HelloPlugin implements Plugin<Project> { public void apply(Project project) { println 'HelloPlugin apply' } }
新建目录src/main/resources/META-INF/gradle-plugins,新增com.mtan.plugin.properties文件,代码:
implementation-class=com.mtan.plugin.HelloPlugin
项目导入idea中,执行uploadArchives任务,即可完成插件上传。
二、自定义Task
在com.mtan.plugin包下新建task包,然后新建TestTask,注意后缀必须是groovy,不是java,代码如下:
package com.mtan.plugin.task; import org.gradle.api.DefaultTask; import org.gradle.api.tasks.TaskAction; class TestTask extends DefaultTask { TestTask() { group = 'kk' } @TaskAction def doExecute() { println '哈哈哈' } }
在HelloPlugin中添加TestTask对象到项目tasks中:
package com.mtan.plugin import com.mtan.plugin.task.TestTask; import org.gradle.api.Plugin import org.gradle.api.Project public class HelloPlugin implements Plugin<Project> { public void apply(Project project) { println 'HelloPlugin apply' project.tasks.create("mao", TestTask) } }
这样一个自定义的Task就实现好了,其它项目引入该Gradle插件后,就可以直接执行该TestTask。
三、自定义Transform
Transform是在javac编译之后执行的,如果我们自己定义了Transform,那么会比系统预定义的Transform先执行,我们可以通过Transform实现修改字节码等操作。
先依赖android gradle插件,注意可能需要换个仓库,如下:
dependencies { implementation gradleApi() implementation localGroovy() implementation "com.android.tools.build:gradle:3.3.2" } repositories { google() jcenter() }
在com.mtan.plugin包下新建包transform包,新增TestTransform.groovy,代码:
package com.mtan.plugin.transform; import com.android.build.api.transform.QualifiedContent; import com.android.build.api.transform.Transform; import com.android.build.api.transform.TransformException; import com.android.build.api.transform.TransformInvocation; import com.android.build.gradle.internal.pipeline.TransformManager; import java.io.IOException; import java.util.Set; public class TestTransform extends Transform { @Override public void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException { super.transform(transformInvocation); println 'TestTransform transform' } @Override String getName() { return this.class.name } @Override Set<QualifiedContent.ContentType> getInputTypes() { return TransformManager.CONTENT_CLASS } @Override Set<? super QualifiedContent.Scope> getScopes() { return TransformManager.SCOPE_FULL_PROJECT } @Override boolean isIncremental() { return false; } }
在HelloPlugin中添加TestTransform对象到transform链中:
package com.mtan.plugin import com.android.build.gradle.AppExtension import com.mtan.plugin.task.TestTask import com.mtan.plugin.transform.TestTransform; import org.gradle.api.Plugin import org.gradle.api.Project public class HelloPlugin implements Plugin<Project> { public void apply(Project project) { println 'HelloPlugin apply' def android = project.extensions.getByType(AppExtension) project.tasks.create("mao", TestTask) android.registerTransform(new TestTransform()) } }
这样一个自定义Transform就实现好了,其它项目引入该Gradle插件后,执行编译,就可以看到该Transform被执行了,打印了日志。