android Gradle插件分类与使用

gradle引用根目录下的gradle脚本 apply from rootProject apply from: this.rootProject.file('mavenpublish.gradle') 目录结构如下: 完整配置如下: plugins { id 'com.android.library' id 'kotlin-android' } //apply from: 'mavenpublish.gradle' //apply from: this.rootProject.file('mavenpublish.gradle') apply from: roo 阅读详情

简介

Gradle 是一款非常优秀的构建系统工具,它的DSL基于Groovy实现,可以通过DSL来达到你构建的目的。其中提供了插件的概念,基于Gradle进行很好的扩展,而不改变其核心基础,又能满足不同业务的需要。
这里只说android gradle 插件
从Gradle的角度来说,Android其实就是Gradle的一个第三方插件,由Google开发的。但从Android角度来看,Android插件是基于Gradle构建的,然后加上Gradle Wapper(包装器,保证对于studio运行时,gradle的环境和版本带来一个确定性,并且能快速启动gradle)和studio完美搭建了android构建系统。

作用与优点

作用

  • 为项目配置依赖
  • 为项目配置约定,比如约定代码的存放位置、签名位置
  • 为项目添加任务,比如测试、编译、打包等
  • 为项目的核心对象和其他插件的对象添加扩展类型
  • 为项目提供公共化配置

优点

  • 更高程度的模块化
  • 重用和减少维护在多个项目类似的逻辑开销
  • 封装必要的逻辑,并允许构建脚本尽可能是声明性的

插件分类

脚本插件

先看代码,根目录定义config.gradle文件:

ext {
    cfgs = [
            compileSdkVersion : 29
    ]
    android = [

            versionName : '1.0.0'
    ]
}

在根gradle文件中引入插件

apply from: "config.gradle"

task test{
    doLast{
        println("版本名称是:${android.versionName}")
    }
}

执行 ./gradlew test,会输出:版本名称是:1.0.0

实际上这不算真正的脚本插件,但定义还是脚本插件。更像是c++的头文件引入。
应用脚本插件,其实就是把这个脚本加载进来,使用apply from关键字引入的。但是作用也很大,我们在多模块开发的时候,我们可以庞大的脚本文件,进行分块、分段整理,拆分成一个个公用、职责分明的文件。比如:将很多共有的库版本号一起管理、应用构建版本一起管理、maven配置脚本文件抽取等等。

对象插件

对象插件(二进制插件)是实现了org.gradle.api.Plugin接口的插件。可以分为内部插件和第三方插件。

内部插件

内部插件是gradle提供的,它们可以有plugin id。
比如我们定义一个Java插件

apply plugin : org.gradle.api.plugins.JavaPlugin

由于Gradle会帮我们默认导入org.gradle.api.plugins包,所以可以省略前缀,如下:

apply plugin :JavaPlugin

更简洁的,对于Gradle自带的核心插件都有一个容易记的短名,称其为plugin id,比如这里的Java插件对应的id就是java,所以简化如下:

apply plugin :'java'

第三方插件

第三方的对象插件通常是jar文件,要想让构建脚本知道第三方插件的存在,需要使用buildscrip来设置依赖,需要配置classpath。
我们最熟悉的android Gradle插件也属于第三方插件,我们经常会这么写:

buildscript {
    ext.kotlin_version = '1.3.10'

    repositories {
       jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        
    }
}

然后我们才能引入apply plugin: 'com.android.application'

对象插件自定义

写一个简单的自定义插件,按照标准要实现Plugin接口:

class GreetingPlugin implements Plugin<Project>{

    /**
     * Apply this plugin to the given target object.
     *
     * @param target The target object
     */
    @Override
    void apply(Project target) {
        target.task('testplugin'){
            doLast {
                println('hello the GreetingPlugin')
            }
        }
    }
}
apply plugin: GreetingPlugin

当插件应用于项目时,Gradle将创建插件类的实例,并调用实例的apply方法。这里我们定义了一个task任务,然后在控制台执行这个任务:

 ./gradlew testplugin

会输出:

> Task :testplugin
hello the GreetingPlugin

插件DSL

plugins DSL是一种新出的插件应用放肆,需要在Gradle 2.1 以上版本才可以使用。
插件DSL正在孵化(incubating)中,请注意,在以后的Gradle版本中,DSL和其它配置可能会改变。
使用就是依靠闭包代码来设置插件,比如指定Java插件:

plugins {
    id 'java'
}

还有就是如果该插件已经被托管在https://plugins.gradle.org/上,就不需要配置classpath依赖了,直接使用plugins就可以使用插件:国内网差

plugins{
	id "org.sonarqube" version "1.2"
}

Android Gradle 插件

分类

可根据工程类型分成一下:

  • 应用程序插件:它可以生成一个可运行的apk应用,插件id为:com.android.application。
  • 库插件:它可以生成AAR包给其他的APP工程公用,跟Jar一样,但是塔包含了Android资源等信息,插件id为:com.android.library。
  • 测试插件:用于对其他模块进行测试,插件id为:con.android.test。
  • feature插件:用于创建Android Instant App 是需要用到,插件id为:com.android.feature。
  • Instant App插件:是Android Instant App 的入口,插件id为:com.android.instantapp.

编写与集成

编写

对于插件的编写,可以使用java、kotlin、groovy语言,都是基于虚拟机。这里选groovy语言编写

build.gradle中编写

第一种:就跟前面写的自定义对象插件一样,直接写在项目build.gradle里面,这种一般不推荐,很low。

buildSrc编写

第二种: 在buildSrc下编写插件。根目录下创建buildSrc目录(或者通过创建java 模块也行),请仔细检查名字是不是对的,buildSrc是Android studio预留的命名,它会自动识别并构建的。在分别创建以下文件或目录:
build.gradle 需要引入groovy的sdk,也可以指定sourceSets的目录:

//我们使用groovy来编写,引入groovy库
apply plugin: 'groovy'
//apply plugin: 'java-library'

创建src/main/groovy目录(如果java编写,请放在java目录)
在这里插入图片描述
其中recources目录是用来配置资源的,如果需要在引入包名,可以在groovy里面创建包名,之后需要在该目录下指定。在resources目录下创建目录META-INF/gradle-plugins目录,最后在该目录下编写插件属性文件com.hujin.plugin.properties文件。其com.hujin.plugin就是定义的包名路径,而.properties是后缀,千万别写错了。然后在该文件中编写插件的全类名:implementation-class=com.hujin.plugin.MyTestPlugin

我们这里简单引入单个文件为例子,不处理包名。后面会以包名方式再介绍

创建一个文件,跟上面的自定义一样,实现Plugin接口的类,切记,文件一定要以.groovy结尾,要不然就会找不到。重点:.groovy结尾

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

class MyTestPlugin implements Plugin<Project>{

    @Override
    void apply(Project project) {
        println('MyTestPlugin is Run')
    }
}

写完之后记得同步下或者rebuild下。
在主项目的build.gradle下引入:

//包名类型的,请引入包名的字符串
apply plugin: MyTestPlugin

执行build输入完成,输出:

MyTestPlugin is Run

小问题:我遇到一个报错,但是不影响使用:

在这里插入图片描述
删掉buildSrc/build/libs/buildSrc.jar包,就正常了。这个jar包属于编译产物,是可以分享的。看下种方案会介绍,或者不创建resources目录,并删掉所以build目录再同步就好了。

独立项目编写

第三种:这种方案可以发布在本地或者远程仓库,给其他人使用。另其一个工程,这里使用idea创建一个groovy工程。
在这里插入图片描述
然后修改build.gradle配置如下:

plugins {
    id 'groovy'
}

group 'com.share.plugin'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compile gradleApi()
    compile localGroovy()
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

然后跟buildSrc操作一样,在src/main/groovy目录下创建一个包,比如创建com.hujin.plugin包,下创建ShareCustomPlugin插件。
在这里插入图片描述
然后需要提供一个属性文件来配置插件的位置,就是要插件properties文件,在resources目录下,再创建一个META-INF/gradle-plugins/目录,再创建属性文件com.hujin.plugin.properties,写入代码:

//  src/main/resources/META-INF/gradle-plugins/com.hujin.plugin.properties
implementation-class=com.hujin.plugin.ShareCustomPlugin

implementation-class属性为自定义插件的属性。编写完毕了。

集成

插件的生成

集成还是使用本地maven模式。远端参考android mac搭建Nexus3.+私有maven这个操作。
修改原build.gradle文件:引入maven库。
注意目录,有的创建项目多进或少进了一层目录../repository和repository

plugins {
    id 'groovy'
}
//引入maven库
apply plugin: 'maven'

repositories {
    mavenCentral()
}

def group = 'com.hujin.plugin'
def version = '1.0.0'
def artifactId = 'myGradlePlugin'
uploadArchives{
    repositories.mavenDeployer{
        // 配置本地仓库路径,项目根目录下的repository目录中
        repository(url: uri('repository'))
        pom.groupId = group
        pom.artifactId = artifactId // 项目名称(通常为类库模块名称,也可以任意)
        pom.version = version
    }
}

dependencies {
    compile gradleApi()
    compile localGroovy()
}

同步后,找到右侧Gradle侧边栏:执行uploadArchives
在这里插入图片描述
然后会生成本地maven文件:
在这里插入图片描述
而图中的myGradlePlugin-1.0.0.jar包就是我们需要的插件jar包。
远端配置完后,会到本地android项目

本地的集成

本地项目还是以android为例子,参考tools.build:gradle的引入。

  1. 在根build.gradle中,引入本地maven仓库:
buildscript {
    repositories {
        google()
        jcenter()
        maven {
        //这个url 是 上个项目,生成的本地maven文件,你也可以copy到本地,一样的
            url 'file:/Users/apppp/IdeaProjects/CustomPluginShare/repository'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.4'
        classpath 'com.hujin.plugin:myGradlePlugin:1.0.0'
    }
}

repository这个是插件项目下地址。

  1. 引入classpath:
  classpath 'com.hujin.plugin:myGradlePlugin:1.0.0'

3.导入插件

apply plugin: 'com.hujin.plugin'

验证是否引入成功,执行 task 'assembleDebug',会打印出ShareCustomPlugin的打印代码:

> Configure project :
第三方插件 ShareCustomPlugin  被调用

小结

这里还是简单的创建和使用,还没有真正的项目化。如何写一个插件,能帮助项目自动化或者便捷化,才是真正的开始。

一篇文章看懂gradle 这段时间来学习了gradle,也体会到了gradle从初步理解到基本熟悉,再到深入源码这样一个过程中的一些曲折。于是就萌发了写这样一篇逐步深入原理的文章的想法。 这篇文章主要是gradle的基础知识篇。看完这篇文章,你可以: 清楚gradle的定义和解决的痛点 基本理解Android gradle的运作机制 基本理解gradle的大部分语法 学会基本的groovy开发 如果你想关注gradle... 阅读详情

相关推荐

Android Gradle 自定义Plugin实现_android plugin

而 Gradle 改良了过去 Maven、Ant 带给开发者的问题,至今也成为 Android Studio 内置的封装布署工具。

2501_90228903的博客 1298

Gradle插件的引用:apply plugin和apply from

Gradle是一款帮助开发人员更快更好的编译、自动化运行和分发软件的工具。Gradle具有无与伦比的通用性,可以编译Java、C++,Python或者任何其他你使用的语言。 与Maven类似,Gradle本质上也是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成。 Gradle插件大致分为两种: (1)二进制插件。二进制插件一般都是被打包在一个Jar里独立发布的,比如我们自定义的插件,在发布的时候我们也可以为其指定plugin id,这个plugin id最好是一个全限定

u010227042的博客 1万+

AndroidBuildGradleCommonLibrary:这是我用于 Android 项目的 gradle 通用库。 将“git submodule”添加到项目中。 由“build.gradle”中的“apply from”使用

AndroidBuildGradleCommonLibrary 这是我用于 Android 项目的 gradle 通用库。 将“git submodule”添加到项目中。 由“build.gradle”中的“apply from”使用。 设置 git submodule add git@github.com:jakenjarvis/AndroidBuildGradleCommonLibrary.git gradle/commonlibrary git submodule update --init git commit -m "Add AndroidBuildGradleCommonLibrary as a submodule" 更新 git submodule foreach git pull origin master git commit -m "Update AndroidB

Gradle 使用指南 -- 基础配置

我的博客原文地址 Gradle是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于Groovy的内部领域特定语言(DSL),建议可以先熟悉一下Groovy脚本。 Gradle API 文档 Android 配置构建 Android 插件 DSL 扩展 本文只是简单的介绍一下 Gradle 的一些基本配置,如果想进行一些高级的操作或者是想深入的了解这些配置,请参考我的后面...

寒江蓑笠的专栏 7万+

物联网技术(AIR780E cat1-4G模块+小程序+腾讯云MQTT)驱动的智能井盖系统设计(连载01)

终端设备采用AIR780E模块作为主控器,电子模块有三轴加速度传感器、可燃气体传感器,AIR780E模块(4G模块)通过MQTT通信协议进行数据打包上传至EMQX服务器,在EMQX服务器中,用户可以自行订阅主题和发布主题,小程序通过MQTT通信协议订阅EMQX服务器的主题,服务器通过接收到硬件发布的数据,转发到微信小程序。

leida_3669的博客 2218

Yolov2 训练时anchor是如何使用的?build_target

0.简略描述 1.将真值检测框变换到特征图尺度上 2.计算以特征图每个网格中心为中心点时所有锚框与真值检测框的交并比 3.取与真值检测框交并比最大的锚框的id,及真值检测框中心所在cell的id,有此,可将真值检测框与预测结果对应起来 4.计算位置回归损失,置信度损失,分类损失 1,网络的输出 图1 yolov2 网络对于检测框位置大小的输出是: 对于1个batch网络的输出的shape为[batch_size, H*W*num_anchors, 5+num_classes], 其中: num_

机器人视觉感知 2818

Gradle系列之Android Gradle插件

通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章: Gradle系列之初识Gradle Gradle之Groovy基础篇 Gradle系列之构建脚本基础 Gradle系列之Gradle插件 Gradle系列之Java Gradle插件 学习 Gradle 的目的主要是为了更好的在 Android 开发中使...

躬行之 773

10分钟快速搭建OpenClaw(基于Windows+飞书)

OpenClaw 是一款功能强大的 AI 智能体工具,能够帮助用户管理邮件、日历等日常事务。本文详细介绍了在 Windows11 系统上安装和配置 OpenClaw 的完整步骤,包括 Node.js 环境搭建、Git 安装、OpenClaw 部署以及飞书机器人创建与对接。通过简单的命令行操作和可视化界面配置,用户可以快速完成 AI 助手部署,实现智能办公自动化。文中还提供了飞书机器人权限设置等关键环节的图文指引,帮助用户轻松完成系统集成。

Hello, New World! 2927

PFC中pb模型实战:从胶结参数设置到破坏模拟全流程解析

本文详细解析了PFC软件中平行胶结模型(PB模型)的实战应用全流程。从胶结参数(pb_kn, pb_ks, pb_ten等)的物理意义与精准赋值入手,深入探讨了模型构建、胶结施加以避免初始损伤的技巧,并系统介绍了破坏过程的监测、阈值判定方法以及高级可视化与常见问题诊断。旨在帮助岩土工程与颗粒材料研究者掌握从参数调试到破坏模拟的核心操作,提升数值模拟的准确性与效率。

php55的博客 1075

ShowDoc item_id 未授权SQL注入漏洞复现

2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前置条件,易于利用,且默认情况下可暴破用户token获取系统后台权限,建议所有使用该系统的企业尽快升级修复,以确保系统安全。

0xSec 2357

Android Gradle 插件

从 Gradle 角度看,Android 插件是由 Google 的 Android 团队开发的一个第三方插件。 从 Android 的角度看,Android 插件是基于 Gradle 构建的,是和 Android studio 完美搭配的新一代构建系统。

佛系编码 1370

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

MSS = MTU - tcpHeader - ipHeader,也就是MTU = MSS(1360) + tcpHeader(20) + ipHeader(20) = 1400,说明CAPL是可以动态设置网络底层配置参数的!然后在CAPL中设置此网卡MTU值为1400,然后创建UDP套接字,一次性发送2000个字节,在Trace窗口看看首帧报文二层Data的长度。所以我们还不能用UDP协议来验,应该用TCP协议来验,也就是在TCP三次握手时通过Tester的MSS值推导出自己的MTU值。

jasonj333 992

gradle-android插件

2018-12-22 文章目录应用Android插件Android Gradle 工程示例compileSdkVersionbuildToolsVersiondefaultConfigbuildTypesAndroid Gradle任务 Android Gradle插件可以分为三类,分别对应Android中的三类工程: App应用工程,它可以生成一个可运行的apk应用,对应插件id:com.android.application Library库工程,可以生成AAR包给其他工程使用,对用插件id:com.

Huang兄 592

2025年新发表的语音大模型全双工模型/框架/技术

参考该论文,给出2025年新发表的全双工模型或框架或技术下面这份清单专挑、且与“全双工语音对话/同步对话(边听边说、可打断、回馈/相槌、重叠语音)”直接相关的。我也结合你提到的的四大维度(暂停处理、相槌、顺滑换手、打断管理)来点出它们各自的贡献点,便于后续评测与对比。

u013250861的博客 630

【技术科普】破解政务跨系统数据壁垒!亘川一网统管平台多源数据同步技术解析

本文解析亘川一网统管平台多源数据同步技术,针对政务跨系统数据壁垒难题,介绍组件的数据采集、校验、审计留痕等核心能力,结合营商环境项目落地案例,对比传统开发模式差异,讲解开源组件的实践价值,为政务项目开发者提供落地参考。

weixin_67440240的博客 635

Android Gradle插件开发初次交手(一)

一、 Android Gradle插件 熟悉使用Android Studio构建Android项目的开发者都知道我们在创建一个Android项目的时候,都会在项目的根目录和每个Module的根目录下生成一个build.gradle文件,在Module目录下的build.gradle文件下都会有如下的描述: plugins { id 'com.android.application' } 或 apply plugin: 'com.android.application' 那么这个com

nihaomabmt的专栏 2990

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《Gradle 权威指南》读书笔记——第七章 Android Gradle 插件

AndroidGradle插件其实就是一个Gradle的第三方插件 优点:容易重用代码和资源, 容易创建应用衍生版本(多渠道包), 容易配置扩展和自定义构建过程, 和IDE无缝整合 Android Gradle插件分类 //app com.android.application //aar com.android.library //test com.android.test 应用Andriod...

Annoke的博客 314

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Clawdbot本地部署与飞书Telegram双平台对接指南

自动化机器人框架是现代企业实现跨平台协作的重要工具,其核心原理是通过API集成不同通讯平台的消息系统。Clawdbot作为开源机器人框架,采用Java+Python技术栈,支持插件化开发模式,能够有效解决企业多平台消息孤岛问题。在技术实现上,通过Webhook监听和消息队列机制确保实时性,配合消息转换器处理不同平台的数据格式差异。典型应用场景包括跨平台消息同步、自动化工作流触发和智能客服系统搭建。本文详细介绍如何在Ubuntu系统部署Clawdbot,并实现与飞书和Telegram的深度集成,涵盖从环境配置

weixin_33769125的博客 486

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

《Gradle权威指南》--Android Gradle插件

No1: Android Gradle插件分类 App插件id:com.android.application Library插件id:com.android.library Test插件id:com.android.test No2: 除了插件id之外,如果是第三方的插件,还要配置它们的依赖classpath。Android Gradle插件就是属于第三方插件,它托管在Jcenter...

weixin_30390075的博客 122

Android Gradle使用详解(三) 之 Android Gradle插件配置详解

通上前两篇博文由浅入深的学习Gradle的基础和Gradle的Java插件相关知识后,现在终于到了高潮部分了,让我们来进一步正式学习Android Gradle插件。前面提到,Android Gradle插件是一个基于内置的Java插件来实现的第三方插件,它是由google的Android团队开发的。 1 分类 Android Gradle插件根据我们Android工程的属性分为三类: ...

子云心的博客 5640

Android Gradle 自定义Plugin实现

Id 就是插件唯一标识,后续在其他项目中引用的时候,也是引用这个 id。这里有很多不需要的文件目录,包括用来测试和 Gradle 的一些相关内容,都可以删除(当然你也可以不处理),因为当我们把这个项目引入到一个 Android 项目中时,Android 项目提供了 Gradle 相关文件。如图所示,ExamplePlugin 目录下 gradle 相关的文件,在 Android 的根目录中都存在。实际上 Gradle 后续就是执行这个 Task ,来执行代码块中的代码的。

chuyouyinghe的专栏 820

gradle的使用5

1.gradle构建的产物,称为构件。可以为jar,zip或者war等。 可以使用下面的代码进行构建,并运行命令 gradlew uploadArchives apply plugin: &amp;quot;java&amp;quot; task publishJar(type:Jar) artifacts{ archives publishJar } //def publishFile=file('build/bui...

yuezheyue123的博客 481

Android Gradle权威指南

1.Android Gradle插件介绍   我们知道Android起始就是Gradle的一个第三方插件,它是由Google的Android开发团队开发的。但从Android的角度来看,Android插件是基于Gradle构建的,和AndroidStudio完美无缝搭配的新一代构建系统。 2.Android Gradle插件分类 在Android中有3类工程   1.App应用工程,他可以生成一个可运行的apk应用。    App插件id :com.android.application   2.L

Gabriel的专栏 1025
上一篇: android groovy语法与数据结构
下一篇: Recyclerview滑动对齐方式smoothScrollToPosition
HUandroid
博客等级 码龄10年 35粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值