增加自己的自定义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都可以了,这也是插桩等的第一步。