前言:上一篇文章已经讲解了android-gradle-dsl了,接下来我们要开始学习编写Plugin了,任何脱离实战的文章都是耍流氓,咱们直接实战开始,内容有点干,注意反复喝水吸收。
什么是Plugin
Plugin是一种用于扩展和定制 Gradle构建系统功能设计,Plugin为开发者提供了更多的灵活性,允许开发者根据自身需求添加自定义行为和功能。诸如Android开发中使用的com.android.application 插件便是android团队给我们开发的一个Plugin。
plugins {
id 'com.android.application'
}
写Plugin的意义
- 封装和抽象: 插件可以将复杂的工作抽离出业务模块,使业务模块只需运行插件即可。
- 复用性: 通过将常用逻辑抽离到插件中,避免每个业务模块都编写自己的 Gradle 脚本。同时,插件可以方便地分享给其他团队,例如用于埋点等插桩操作
Plugin怎么写
Plugin编写有3种方式。
-
在 build.gradle 文件中编写: 这种方式较少使用,通常通过 apply from: 类名 的方式添加插件,不过在 Android Studio 中使用不多,因此我们可以忽略它。
-
创建单独的模块: 在一个单独的模块中编写插件代码,然后发布到本地或远程仓库。其他模块可以通过配置来使用该插件。
-
使用 buildSrc 目录: 直接在根目录下创建 buildSrc 目录,将插件代码放置其中。这种方式是最常见的,也是最推荐的。只需要在模块的 build.gradle 文件中添加配置即可使用
下面我使用buildSrc方案来编写一个实例。
插件的源代码放在rootProjectDir/buildSrc/src/main/groovy。Gradle 将负责编译和测试插件,并使其在构建脚本的类路径上可用。该插件对于构建使用的每个构建脚本都是可见的。但是,它在构建之外不可见,因此您无法在定义它的构建之外重用该插件。
因为我这里使用的是groovy语法编写插件,如果使用kotlin或者java对应目录将有些许改变,Java:rootProjectDir/buildSrc/src/main/java kotlin:rootProjectDir/buildSrc/src/main/kotlin。我这里默认大家对该知识了解了。
- 创建拓展类: 首先,创建一个拓展类 DemoExtension.groovy,以便项目使用插件时可以配置一些参数,类似于 Android 的 android { } 闭包配置
package com.antonio.plugin
class DemoExtension{
/**
* 定义一个标题
*/
var title
}
- 编写插件实现类: 创建插件实现类 DemoPlugin.groovy,实现 Plugin 接口的 apply 方法。
package com.antonio.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
/**
* @Author AntonioShare
* @Date 2023/9/13 13:00 上午
*/
class DemoPlugin implements Plugin<Project> {
//实现apply方法,注入插件的逻辑
void apply(Project project) {
//注册Extension
project.getExtensions().create("antonio", DemoExtension)
//获取Extension
project.afterEvaluate {
DemoExtension extension = project["antonio"]
println("I am from DemoPlugin, apply from ${project.name} demo config value: ${extension.title}")
}
}
}
- 创建插件配置文件: 在 buildSrc/src/main/resources/META-INF.gradle-plugins/com.antonio.plugin.demo.properties 中创建插件配置文件,指定插件的实现类名和包名。
implementation-class=com.antonio.plugin.DemoPlugin
- 在模块中使用插件: 在需要使用插件的模块的 build.gradle 文件中,添加插件配置并配置插件参数。
plugins {
id 'com.android.application'
id 'com.antonio.plugin.demo'
}
android {
....
}
antonio {
title '我是配置的标题'
}
- 打开终端制定build指令,观察log输出如下
antonio@AntoniodeMacBook-Pro PluginDemo2 % ./gradlew build
Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details
> Configure project :app
I am from DemoPlugin, apply from app demo config value: 我是配置的标题
<===----------> 23% EXECUTING
通过以上实例讲述了如何一步一步编写一个插件,大家已经有一定的认识了。可以编写出一些简单的插件了,这部分内容到此结束,大家可以多私下练习。不要光看,感觉会了,然后需要编写的时候又无从下手。
关键步骤!插件debug
上面讲了如何编写插件,但是往往插件都比较复杂,并且gradle代码提示比较鸡肋。想要一次性写好并且不出问题几乎不太可能,于是debug断点调试就比较重要了。但是因为该脚本是系统直接执行的,我们该如何断点了,翻边现有文章,大多不太好找到对应的答案,这里给大家介绍通过Android Studio来调试gradle插件。敲重点,这里会考。
- 添加 Remote JVM Debug 配置: 在 Android Studio 中,通过 "Edit Configurations" 添加 "Remote JVM Debug" 配置,为调试会话取一个名称并保存。
- 执行 Gradle 任务并等待: 打开终端,进入项目根目录,执行一个 Gradle 任务,例如 ./gradlew build -Dorg.gradle.debug=true --no-daemon。Windows 用户使用 gradlew build -Dorg.gradle.debug=true --no-daemon。
antonio@AntoniodeMacBook-Pro PluginDemo2 % ./gradlew build -Dorg.gradle.debug=true --no-daemon
To honour the JVM settings for this build a single-use Daemon process will be forked. See https://docs.gradle.org/7.5/userguide/gradle_daemon.html#sec:disabling_the_daemon.
> Starting Daemon
输入完成之后该任务会等待调试器进入。
- 设置断点: 在需要调试的插件代码中,设置断点。这样,当 Gradle 任务执行到断点时会暂停。
- 启动调试器: 在 Android Studio 中,选择刚刚添加的 "Remote JVM Debug" 配置,点击 "Debug" 按钮。
- 进入调试模式: Android Studio 将自动进入调试模式,并在 Gradle 插件代码中停下来,您可以开始调试.
好了,现在你可以自由的debug调试自己的插件了,但是往往出问题的都是其他人维护的插件,我们如何主动发现问题就成为了重中之重。下一篇预告:如何调试别人的插件 期待下期再见👋
本公众号『专注于移动技术开发领域』,在设计可扩展、高性能和可维护的应用程序架构方面有卓越的能力。,欢迎大家关注AntonioShare: