适用于Android开发者的本地Gradle Plugin的创建以及使用

1,260 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

前言

Gradle Plugin其实在日常的开发中,开发者主动去接触其中原理以及怎么构建的机会其实是很少的。如果没有一些插桩 或者是无痕埋点以及一些特殊的处理,大部分的开发者都不会怎么去关心,只要使用好默认提供的插件就OK了也就是这么几行

image.png

Gradle Plugin有什么作用

  • 无痕埋点
  • 修改资源
  • 压缩图片
  • 修改字节码
  • 切面编程

创建以及使用Plugin

创建plugin的方式有

  • 直接在gradle中构建一个plugin对象
  • 使用本地Moudle buildSrc构建
  • 使用单独的gradle插件project 第一种方式使用的情况较少,不适合复合。 创建及使用方式如下,直接在build.gradle中创建
//如果需要测试 可以将这部分代码直接粘贴到build.gradle中即可执行
class TestPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
        //创建dsl扩展
        def testExtension = project.extensions.create("testExtension", TestExtension)
        //在执行当前工程 build.gradle 后,会回调 Gradle 对象的 afterProject 方法和当前 Project 对象的 afterEvaluate 方法
        project.afterEvaluate {
            println(testExtension.configName)
            println(testExtension.extensionVersion)
        }
    }
}

class TestExtension {
    def configName = "测试textExtension"
    def extensionVersion = 1.0
}

apply plugin: TestPlugin

//dsl扩展(这个是扩展,跟plugin不是一个概念,不一定要有这个东西,但是如果你想有一些自己的配置 就可以这么用)
testExtension {
    configName "我修改了这个"
    extensionVersion 1.1
}

第二种方式跟第三种方式区别在于一个是Moudle一个是project 这里使用buildSrc的方式进行创建,方便调试应用 首先 新建一个module 取名叫buildSrc(注意,一定要叫这个名字,而且在setting.gradle中不要include这个Moudle,gradle会自动引入)大概的目录结构为

image.png 贴一下 com.ljy.test.properties 的代码 就只有一行,很简单,唯一要注意的就是命名就是到时候依赖插件的时候的名字

implementation-class=com.test.TestPlugin

大致的目录结构完成后就可以进行plugin的编写了

//大致的插件编写
public class TestPlugin implements Plugin<Project> {

  @Override
  public void apply(Project project) {
    //创建扩展dsl
    TestExtension testExtension = project.getExtensions()
        .create("testExtension", TestExtension.class);
    //在执行当前工程 build.gradle 后,会回调 Gradle 对象的 afterProject 方法和当前 Project 对象的 afterEvaluate 方法
    project.afterEvaluate(project1 -> {
      System.out.println(testExtension.getConfigName());
      System.out.println(testExtension.getExtensionVersion());
    });
  }
}
//DSL扩展类,用来更改配置,这里就是一个示例,抛砖引玉
public class TestExtension {

  private String configName="";
  private double extensionVersion=1.0;

  public String getConfigName() {
    return configName;
  }

  public void setConfigName(String configName) {
    this.configName = configName;
  }

  public double getExtensionVersion() {
    return extensionVersion;
  }

  public void setExtensionVersion(double extensionVersion) {
    this.extensionVersion = extensionVersion;
  }
}

在build.gradle 引入插件以及扩展

apply plugin: "com.ljy.test"


testExtension {
    configName "我修改了这个"
    extensionVersion 1.1
}

总结

以上就是如何在本地构建一个gradle plugin的全过程啦,全部代码基本上都贴出来了,没贴的就是不影响使用的,这里没有对具体的原理以及各种方法代表的含义进行说明,因为我说的可能你们也没法理解,代码量其实很少,如果有不懂的地方,网上搜索一下,自己理解比我讲会更好。这也是我不提供案例的原因,自己动手创建之后,才能理解,动手才是学习的最好方式,感谢大家的观看,谢谢大家