gradle插件开发

Gradle之如何创建Gradle插件工程及调试 1 如何创建Gradle插件工程 2 如何使用kotlin编写插件呢? 3 如何调试插件 3.1 打断点 打断点和Android开发一样,点一下就行; 3.2 执行编译 在命令行中执行APP的编译命令: gradlew assembleDebug -Dorg.gradle.daemon=false -Dorg.gradle.debug=true 案例: D:\project\statsdk>gradlew assembleDebug -Dorg.gradle.daemon=false -Dorg.g 阅读详情

记得我以前曾经发布过一篇发布类库到jCenter的文章:Android开发发布lib到jcenter,发布成功之后,只需要在gradle写一行compile…就可以把类库导进来。当然,你如果觉得麻烦也可以使用第三方的工具,如jitpack,可以很方便把你在GitHub上的项目发布为类库。
好了,言归正传,今天主要说一下和发布类库很相似的发布gradle插件教程,你可能见过很多项目除了通过compile…导进,还有不少是这样的,比如greendao:

// In your root build.gradle file:
buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.1'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}
 
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
 
dependencies {
    implementation 'org.greenrobot:greendao:3.2.2' // add library
}

在讲gradle插件开发之前,先了解一下Gradle插件开发支持Java、Groovy、Scala三种语言开发,Groovy用于实现与 Gradle 构建生命周期(如 task 的依赖)有关的逻辑,Java用于核心逻辑,表现为 Groovy 调用 Java 的代码。我们平时所使用的只有一行compile…的类库主要是用Java开发的实现功能的模块,之所以会出现稍复杂的插件开发,是因为gradle插件可以很好地控制构建项目的生命周期,如task的依赖等。

我们如果想在一个AndroidStudio项目导入一个jar/aar有好几种方式:
① 直接放到lib目录,配合
implementation fileTree(include: ['*.jar'], dir: 'libs')
如果是aar,可能还需要在build.gradle(app)的android{}括号里添加

repositories {
     flatDir {
         dirs 'libs'
     }
 }

dependencies{}括号里添加

implementation (name:'aar文件名', ext:'aar')

② File>New>New Module -> Import .JAR/.AAR Package,导入你想添加的jar或aar文件成为一个module,然后在你项目添加该module为依赖即可。

③ 直接在builde.gradle(app)里写代码

def getSDKPlatformPath() {
    def rootDir = project.rootDir
    def localProperties = new File(rootDir, "local.properties")
    if (localProperties.exists()) {
        Properties properties = new Properties()
        localProperties.withInputStream {
            instr -> properties.load(instr)
        }
        // "${android.getSdkDirectory().getAbsolutePath()}"
        def sdkDir = properties.getProperty('sdk.dir')
        //def compileSdkVersion = android.compileSdkVersion
        // 这里使用17的来编译(Android 4.2)
        def compileSdkVersion = "android-17"
        Console.println("app compileSdkVersion : " + compileSdkVersion)
        def path = sdkDir + "/platforms/" + compileSdkVersion
        return path
    }
    return rootDir
}

// 导入layoutlib.jar
def getLayoutlibJarPath() {
    def path = getSDKPlatformPath()
    def layoutlibPath = path + "/data/layoutlib.jar"
    Console.println("layoutlib-path : " + layoutlibPath)
    return layoutlibPath
}

// 导入android.jar
def getAndroidJar() {
    def path = getSDKPlatformPath()
    def androidPath = "${path}${File.separator}android.jar"
    return androidPath
}

然后在dependencies{}里添加:

    // 方式①:使用到了一些@hide的类库和方法,如删除缓存的IPackageDataObserver
    //provided files(getLayoutlibJarPath())

以上做法,都是比较简单的:
方式①没有明显的缺点,compile/implementation语句虽然会增加,但尚在可以接收的范围之内,需要拷贝jar/aar到项目lib文件夹下,如果依赖仅在本项目使用,建议使用此方式;
方式②有点小题大作了,我本想导入一个jar包,结果要做成一个module;
方式③太臃肿,如果需要做的逻辑越来越多,那么gradle文件里的代码也越来越多,这样肯定是不行的。

