文章

01.Gradle插件

01.Gradle插件

Gradle 插件

Gradle 插件基础

Gradle 插件的作用

  1. 添加任务到项目中,可对项目进行测试、编译、打包
  2. 添加依赖到项目中,可用来配置项目构建过程中需要的依赖
  3. 可以向项目中现有的对象类型添加新的扩展属性、方法等,可方便项目的配置和构建优化,比如 Android 项目构建中的 android{} 就是 Android Gradle 插件为 Project 对象添加的一个扩展
  4. 可以对项目进行一些约定,如使用 Java Gradle 插件可以约定 src/main/java 目录下源代码的存放位置,在编译的时候就可以编译指定目录下的 Java 源代码文件。

应用一个插件

二进制插件

二进制插件就是实现了 org.gradle.api.Plugin 接口的插件,每个 Java Gradle 插件都有一个 plugin id,可以通过如下方式使用一个 Java 插件:

1
apply plugin : 'java'

其中 java 是 Java 插件的 plugin id,对于 Gradle 自带的核心插件都有唯一的 plugin id,这里的 java 对应的具体类型是 org.gradle.api.plugins.JavaPlugin,所以可以使用如下方式使用 Java 插件:

1
2
apply.plugin:org.gradle.api.plugins.JavaPlugin // org.gradle.api.plugins默认导入
apply.plugin:JavaPlugin

二进制插件一般是打包在一个 Jar 中发布的,如自定义插件的时候在发布的时候要指定插件的 Plugin id,这个 plugin id 必须是唯一的,可使用应用包名来保证 plugin id 的唯一性。

脚本插件

脚本插件的使用实际上就是某个脚本文件的使用,使用脚本插件时将脚本加载进来就可以了,使用脚本插件要使用到关键字 from,后面的脚本文件可以是本地的也可以是网络上的脚本文件

1
2
3
4
5
6
7
8
9
10
11
12
13
// version.gradle文件
ext{
    versionName = "1.0"
    versionCode = 1
}

// build.gradle文件
apply from: 'version.gradle'
task taskVersion{
    doLast{
        println "版本是${versionName},版本号是${versionCode}"
    }
}

apply 方法的用法

Project.apply() 可以接收三种不同的参数

1
2
3
4
5
6
7
8
// 闭包作为参数
void apply(Closure closure);

// 配置一个ObjectConfigurationAction
void apply(Action<? super ObjectConfigurationAction> action);

// Map作为参数
void apply(Map<String, ?> options);

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Map作为参数
apply plugin: 'java'

// 闭包作为一个参数
apply {
    plugin 'java'
}
// 配置一个ObjectConfigurationAction
apply(new Action<ObjectConfigurationAction>() {
    @Override
    void execute(ObjectConfigurationAction objectConfigurationAction) {
        objectConfigurationAction.plugin('java')
    }
})

Gradle 自定义插件

Gradle 8.0 前自定义插件(groovy)

[[02.Gradle 自定义插件 legacy]]

Gradle 8.0 自定义插件(kotlin)

[[03.Gradle 自定义插件]]

Gradle 三方插件

[[04.Gradle三方插件]]

Android Studio 调试 Gradle 插件

方式 1:remote

  1. 首先在 as 中新增一个 remote 配置
    er6jx
  2. 之后在执行 task 的时候增加下面的参数
1
./gradlew app:mytask -Dorg.gradle.debug=true

此时可以看到 gradle 在等待 debug 进程连接:

z4wty

  1. 之后在插件代码中打好断点,在 as 中点击 debug 按钮,就可以调试插件代码了

xrtns

方式 2:Configurations

  1. 点击 【Run】->【Edit Configurations…】
    xzkkl
  2. 然后点击左上角的 【+】,选择 【Remote】
    wdxxm
  3. 名字随便起,把命令行参数复制下来,【Use module classpath】选择要调试的插件,其他默认即可,然后点击【OK】:
    pt5bi

这样服务端就搞好了,稍后我们需要配置客户端调试器让其连接过来,就可以调试了

  1. 在目标项目 (即引入插件的那个项目),打开 gradle 目录,启动模块一般都是 app,所以我们展开到【:app】->【Tasks】右击【build】选择 create
    imt7f
  2. 在打开的界面把第 3 步复制下来的内容粘贴到【VM options】,并且将 suspend=n 改为 suspend=y 然后点击【OK】:
    j8n45
    新版的是这个 Modify Run Configuration
    ed4sg

6.【:app】->【Tasks】->【Run Configgurations】会生成一个任务,最终在最终就是下边这个样子:
mhju8

  • 现在可以开始调试了,在插件代码里面需要调试的地方打好断点,双击我们新建的 gradle 任务:
    mouyv
  • 将工具栏的运行选项改成我们新建的远程调试那个选项,没有取名字的话默认就是【unnamed】,然后点击启动调试的图标:
    tjv2j
  • 目标项目的调试器很快就会连接到我们建立的服务端并自动跳转,遇到断点则会断下来:
    xhl3q

断点只能进入 Plugin 的 apply 方法,不能进入 Transform 的 transform 方法;先选我们的 remote 进入调试模式,再运行 task 就可以进入到断点

Android Studio 4.1.1 调试

进行调试当插件工作不是预期的结果时,我们可能需要进行断点调试 (当然打日志的方法也不错),在之前的版本中还需要新增 remote 配置,然后以 debug 方式执行这个任务,现在在 AndroidStudio 中 (4.1.1 版本) 中,只需要在侧边找打这个任务,右键菜单 debug 执行就好了

Gradle 自定义插件总结

[[Gradle自定义插件总结]]

本文由作者按照 CC BY 4.0 进行授权