增加自己的自定义plugin,使用的是最简单的那种, 在项目下创建一个buildSrc Java Module,然后在apply哪里改:
// 引入对应的plugin
apply plugin: 'groovy'
apply plugin: 'java'
dependencies {
implementation gradleApi()// 引入gradle api
implementation localGroovy()// 引入groovy
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
sourceSets {// 源码地址
main {
groovy {
srcDir 'src/main/groovy'
}
java {
srcDir "src/main/java"
}
resources {
srcDir 'src/main/resources'
}
}
}
sourceCompatibility = "7"
targetCompatibility = "7"
这个就是完整的gradle文件配置,通过这个配置之后,在添加对应的plugin以及task即可,
public class FirstPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
// 新建一个名为hello的task,实际调用为MyTest
project.getTasks().create("hello", MyTest.class, new Action<MyTest>() {
@Override
public void execute(MyTest myTest) {
// 这里调用task
myTest.str = "xuepanjie";
myTest.say();
myTest.str = "hello";
}
});
}
} // plugin 代码
public class MyTest extends DefaultTask {
public String str;
@TaskAction
public void say(){
System.out.print(str);
}
}// task代码
这时如果在App内的plugin apply对应的first plugin,那么在执行assembleDebug的时候就会调用这个新增的Plugin了,这里可以增加自己的task也可以增加自己的transform,当然也可以不在这里增加buildSrc这种方式,而改成独立的moudle然后发布之后在目标app去依赖即可,类似booster这种方式。
即使这种简单的加法也遇到问题,问题是在新建module的时候选择了library,应该选择java那种形式然后修改对应的build文件才行。
借鉴:https://guides.gradle.org/writing-gradle-plugins/
使用非buildSrc新建gradle的方法和这个类似,只是命名为someName即可,然后在目标module的gradle脚本中增加当前plugin的group和version信息,之后新增一个编译上传脚本,当这个plugin编译完成后发布,在别的app内根据这个group以及version去依赖即可。
// 版本以及组信息
version 1.0
group "com.geektime.asm"
apply from: rootProject.file('gradle/java-publish.gradle')
上面的是在对应的新建plugin内build新增代码
// 发布plugin代码
// 借鉴shaowen老师的github
task buildAndPublishToLocalMaven(type: Copy, dependsOn: ['build', 'publishToMavenLocal']) {
group = 'geektime'
// save artifacts files to artifacts folder
from configurations.archives.allArtifacts.files
into "${rootProject.buildDir}/outputs/artifacts/"
rename { String fileName ->
fileName.replace("release.aar", "${version}.aar")
}
doLast {
println "* published to maven local: ${project.group}:${project.name}:${project.version}"
}
}
创建非buildSrc的plugin
仿造shaowen大佬写的用非buildSrc形式创建新的plugin,遇到了挺多问题,首先由于buildSrc是基于Java library的创建的,导致我在导包的时候各种问题,主要是asm等包导入的时候一直报错,至今不知原因,换成新建一个正常的android library就OK了,只需要把原来的代码和build.gradle挪过去,这里就是简单的完成,接着就是将发布到本地的脚本也移植过去,这时候按照原来的步骤,先发布jar包到本地,这里的配置是在module的根目录增加gradle.properties文件,这里设定一些信息,例如pluginname等,这时候发布好了,然后在项目跟目录的build.gradle里面配置新编译出来的jar包信息使用classpath引入,这样在app就能使用jar包里面的plugin了。
这时候还有一个问题,因为这是一个gradle插件,所以需要apply,不能直接implemation这种方式,本身他们含义也不同。
这时候还有一个问题就是少加了一个resources(也可以不加,那就直接按照包名去apply),需要在里面增加META-INF.gradle-plugins,下面有一个plugin别名的文件,内容是指向我们需要apply的plugin,加上这个然后再在app引入就完美运行了。
这时候再在新的module里面写各种task或者transform都可以了,这也是插桩等的第一步。