当前位置: 首页 > news >正文

Android创建本地plugin工程

目录

  • 1. 主工程目录准备
  • 2. 创建 plugins 根工程
  • 3. 创建插件工程pluginA
  • 5. 测试PluginA

最终生成的工程目录结构如下:

MyApplication/
├── settings.gradle.kts                 <-- 主工程 settings
├── build.gradle.kts                    <-- 主工程 build
├── gradle/
│   └── libs.versions.toml             <-- 主工程 catalog(含 pluginA/pluginB alias)
└── plugins/                            <-- 本地插件根工程(复合构建)├── settings.gradle.kts├── gradle/│   └── libs.versions.toml          <-- 插件工程自己的 catalog(最小依赖)├── pluginA/│   ├── build.gradle.kts│   └── src/main/kotlin/com/example/PluginA.kt└── pluginB/├── build.gradle.kts└── src/main/kotlin/com/example/PluginB.kt

1. 主工程目录准备

  1. 在你的 Android 工程根目录 MyApplication/ 下,应该已经有:
MyApplication/
├── settings.gradle.kts
├── build.gradle.kts
├── gradle/
│   └── libs.versions.toml   <-- 主工程的版本目录
  1. 在 settings.gradle.kts 中添加插件包含:
pluginManagement {includeBuild("plugins")
}

这样主工程能找到 plugins/ 里的插件。

  1. 编辑主工程的 gradle/libs.versions.toml
    新增插件 alias:
[plugins]
pluginA = { id = "com.example.plugina" }
pluginB = { id = "com.example.pluginb" }

2. 创建 plugins 根工程

  1. 在 MyApplication/ 下新建目录
    右键 MyApplication → New > Directory → 输入 plugins。
  2. 在 plugins/ 下新建 settings.gradle.kts,内容如下:
// 1. 插件管理(pluginManagement)
// 这里配置的是“插件仓库”,主要用于解析 `plugins { id("xxx") version "x.y.z" }` 里的插件。
pluginManagement {repositories {// Gradle 官方插件仓库gradlePluginPortal()// Android 官方仓库(AGP)google()// Maven 中央仓库mavenCentral()}
}// 2. 依赖解析管理(dependencyResolutionManagement)
// 这里配置的是“普通依赖仓库”,用于解析 build.gradle.kts 中的 `dependencies { implementation(...) }` 等。
dependencyResolutionManagement {// 2.1 定义插件工程自己的 version catalog(避免和主工程 libs 冲突)versionCatalogs {create("pluginLibs") {// 从 plugins/gradle/libs.versions.toml 读取依赖版本from(files("gradle/libs.versions.toml"))}}// 2.2 配置插件工程使用的依赖仓库repositories {google()               // Android 官方仓库mavenCentral()         // 常用的 Maven 仓库gradlePluginPortal()   // Gradle 插件仓库(有些插件会放这里)}
}// 3. 设置插件工程的根工程名称
// 这里的 "plugins" 是插件工程在构建时的 rootProject.name
rootProject.name = "plugins"// 4. 注册子模块(每个插件都是一个独立的 module)
// 注意:这些 module 对应的是 plugins/ 目录下的 pluginA、pluginB 文件夹
include(":pluginA", ":pluginB")
  1. 在 plugins/gradle/ 下新建 libs.versions.toml:
[versions]
kotlin = "2.1.0"
androidGradlePlugin = "8.12.1"[libraries]
kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }
android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" }

3. 创建插件工程pluginA

  1. 在 plugins/目录下创建 pluginA目录, 然后在pluginA目录内新建 build.gradle.kts文件,内容如下:
import org.jetbrains.kotlin.gradle.dsl.JvmTargetplugins {// 声明这是一个 Gradle 插件工程(必需)// `kotlin-dsl` 插件会启用 Kotlin DSL 插件开发支持,// 并且自动为插件工程配置好 classpath 等。`kotlin-dsl`
}group = "com.example.plugin"  
// 插件的 group 名字(类似 maven 坐标的 groupId)。
// 最终生成的插件坐标为:com.example.plugin:pluginA:<version>java {// 配置编译插件工程时使用的 JDK 版本(Java 17)sourceCompatibility = JavaVersion.VERSION_17targetCompatibility = JavaVersion.VERSION_17
}kotlin {// 配置 Kotlin 编译选项,目标 JVM 版本为 17compilerOptions {jvmTarget = JvmTarget.JVM_17}
}dependencies {// pluginLibs 指向 plugins/gradle/libs.versions.toml 中定义的依赖 catalog// 插件工程需要依赖 AGP、Kotlin 插件 API,但只在编译时使用,不需要打包进去compileOnly(pluginLibs.android.gradlePlugin)compileOnly(pluginLibs.kotlin.gradlePlugin)
}tasks {validatePlugins {// 验证插件定义是否正确// 开启严格验证,并且遇到警告就直接报错(保证插件发布质量)enableStricterValidation = truefailOnWarning = true}
}gradlePlugin {plugins {// 注册一个插件,名字随意(只在插件工程内部用)register("pluginA") {// 插件的唯一 ID(外部工程 apply plugin 时使用的 ID)// 这里必须和主工程的 libs.versions.toml 定义一致:// [plugins]// pluginA = { id = "com.example.plugina" }id = "com.example.plugina"// 插件的实现类(必须存在且继承 org.gradle.api.Plugin<Project>)// 一般写在 src/main/kotlin/com/example/PluginA.ktimplementationClass = "com.example.PluginA"}}
}
  • plugins { kotlin-dsl } 是必须的,否则不能写插件。
  • group + id + implementationClass 三者是核心,决定了插件的坐标和入口。
  • pluginLibs.xxx 依赖来自 plugins/gradle/libs.versions.toml,只在插件工程有效
  1. 创建PluginA插件代码
    在pluginA文件夹下按照下面目录结构创建对应的包名和代码文件
pluginA/
├── build.gradle.kts
└── src/main/kotlin/com/example/├── PluginAPlugin.kt   <-- 插件入口└── PluginATask.kt     <-- 插件执行逻辑
  • 打开 PluginATask.kt,写入以下代码:
package com.exampleimport org.gradle.api.DefaultTask
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.options.Option/***  插件的任务*/
abstract class PluginATask : DefaultTask() {// 使用 Property<String> 来定义输入参数@get:Input@get:Option(option = "message", description = "要打印的消息")abstract val message: Property<String>@TaskActionfun run() {val msg = message.orNull ?: "Hello from PluginATask 🎉"logger.lifecycle("=================[PluginA]================= $msg")}
}
  • 打开PluginA.kt,写入一下代码:
/*** 插件入口:注册 PluginATask*/
class PluginA : Plugin<Project> {override fun apply(target: Project) {// 注册任务pluginATasktarget.tasks.register("pluginATask", PluginATask::class.java)}
}

5. 测试PluginA

在主工程 app/build.gradle.kts应用插件:

plugins {alias(libs.plugins.android.application)alias(libs.plugins.kotlin.android)alias(libs.plugins.kotlin.compose)alias(libs.plugins.pluginA)   // 应用本地 PluginA
}

然后在项目根目录下输入命令执行pluginATask

./gradlew app:pluginATask --message="Hello PluginA"

由于我是在App的build.gradle.kts添加的插件, 所以上面的app:代表的就是app模块. 如果是其他模块就换成其他模块的名字.
运行后看到下面的log表示成功了:
在这里插入图片描述

http://www.dtcms.com/a/581684.html

相关文章:

  • 状态机实现的方法
  • 网站建设系统分析app平台搭建
  • 创建网站公司 徐州wordpress如何显示摘要
  • Aspose.word实现表格每页固定表头、最后一行填满整个页面
  • MySQL快速入门——基本查询(上)
  • 用手机看网站源代码wordpress小清新主题图片
  • 网站用什么字体做正文腾冲网站建设
  • AI Agent设计模式 Day 1:ReAct模式:推理与行动的完美结合
  • EUV光刻实战:突破7nm芯片制造的关键技术与挑战
  • #HarmonyOS篇:管理组件拥有的状态
  • 网站开启速度慢网站建设项目外包合同范本
  • 苏州手机网站建设乐清市建设规划局网站
  • 从数据节点到决策基石:以太网温湿度压力传感器的系统价值重构
  • Greensea IQ-用于国防、商业和科学领域的机器人和水下技术
  • Spring 代理的选择
  • 构建可用于生产环境的AI智能体
  • CAN终端电阻的用处
  • 上海seo推广整站哪个网站的pc端是用vue做的
  • 应届生出来做网站还是做报纸好网站后台管理图片
  • [GDOUCTF 2023]泄露的伪装
  • AtCoder Educational DP Contest 刷题记录Ⅱ
  • 如何构建以数据驱动的现代软件架构
  • 如何禁止Chrome的重新启动即可更新窗口弹窗提示
  • 爱用建站 小程序镇江网站制作优化
  • 在Ubuntu中下载gcc
  • 杰理蓝牙耳机开发 -- SPP功能开发与应用
  • 【锦州通APP注册_登录安全-无验证方式导致安全隐患】
  • 网站建设属于哪个类目淘宝网站开发费用
  • Socket vs WebSocket
  • Java中BufferedImage转byte[]字节数组