Android Studio Gradle Plugin开发和调试

361 阅读5分钟

前言:上一篇文章已经讲解了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方案来编写一个实例。

1.png

插件的源代码放在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" 配置,为调试会话取一个名称并保存。

2.png

  • 执行 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 任务执行到断点时会暂停。

4.png

  • 启动调试器: 在 Android Studio 中,选择刚刚添加的 "Remote JVM Debug" 配置,点击 "Debug" 按钮。

3.png

  • 进入调试模式: Android Studio 将自动进入调试模式,并在 Gradle 插件代码中停下来,您可以开始调试.

5.png

好了,现在你可以自由的debug调试自己的插件了,但是往往出问题的都是其他人维护的插件,我们如何主动发现问题就成为了重中之重。下一篇预告:如何调试别人的插件 期待下期再见👋

本公众号『专注于移动技术开发领域』,在设计可扩展、高性能和可维护的应用程序架构方面有卓越的能力。,欢迎大家关注AntonioShare: