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

Gradle、AGP、Plugin插件基本知识

文章目录一、第一原则二、Gradle和AGP基本概念三、常见plugin插件的功能四、自定义插件模块1. 插件的module目录build.gradle.kts文件2. 插件入口类定义3. 插件描述符文件4. 插件发布5. 插件文件格式6. 工程内插件依赖方式五、Groovy和 Kotlin DSL语法1. 背景2. 主要差异3. Kotlin DSL中使用等号赋值使用括号进行函数调用怎么区分六、其他1. buildSrc目录2. gradlePluginPortal()一、第一原则优先使用AI实现和修复Gradle配置问题二、Gradle和AGP基本概念Gradle是通用的自动化构建工具提供基础的构建框架依赖管理、任务编排可用于各种构建场景不局限于Android构建。AGP是Android Gradle Plugin的缩写是专门为Android开发设计的Gradle插件。com.android.tools.build:gradle:版本号是AGP本身在代码仓库中的Maven坐标用于安装整个AGP工具箱。AGP工具箱中常用插件com.android.application、com.android.library等依赖方式旧版项目根目录的build.gradle中通过classpath依赖显式声明。新版方式在plugins代码块中通过id和version声明后Gradle会自动在后台处理这个坐标的解析无需手动通过classpath显式生命依赖。三、常见plugin插件的功能插件名称功能备注com.android.application打包APK包含android{}、dependencies{}、buildTypes{}等常用的闭包AGP核心插件com.android.library打包AAR包含android{}、dependencies{}等常用闭包及部分library独有闭包。AGP核心插件com.android.kotlin.multiplatform.library官方为KMP项目提供的插件用于替代标准的库插件对KMP场景做了专门优化AGP核心插件org.jetbrains.kotlin.android别名 kotlin-androidKotlin官方插件, 用于在Android项目app、library中编译Kotlin文件。Android项目java-gradle-plugin1. 官方核心插件自动应用java-library插件并添加 Gradle API 依赖gradleApi()2. 同时也会自动生成插件描述符resources/META-INF/gradle-plugins/。自定义Gradle插件kotlin-dsl1. 用于Kotlin编写插件编译.kts文件。只能在.kts文件中引用不能在.gradle文件中引用。2. 自动应用java-gradle-plugin和embedded-kotlin插件3. 无需指定版本与Gradle版本严格绑定自定义Gradle插件org.jetbrains.kotlin.jvm别名kotlin(“jvm”)编译.kt文件用于自定义Gradle插件、纯jvm项目。不支持Androidapk、library编译自定义Gradle插件gradle-build-timer-plugin别名gradle-profiler构建耗时分析工具用于定位构建瓶颈Gradle效率工具dexcount-gradle-pluginAPK方法数统计插件帮助监控方法数避免触及64K方法数限制Gradle效率工具四、自定义插件模块1. 插件的module目录build.gradle.kts文件// 插件项目版本发布到仓库后其他项目引用时使用的版本version1.0.0groupcom.example.asmplugins{id(java-gradle-plugin)// java-gradle-plugin: Gradle 插件开发插件提供 gradlePlugin DSL 配置块kotlin(jvm)version1.8.10// kotlin(jvm): Kotlin JVM 支持用于编译 Kotlin 代码id(maven-publish)// maven-publish: 用于发布 Maven 仓库的插件}// 插件声明配置gradlePlugin{plugins{// 创建一个插件声明asmMethodTimeCost 是内部标识名起什么名字都可以create(asmMethodTimeCost){// 插件 ID: 在其他模块中使用这个插件时引用的 ID// 用法: plugins { id(com.example.asm.test) version 1.0.0 }idcom.example.asm.test// 插件实现类的完整路径包名 类名// 必须实现 org.gradle.api.PluginProject 接口implementationClasscom.example.asm.test.AsmPlugin// 插件显示名称和描述发布到 Gradle Plugin Portal 时使用displayNameASM Method Time Cost PlugindescriptionA Gradle plugin to measure method execution time using ASMtags.set(listOf(asm,android,bytecode,performance))}}}dependencies{// gradleApi(): Gradle 核心 API提供 Plugin、Project、Task 等基础接口implementation(gradleApi())// Android Gradle Plugin API: 访问 Android 编译流程提供BaseVariant、Transform 等接口implementation(com.android.tools.build:gradle-api:7.4.2)// 非必须这是 AGP 内部实现除非访问未公开的内部APIimplementation(com.android.tools.build:gradle:7.4.2)// ASM 字节码操作库implementation(org.ow2.asm:asm:9.4)implementation(org.ow2.asm:asm-commons:9.4)}2. 插件入口类定义packagecom.example.asm.testimportorg.gradle.api.Pluginimportorg.gradle.api.ProjectclassAsmMethodTimeCostPlugin:PluginProject{overridefunapply(project:Project){// TODO: 实现插件逻辑}}3. 插件描述符文件使用java-gradle-plugin自动生成根据build.gradle.kts中的gradlePlugin{}闭包中的参数自动生成。文件路径和命名遵循严格约定位于 JAR 包内的META-INF/gradle-plugins/目录并以插件ID.properties的格式命名。使用者可以直接plugins { id(com.example.asm.test) }的方式引用文件名称com.example.asm.test.propertiesimplementation-classcom.example.asm.test.AsmMethodTimeCostPlugin4. 插件发布在build.gradle.kts文件中引用maven-publish插件并且声明version和group字段执行如下命令发布插件后就可以在其他模块app、library中使用插件id进行引用。插件发布路径由mavenLocal()函数定义mac电脑一般是~/.m2/repository/./gradlew:asmtestplugin:publishToMavenLocal5. 插件文件格式插件的产物是jar包例如asmtestplugin-1.0.0.jar6. 工程内插件依赖方式不想每次修改都需要发布可以在app模块build.gradle中直接指定插件的类文件插件入口进行直接依赖apply plugin:com.example.asm.test.AsmPlugin五、Groovy和 Kotlin DSL语法1. 背景Kotlin DSL现在已是 Gradle 官方默认推荐语言。Groovy DSL动态语言大量利用“方法调用省略括号”“属性自动生成 getter/setter”“元编程”等技巧写起来更像自然语言但 IDE 支持弱出错往往在运行时报错。Kotlin DSL静态类型所有调用都有明确类型约束IDE 能给出精确的代码提示和重构支持编译阶段就能发现大部分错误代价是语法更严谨、括号和引号不可省略。2. 主要差异无论是Groovy DSL还是Kotlin DSL都兼容id(java)格式。场景Groovy DSLKotlin DSL文件名称.gradle.gradle.kts字符串单/双引号均可java或者java字符串必须双引号java单引号是Char引号使用双引号括号id(“java”)单引号id ‘java’双引号id “java”反引号不支持不带任何引号不支持双引号括号id(“java”)单引号不支持双引号id “java”反引号kotlin-dsl // 带-必须使用反引号不带任何引号java // 这类是官方的属性扩展方法调用括号可省略id java括号必须id(java)3. Kotlin DSL中使用等号赋值使用括号进行函数调用怎么区分首选方法看 IDE 自动补全IntelliJ IDEA / Android Studio如果补全提示里是property标记或直接显示类型如String那就是属性用赋值。如果提示里是fun标记那就是函数用()调用。六、其他1. buildSrc目录buildSrc是 Gradle 项目根目录下的一个特殊模块专门存放构建逻辑代码。只要目录存在Gradle 就会自动把这个目录当作一个独立的子项目来编译并把编译好的类自动加到整个项目的构建脚本 classpath 中。你可以在里面写自定义插件、任务、扩展然后在根项目的build.gradle(.kts)里直接使用。它是自动识别的buildSrc是项目的保留字段。Gradle 的生命周期中一但检测到buildSrc目录会将其编译为 jar把 jar 和其依赖放到构建脚本的 classpath在所有模块的build.gradle.kts中可直接引用buildSrc里定义的类或对象无需任何classpath声明。2. gradlePluginPortal()Plugin插件专属的仓库。在项目根目录repositories{}闭包中配置。

相关文章:

Gradle、AGP、Plugin插件基本知识

文章目录一、第一原则二、Gradle和AGP基本概念三、常见plugin插件的功能四、自定义插件模块1. 插件的module目录build.gradle.kts文件2. 插件入口类定义3. 插件描述符文件4. 插件发布5. 插件文件格式6. 工程内插件依赖方式五、Groovy和 Kotlin DSL语法1. 背景2. 主要差异3. Kot…...

端渲染?流渲染?到底怎么选!

同一个数字孪生项目,为什么有的团队选择本地打包成EXE,有的却非要部署到云端用浏览器访问?这不是“哪个更好”的问题,而是“哪个更对”的问题。在数字孪生项目交付中,渲染方式是决定用户体验、部署成本和硬件门槛的核心…...

第13篇:高级可视化与自定义图表

第13篇:高级可视化与自定义图表 1. 可视化设计原则 1.1 数据墨水比 核心思想: 最大化数据墨水,最小化非数据墨水。元素建议背景使用浅色或透明网格线减少或移除边框仅在必要时使用颜色用于区分,而非装饰1.2 认知负荷优化 ✅ 一图一…...

第12篇:DAX 高级计算与性能优化

第12篇:DAX 高级计算与性能优化 1. DAX 计算上下文深度理解 1.1 行上下文 遍历表的每一行,可访问当前行的字段值: // 计算列中使用行上下文 利润率 Sales[Profit] / Sales[Amount]// 迭代函数中使用行上下文 总利润 SUMX(Sales, Sales[Quan…...

从Datawhale的Vibe镜像看数据科学协作环境的Docker化实践

1. 项目概述:从开源镜像名到数据科学协作生态最近在整理自己的开发环境,准备搭建一个用于数据分析和可视化的新项目。在寻找合适的工具和资源时,我习惯性地会去各大开源镜像站看看,比如清华的TUNA、阿里云的开源镜像站。就在这个过…...

FLUX.1-Krea-Extracted-LoRA部署实操:多实例并发生成时的显存隔离配置建议

FLUX.1-Krea-Extracted-LoRA部署实操:多实例并发生成时的显存隔离配置建议 1. 模型概述与核心价值 FLUX.1-Krea-Extracted-LoRA 是一款专为真实感图像生成设计的风格迁移模型,基于 FLUX.1-dev 基础模型开发。该模型通过提取的 LoRA 权重(Ra…...

基于CodeDefined Skill与 Agent Framework 的实践探索

上一节我们讲了 File-Based Skill,这一节介绍另外一种方式,直接用代码来写 Skill。简单说一下区别File-Based:用 SKILL.md 脚本 资源文件Code-Defined:全部写在代码里1. 创建项目 安装包先建一个控制台项目,然后把依…...

我在项目里是怎么设计工作流表的:不是只看引擎表就够了

Activiti/Flowable 工作流实战:工作流表怎么设计?结合项目讲清主表、业务表、表单表和节点表 最近我在重新梳理这个项目里的工作流模块时,一个感觉特别强烈:真正决定系统能不能长期维护的,往往不是 Activiti/Flowable …...

软件工业流水线的时代真的来临了

2026 年,Claude Opus 4.7 发布之后,很多事情变了。最明显的一件是——你可以放心地把一个完整需求丢给 Code Agent 去实现了。过去我们担心 AI 把功能写错、接口调坏、测试跑飞,Opus 4.7 之前这些担心都不是多余的;Opus 4.7 之后&…...

别只用来生成大头照了!解锁 GPT Image 2 Web Workflow 的最新设计实战玩法

AI 绘画圈的头把交椅又要换人了。OpenAI 刚刚发布了最新一代生图模型 GPT-Image-2。经过第一时间的上手实测,我们可以明显感受到,它在文本输出的准确性、以及对复杂现实世界知识的理解上,表现得比此前的 Nano Banana 2 更加出色。 一如既往&…...

一颗0.89元的芯片,干翻了Intel和飞利浦,这个“51单片机教父“让全球80%的8051都姓了STC

大家好,我是写代码的篮球球痴。之前聊了 Fabrice Bellard、求伯君和瑞芯微的励民,今天换个画风,聊一个搞嵌入式的同学100%接触过的人物——姚永平,STC单片机的创始人。你可能没听过这个名字,但你一定用过他的芯片。STC…...

Python入门必须知道的11个知识点

Python被誉为全世界高效的编程语言,同时也被称作是“胶水语言”,那它为何能如此受欢迎,下面我们就来说说Python入门学习的必备11个知识点,也就是它为何能够如此受欢迎的原因.Python 简介Python 是一个高层次的结合了解释性、编译性…...

python基本语法练习实例

1、打印九九乘法表1234567891011121314151617181920212223242526272829303132333435363738#只打印结果for i in range(1,10):for j in range(1,i1):print(i*j,end" ")print()#打印算数表达式for i in range(1,10):for j in range(1,i1):print("{0}*{1} {2:2}&q…...

Nordic nRF7001 WiFi 6伴生芯片解析与低功耗IoT应用

1. Nordic nRF7001 WiFi 6伴生芯片深度解析在物联网设备快速普及的当下,如何为低功耗蓝牙和蜂窝IoT设备添加可靠的WiFi连接能力,一直是开发者面临的挑战。Nordic Semiconductor最新推出的nRF7001伴生芯片,正是为解决这一痛点而生。作为nRF70系…...

NotaGen快速部署:一键启动WebUI,5分钟开始音乐创作之旅

NotaGen快速部署:一键启动WebUI,5分钟开始音乐创作之旅 1. 准备工作与环境检查 1.1 系统要求 在开始部署NotaGen之前,请确保您的系统满足以下最低要求: 操作系统:Linux(推荐Ubuntu 20.04)或…...

「智库智能」获数亿元融资,凯傲集团战略入股,苏州国资加持

导语大家好,这里是智能仓储物流技术研习社:专注分享智能制造和智能仓储物流等内容。专业书籍:《智能物流系统构成与技术实践》|《智能仓储项目英语手册》|《智能仓储项目必坑手册》|《智能仓储项目甲方必读》|《12大行业智能仓储实战指南》近…...

避坑指南:Webots仿真中激光雷达(Lidar)和距离传感器的配置、数据读取与可视化(附完整C代码)

Webots激光雷达与距离传感器实战:从参数调试到数据可视化的全流程解析 在机器人仿真开发中,传感器配置不当导致的"数据异常"问题往往消耗开发者大量时间。上周调试一个仓储机器人项目时,激光雷达点云突然消失的问题让我排查到凌晨三…...

嵌入式芯片硬件缺陷的软件绕过机制与实现

1. 嵌入式芯片硬件缺陷的软件绕过机制解析 在嵌入式系统开发领域,硬件芯片的勘误问题(Chip Errata)是工程师们经常需要面对的挑战。当发现芯片存在硬件设计缺陷时,等待芯片厂商推出新版本可能耗时过长,而软件层面的绕过…...

实战 | 解密CUTTag:从抗体选择到数据解读,关键环节逐一击破!

1. CUT&Tag技术原理与优势解析 CUT&Tag(Cleavage Under Targets and Tagmentation)作为研究DNA-蛋白质相互作用的新锐技术,近年来在表观遗传学领域大放异彩。我第一次接触这项技术时,就被它精巧的设计思路所折服——它像一…...

LSTM在多元时间序列预测中的实战应用

1. 理解LSTM在多元时间序列预测中的应用长短期记忆网络(LSTM)作为循环神经网络(RNN)的一种特殊变体,在处理时间序列数据时展现出独特优势。与传统的线性方法相比,LSTM能够自动学习时间序列中的长期依赖关系…...

基于eBPF的容器运行时安全监控:Foniod实战部署与策略指南

1. 项目概述:从容器镜像到安全监控的深度实践最近在梳理云原生环境下的安全监控方案时,我反复遇到了一个名为foniod/foniod的容器镜像。这个名字乍一看有点陌生,不像nginx、redis那样耳熟能详,但在特定的安全运维圈子里&#xff0…...

[特殊字符] JMeter 压测日志指标全解析

一、启动命令 jmeter -n -t aaa.jmx -l result.jtl -e -o reports参数含义: 参数 作用 -n 启用无界面非 GUI 模式运行压测(服务器 / 命令行压测专用,比 GUI 稳定) -t aaa.jmx 指定压测脚本:本次运行的脚本文件名为 aaa.jmx -l result.jtl 把本次所有请求的原始压测数据,…...

你还在手动Step Over?VSCode AI自动路径预测调试法(已通过Linux内核模块实测验证)

更多请点击: https://intelliparadigm.com 第一章:你还在手动Step Over?VSCode AI自动路径预测调试法(已通过Linux内核模块实测验证) 现代内核级调试面临分支爆炸与上下文缺失的双重挑战。传统单步执行(St…...

JMeter InfluxDB 后端监听器 全参数详解

一、顶部全局配置项1. 名称当前这个后端监听器组件的自定义名字,仅 JMeter 内部标识用,不影响数据上报,你填后端监听器只是备注区分。2. 注释自定义备注栏,写测试用途、项目信息,无运行效果。3. 后端监听器实现org.apa…...

保姆级教程:用Anaconda为QMT创建Python 3.6.8虚拟环境,避免版本冲突

量化交易必备:Anaconda虚拟环境精准配置Python 3.6.8全攻略 当你在深夜调试QMT策略时,突然发现因为Python版本冲突导致整个开发环境崩溃——这种经历足以让任何量化开发者抓狂。本文将带你彻底解决这个痛点,不仅教你如何创建完美的Python 3.6…...

不止是补全!用GPT Runner深度解析项目文件:我是如何让它帮我快速理解陌生代码库的

深度解析项目文件的实战指南:用GPT Runner高效理解陌生代码库 接手一个陌生代码库时,面对错综复杂的文件结构和晦涩难懂的代码逻辑,即使是经验丰富的开发者也会感到无从下手。传统方式下,我们需要逐个文件阅读、调试、注释&#x…...

吃透智能体开发 程序员轻松打破35岁职业危机

文章目录前言一、别再自欺欺人了!2026年,CRUD程序员的路已经走到头了1.1 35岁危机的本质,不是年龄,是你的技能已经没有了稀缺性1.2 大厂招聘的潜规则:智能体经验,已经从加分项变成了必填项1.3 程序员的角色…...

GLM-4.7智能体部署实战:从模型选型到性能调优全解析

1. 项目概述:从GLM-4.5到GLM-4.7,一个开源智能体基座的演进之路如果你在过去一年里深度参与过AI智能体或者大语言模型的应用开发,那么“GLM”这个系列对你来说一定不陌生。从GLM-4.5的横空出世,到GLM-4.6的稳步提升,再…...

Flutter状态管理高级技巧与最佳实践

Flutter状态管理高级技巧与最佳实践 引言 状态管理是Flutter应用开发中的核心挑战之一,特别是对于复杂应用。选择合适的状态管理方案并正确实现它,对于构建可维护、可扩展的Flutter应用至关重要。本文将深入探讨Flutter状态管理的高级技巧和最佳实践&…...

终极指南:如何使用Diablo Edit2暗黑破坏神2角色编辑器解放你的游戏时间

终极指南:如何使用Diablo Edit2暗黑破坏神2角色编辑器解放你的游戏时间 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神2中花费数十小时刷装备、反复练级&…...