于是,针对需要公开为类库,且需要控制项目构建声明周期(环境配置)的情况,我们引入了gradle插件开发。

  1. 新建一个java library module
    在这里插入图片描述
  2. 切换到Project视图,把main文件夹下的java文件夹命名为groovy
    在这里插入图片描述
  3. 在main目录下,新建resources文件夹,然后新建META-INF文件夹,然后新建gradle-plugin文件夹,最后新建hide_api.properties文件,这个hide_api就是插件命,稍后要用到。
    注意:
    groovy文件夹中的类,一定要修改成 .groovy 后缀,IDE才会正常识别。
    resources/META-INF/gradle-plugins 这个文件夹结构是强制要求的,否则不能识别成插件
├── build.gradle
└── src
    └── main
        ├── groovy
        │   └── com.smartdevice.dtv.tvmanager.hidelib
        │               ├── HideApiPlugin.groovy
        │             
        └── resources
            └── META-INF
                └── gradle-plugins
                    └── hide_api.properties

build.gradle内容:

apply plugin: 'groovy'
apply plugin: 'maven'

repositories {
    mavenLocal()
    jcenter()
}

dependencies {
    compile gradleApi()
}

//发布到本地目录
def versionName = "1.0.0"
group "com.itant.hide.plugin"
version versionName

uploadArchives{
//当前项目可以发布到本地文件夹中
    repositories {
        mavenDeployer {
            repository(url: uri('./repo')) //定义本地maven仓库的地址
        }
    }
}

HideApiPlugin.groovy内容:

package com.smartdevice.dtv.tvmanager.hidelib

import org.gradle.api.Project
import org.gradle.api.Plugin

public class HideApiPlugin implements Plugin<Project>{
    private Project mProject

    @Override
    void apply(Project project) {
        mProject = project
        initAndroidSDK(project)
    }

    private void initAndroidSDK(Project project) {
        // 导入D:\software\assdk\android-sdk-windows\platforms\android-17\data\layoutlib.jar
        // 这样我们就可以在开发的过程中使用很多@hide的方法了,注意,我们仅仅需要编译时使用,所以使用插件的时候
        // 需要通过provided files(gradle.ext.layoutlibJar)导入
        project.rootProject.gradle.ext.layoutlibJar = getLayoutlibJar()
    }

    private String getLayoutlibJar() {
        def path = getSDKPath()
        //def layoutlibPath = "${path}${File.separator}data${File.separator}layoutlib.jar"
        def layoutlibPath = "${path}${File.separator}data${File.separator}layoutlib.jar"
        return layoutlibPath
    }

    /*private String getSDKPath() {
        def path = "${android.getSdkDirectory().getAbsolutePath()}";
        return path
    }*/

    private String getSDKPath() {
        def android_home = System.getenv()['ANDROID_HOME']
        if (android_home == null || android_home.equals("")) {
            android_home = getSDKPathFromLocalProperty()
        }
        if (android_home == null || android_home.equals(""))
            return 'not found android.jar'
        //def compileSdkVersion = 'android-' + API_LEVEL
        def compileSdkVersion = 'android-17'
        def path = "${android_home}${File.separator}platforms${File.separator}${compileSdkVersion}"
        return path
    }

    private String getSDKPathFromLocalProperty() {
        def rootDir = mProject.rootDir
        def localProperties = new File(rootDir, "local.properties")
        if (localProperties.exists()) {
            Properties properties = new Properties()
            localProperties.withInputStream {
                instr -> properties.load(instr)
            }
            return properties.getProperty('sdk.dir')
        }
        return ""
    }
}

hide_api.properties内容:

implementation-class=com.smartdevice.dtv.tvmanager.hidelib.HideApiPlugin
  1. 发布插件到本地:
    terminal中执行:
gradlew uploadArchives

成功之后,会生成repo目录:
在这里插入图片描述

  1. 此时可以在app主项目使用我们的插件了。
    build.gradle(Project)中的buildscript{}里添加:
repositories {
        google()
        jcenter()
        maven{
            url '/hidelib/repo/'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // 这里与我们上面生成的repo文件夹下的maven-metadata.xml对应,不要写错了
        classpath "com.itant.hide.plugin:hidelib:1.0.0"
    }

在build.gradle(app)里顶部使用我们开发的插件,hide_api就是我们上面定义的文件名,不能写错了:

apply plugin: 'hide_api'

最后,在build.gradle(app)的dependencies{}里添加

// 使用gradle插件形式,不需要依赖module,“ext.layoutlibJar”只是我们在HideApiPlugin.groovy里定义的一个变量名称
provided files(gradle.ext.layoutlibJar)

就可以使用我们开发的插件,并且导进了layoutlib类库了,不需要在File–>Project Structure–>dependencies里添加对该module的引用。

注意:
如果开发过程中,你修改了groovy文件,或者module里的配置文件,需要先删除repo文件夹,重新执行gradlew uploadArchives命令生成新的repo文件。
参考:
https://www.jianshu.com/p/3191c3955194
https://www.jianshu.com/p/3c59eded8155

Kotlin 移动开发中的 Gradle 插件开发 移动端构建过程中的定制化需求实现多模块项目的构建效率优化复杂构建逻辑的模块化封装现代Gradle API的最佳实践本文采用"原理-实践-优化"的三段式结构,首先解析Gradle插件核心机制,然后通过实际案例演示开发流程,最后探讨高级优化技巧和行业最佳实践。:构建过程的基本执行单元:插件配置参数的DSL扩展:构建过程的初始化->配置->执行三阶段模型:增量构建机制。 阅读详情

相关推荐

移动开发中的Gradle插件开发指南

本文旨在为移动开发者提供全面的Gradle插件开发指南,覆盖从基础概念到高级实践的完整知识体系。重点解决Android/iOS开发中常见的构建定制需求,帮助开发者掌握扩展Gradle构建系统的核心能力。文章首先介绍Gradle插件的基本概念,然后深入开发实践,最后探讨高级主题和优化技巧。每个部分都配有详细的代码示例和最佳实践建议。Gradle:基于Groovy/Kotlin的自动化构建工具Plugin:封装了可重用构建逻辑的组件DSL:领域特定语言(Domain Specific Language)

移动开发前沿的博客 1049

【Gradle-8】Gradle插件开发指南

编写一个插件Plugin其实挺简单的,只需要实现Plugin接口,并实现唯一apply方法即可。我们就直接写在@Overrideprintln("这是插件:${this.class.name}")这实际上是一个内联类。写完别忘了apply依赖上。第9行的apply方法是调用的PluginAware接口的apply()方法,参数是一个map,用来映射Plugin Id。这是插件:YechaoaPlugin...在上一文。

yechaoa 3902

SOPHGO SG2000/SG2002 AI SoC异构架构解析与应用

异构计算架构通过整合不同指令集核心(如RISC-V、Arm和8051)实现性能与功耗的平衡,是现代嵌入式系统和AIoT设备的关键技术。其原理是根据任务特性分配至最适合的计算单元,例如通用计算使用高性能核心,实时任务交由专用核心处理。这种架构在智能视觉、工业检测等场景具有显著优势,能高效处理AI推理、多媒体编解码等任务。SOPHGO SG2000系列SoC采用创新的三核异构设计,集成了0.5-1TOPS的NPU加速器,支持Linux/Android/FreeRTOS多系统并行运行。开发中需注意核心间的IPC通

weixin_30684743的博客 355

Gradle插件开发流程

一、Gradle插件的概念 Gradle是一个构建工具,让工程构建更加自动化,不过它只是一个执行环境,提供了基本的框架,真正的构建行为不是Gradle提供,Gradle负责在...

Android技术之家 2234

Xiaojie雷达之路---使用CCS创建一个毫米波雷达的工程(AWR1843)

前些天,在工具箱中下载了一个基于毫米波雷达(AWR1843)自动停车的案例,并成果导入CCS中,可以完美运行,但是如何新建一个新的工程呢?这篇文章就会对其进行讲述。

XiaoJie的博客 4552

TMC5130/TMC5160步进电机驱动芯片深度解析与工程实践

步进电机驱动芯片是精密运动控制系统的物理执行核心,其性能直接决定定位精度、运行噪声与系统鲁棒性。基于电流闭环控制与电压前馈调制的混合驱动原理,现代智能驱动芯片如TMC51X0系列实现了微步插补、堵转检测和片上运动规划等关键技术突破。这类芯片通过SPI寄存器级配置实现StealthChop静音驱动与SpreadCycle高动态响应模式的无缝切换,在3D打印、CNC、机器人关节等场景中显著提升能效比与控制带宽。本文围绕TMC5130与TMC5160的硬件架构差异、寄存器操作时序、驱动模式物理机制及FreeRTO

weixin_35797963的博客 410

Gradle插件开发指南

编写一个插件Plugin其实挺简单的,只需要实现Plugin接口,并实现唯一apply方法即可。我们就直接写在@Overrideprintln("这是插件:${this.class.name}")这实际上是一个内联类。写完别忘了apply依赖上。第9行的apply方法是调用的PluginAware接口的apply()方法,参数是一个map,用来映射Plugin Id。sync输出:这是插件:YechaoaPlugin...在上一文。

Dream It Possible 853

SceneSplat

目标:训练一个网络,输入高斯参数 → 输出与自然语言空间对齐的特征。考虑到标注语义的 3DGS 数据有限,作者设计了。策略,让模型在无标签场景上学到有用表征。都有一个与自然语言对齐的语义特征。这是整个方法的第一步,目标是让。

weixin_61091146的博客 1284

Idea插件开发之Gradle

Idea插件开发之Gradle 1. 前言 作为Java开发者,Intellij Idea可以说是必备开发工具,Jetbrains提供了丰富的插件库。但是,有时候我们都在做重复、繁琐、无意义的操作,我们就可以自己编写插件,来简化工作。由于冠状病毒的影响,作者过年只能待在家里,研究了一下如何在Intellij Idea上开发插件,下面介绍一下采坑记录。 2. 准备工作 2.1 软件与环境 首先需要安...

既无风雨也无晴 3万+

从零开始解析N-CMAPSS数据集:航空发动机健康管理的入门指南

本文详细解析了N-CMAPSS数据集在航空发动机健康管理中的应用,从数据集的构成、关键变量到实际数据分析方法,为初学者提供了全面的入门指南。通过Python代码示例,展示了如何加载、探索和建模这一复杂数据集,帮助读者掌握航空发动机性能预测的核心技术。

weixin_29063979的博客 323

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的远距离停车位检测系统(深度学习代码+UI界面+训练数据集)

本文详细介绍了基于YOLOv5/YOLOv6/YOLOv7/YOLOv8深度学习模型的远距离停车位检测系统的完整实现方案。该系统能够准确识别200米范围内的停车位状态,为智能停车场管理系统、自动驾驶车辆提供关键的视觉感知能力。文章涵盖算法原理、数据集构建、模型训练、系统实现及优化策略,并提供完整的代码实现和UI界面设计。关键词:YOLO系列,深度学习,停车位检测,计算机视觉,智能交通系统pythonimport cv2import os"""创建数据存储目录""""""定时采集图像"""

YOLO 186

使用Gradle开发插件

使用Gradle来开发插件 将Gradle构建支持功能添加到IntelliJ平台需要使用到最近发布的Gradle构建系统和IntelliJ IDEA(Community或者Ultimate版)。 1.0 下载安装IntelliJ IDEA 下载并安装IntelliJ IDEA Ultimate版或者IntelliJ IDEA Community Edition版。 1.1 确保启用“Gradle”...

乐翁龙 4042

华为od 面试八股文_C语言_02_含答案

华为od 面试八股文_C语言_02_含答案

MISAYAONE的博客 2230

Android Gradle插件开发基础

什么是Gradle 在Gradle官方文档上是这么描述的: Gradle 是一种开源构建自动化工具,其设计足够灵活,几乎可以构建任何类型的软件。 Gradle 允许您构建任何软件,因为它对您尝试构建的内容或应该如何完成几乎没有做出任何假设。最显着的限制是依赖管理目前只支持 Maven 和 Ivy 兼容的存储库和文件系统。 Gradle 将其构建建模为任务(工作单元)的有向无环图 (DAG)。这意味着构建本质上是配置一组任务并将它们连接在一起——基于它们的依赖——以创建该 DAG。创建任务图后,Gradle

记录技术,记录生活 1万+

Whisper 模型在嘈杂环境中的表现:降噪与增强技术

本报告系统分析了OpenAI Whisper模型在嘈杂环境中的表现机制,重点揭示其内在降噪能力的技术边界,并结合语音增强(SE)、时频分析等前沿技术提出优化方案。内容覆盖从基础概念(如噪声类型对ASR的影响)到理论框架(模型架构与数学形式化),再到实际应用(端到端部署策略)的全链路分析,同时通过案例研究与可视化工具(如梅尔频谱对比图)降低复杂概念的认知门槛。核心结论指出:Whisper的多语言预训练虽提升了泛化性,但在低信噪比(SNR<5dB)场景下需结合前端降噪或联合训练技术以突破性能瓶颈。

AI 原生应用开发的博客 489

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Gradle 插件开发

早期写过一些 gradle task,了解过插件开发,现在项目中有需要一个复用的 task 原本在项目的 gradle 文件中,最近由于配置变化,需要修改,考虑处理成一个插件,方便各项目使用。 本文包含一下两部分,内容主要来自官方文档 插件开发 Developing Custom Gradle Plugins 插件发布 Gradle Artifactory Plugin 一定要阅读官方文档...

Deng 953

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java 开发 Gradle 插件的步骤

Gradle 插件代码可以在 build.gradle 中,buildSrc 项目中,以及独立的插件项目中编写。本文将介绍如何在一个独立的项目中使用 Java 语言编写 Gradle 插件,并发布到仓库中。 1 创建项目 Gradle 插件项目和普通的 Java 项目没有什么不同,普通项目是基于其它三方包进行开发,而 Gradle 插件项目基于 Gradle 的 API 进行开发。 基于 Gradle 创建一个 Java 项目,项目目录结构如下,和普通项目一样。 gradle-plugin-sample.

weixin_55932015的博客 1278

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android Gradle 开发与应用 (七): Gradle 插件开发与发布

在现代的Android开发中,Gradle是一个不可或缺的构建工具。它不仅能够帮助开发者高效地管理项目依赖、配置构建任务,还能通过插件机制扩展其功能。开发和发布Gradle插件可以极大地提升项目的可复用性和开发效率。本文将详细介绍Gradle插件的开发与发布过程,帮助读者深入理解这一重要技术。

1865

一篇学会Android Gradle插件开发

自定义插件的时候经常会有这种自定义配置的需求,通过自定义的配置可以让我们的插件提供更丰富的能力。这些配置就是通过扩展插件来的。增加定义了一个SubExtension类,然后在YiRanPluginExtension实例化的时候加到ExtensionContainer中。类嵌套的话,不能写成内部类,不然编译识别不过。

ChenYiRan123456的博客 2004

初识Gradle插件开发

一、Groovy初识 1、特点: Groovy是一门jvm语言 Java语言的特性Groovy都支持,我们可以混写Java和Groovy 2、与Java对比 2.1 变量定义 Groovy中的变量可以通过两种方式定义:使用数据类型的本地语法,或者使用def关键字 2.2 集合遍历 def list = [1,2,3,4] list.each{ println it } 2....

weixin_45365889的博客 459

Gradle 插件开发教程

Gradle 插件开发教程 项目介绍 本项目旨在提供一个详细的指南,帮助开发者理解和编写Gradle插件。通过本教程,您将学习到如何创建、配置和发布Gradle插件,以及如何在实际项目中应用这些插件。 项目快速启动 环境准备 确保您的开发环境已经安装了以下工具: Java JDK 8 或更高版本 Gradle 6.0 或更高版本 克隆项目 首先,克隆本项目到您的本地环境: git clone ...

gitblog_00604的博客 641

如何从零开发一个 gradle 插件

相信开发过 Android 应用的人都明白 gradle 的重要性,作为 Android 官方默认的构建工具,Android 开发者在日常开发中免不了和 gradle 打交道。而 gradle 的大部分功能都是通过插件扩展的,像我们最常用的插件就是 Android 官方插件 com.android.application,用来做一些和 Android 相关的配置。 那如果我们想自己开发一个 gr...

weixin_45365889的博客 452

Gradle插件开发

Gradle插件开发。

feather(猎羽) 498

Android Gradle插件开发入门

Android Gradle插件是Android开发中不可或缺的一部分,它能够帮助我们自动化构建过程、优化项目配置,并提高开发效率。通过学习本文,开发者可以快速掌握插件开发的基本概念和技巧,为后续的插件开发奠定基础。插件分为脚本插件和二进制插件,其中二进制插件更加灵活,可重用性更高。开发者应不断探索和实践,提高自己的插件开发能力,为Android开发带来更多创新和便利。在插件项目中,编写插件的核心代码。以下是一个实际的Android Gradle插件开发案例:实现一个自动生成代码的插件。

cao_xiang_qi8395的博客 524
上一篇: Android Space引起TextView走马灯marquee的一个显示bug
下一篇: android tv 实现弹出通知
ithouse
博客等级 码龄12年 200粉丝 212原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值