1.1二进制插件
二进制插件就是实现了org.gradle.api.Plugin接口的插件,它们可以有plugin id,二进制插件一般都是被打包在一个jar里独立发布的,比如我们自定义的插件,在发布的时候我们也可以为其制定plugin id,这个plugin id最好是一个全限定名称,就像你的包名一样,这样发布的插件plugin id就不会重复了。
1.2脚本插件
build.gradle文件
apply from: 'version.gradle' task ex << { println "app版本:" + versionName + ",版本号是:" + versionCode }
version.gradle文件
ext { versionName = '1.1' versionCode = 1 }
其实这不能算一个插件,它只是一个脚本。应用脚本插件其实就是把这个脚本加载进来,和二进制插件不同的是它使用的是from关键字,后面紧跟的是一个脚本文件,可以是本地的,也可以是网络的,如果是网络上的话要使用HTTP URL。
Gradle插件是使用Groovy进行开发的,而Groovy其实是可以兼容Java的。Android Studio其实除了开发Android App外,完全可以胜任开发Gradle插件这一工作,下面来讲讲具体如何开发。
1.首先,新建一个Android项目,新建一个Android Module项目,类型选择Android Library。
2.将新建的Module中除了build.gradle文件外的其余文件全都删除,然后删除build.gradle文件中的所有内容。
打开Module下的build.gradle文件,输入
apply plugin: 'groovy' apply plugin: 'maven' dependencies { compile gradleApi() compile localGroovy() } repositories { mavenCentral() }
3.在新建的module中新建文件夹,src/main/groovy目录,这时候groovy文件夹会被Android识别为groovy源码目录。除了在main目录下新建groovy目录外,你还要在main目录下新建resources目录,同理resources目录会被自动识别为资源文件夹。在groovy目录下新建项目包名,就像Java包名那样。resources目录下新建文件夹META-INF,META-INF文件夹下新建gradle-plugins文件夹。META-INF和gradle-plugins必须是父子目录。这样,就完成了gradle 插件的项目的整体搭建。目前,项目的结构是这样的。
下面我们在包名下新建一个文件,命名为CustomPlugin.groovy
package com.pl.plugin import org.gradle.api.DefaultTask import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.TaskAction class CustomPlugin implements Plugin<Project> { @Override void apply(Project project) { project.tasks.create('writeFile', CustomPluinTask) { def greeting = project.extensions.create('greeting', ParamsExtension);//使用类型向插件传递参数 destination { project.greetingFile } doFirst { String args = project.args;//通过ext直接传递参数 message = args + " " + greeting.message println "doFirst greeting.message:" + greeting.message } doLast { println(project.file(destination).text) } } } } class ParamsExtension { String message = "pl init" } class CustomPluinTask extends DefaultTask { def destination String message = "pl test" File getDestination() { //创建路径为destination的file project.file(destination); } @TaskAction def greet() { def file = getDestination(); file.parentFile.mkdirs(); //向文件中写文本 file.write(message); } }
然后在resources/META-INF/gradle-plugins目录下新建一个properties文件,注意该文件的命名就是你只有使用插件的名字,这里命名为gradlePlugin.properties,在里面输入
implementation-class=com.pl.plugin.CustomPlugin
注意:包名需要替换为你自己的包名,这样就完成gradle插件的开发工作,下面简单讲解一下,插件所做的整改,插件里面定义了一个名为writeFile的task,task将指定的message信息写入到,由destination指定路径的文件中。
3.发布到本地仓库中
接着,我们需要将插件发布到本地仓库就好了,在module项目下的buidl.gradle文件中加入发布的代码。
uploadArchives { repositories { mavenDeployer { //设置插件的GAV参数 pom.groupId = 'com.pl.plugin' pom.artifactId = 'gradlePlugin' pom.version = '1.0.0' //文件发布到下面目录 repository(url: uri('../repo')) } } }
上面的group和version的定义会被使用,作为maven库的坐标的一部分,group会被作为坐标的groupId,version会被作为坐标的version,而坐标的artifactId被用作插件的模块名称。后面定位引用插件时,将会用到上面设置的值。然后maven本地仓库的目录就是当前项目目录下的repo目录。
点击uploadArchives这个Task,就会在项目下多出一个repo目录,里面存着这个gradle插件。
发布到本地maven仓库后,我们就使用它,接下来我们在项目根目录的build.gradle文件中加入如下代码
apply plugin: 'gradlePlugin' ext.args = "hello" greeting { message = 'test success' } ext.greetingFile = "$buildDir/hello.txt" buildscript { repositories { maven { url = uri("$rootDir/repo") } google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.0' classpath 'com.pl.plugin:gradlePlugin:1.0.0' } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
注意:apply plugin后面引号内的名字就是前文gradlePlugin.properties文件的文件名,而class path后面引号里的内容,就是上面grade中定义的group,version以及moduleName所共同决定的,和maven是一样的。
相关推荐
使用AndroidStudio自定义Gradle插件源代码,https://blog.csdn.net/heart2016/article/details/85257133
通过自定义Gradle插件,修改class文件
自定义gradle插件实现,以及通过插件来修改编译后的class文件和监控Task任务执行情况
手把手带你自定义 Gradle 插件 —— Gradle 系列(2).doc
自定义Gradle 插件的三种主要形式的demo源码,以及上传代码到本地仓库的实现,博客地址https://blog.csdn.net/CrazyMo_/article/details/89070618
主要介绍了为Android Studio编写自定义Gradle插件的教程,Android Studio现在基本上已经成为了安卓开发的标配IDE,友可以参考下
kotlin-gradle-plugin-template::elephant:一个模板,可让您在几秒钟内开始使用自定义Gradle插件+ Kotlin
Android-Kotlin-MVI-CleanArchitecture:Android + Kotlin +模块化+ Gradle Depedency管理+用Kotlin DSL编写的Gradle +自定义Gradle插件+ MVVM + MVI +清洁架构+存储库模式+协程+流程+ Koin + Retrofit2 + ROOM + ...
GradlePluginDemo 自定义Gradle插件
gradle-plugin-bootstrap:创建自定义Gradle插件所需的全部
AopAutoTryCatch 使用Javassist(一个自定义的... Javassist自定义Gradle插件转变二,如何使用使用注解@AutoTryCatch来捕获异常支持catch所有异常 /** * 无崩溃,会catch所有Exception */ @AutoTryCatch public void ca
最近在研究一些android中使用AOP的方式进行埋点的技术,其中很多都使用到了在编译时进行代码处理,大多数都是使用了自定义的gradle插件技术,所以一直比较好奇这个gradle插件是如何实现,经过学习和实践之后特此做一...
该插件将是一个自定义的gradle插件,它将使工作流程更加简单。 当然,脚本/插件旨在与java和android project一起使用。项目结构示范项目描述应用程式演示应用模块的lib-android 演示android库模块lib-android-sub ...
自定义Gradle插件demo。博客链接:http://blog.csdn.net/u013005791/article/details/79420207
三行情书 ...才可运行,因为使用了自定义gradle插件 项目结构说明: ThreeLine --app --src --aop --api --db --bean --serve --data --music --article --net --base --bean --ui --main
自定义Gradle插件此博客文章的示例应用程序: :
关于gradle自定义插件的生成的三种方式结合我的博客的详细描述使用
【Android Gradle 插件】将自定义 Gradle 插件上传到自建 Maven 仓库 ⑤ ( 使用 Sonatype Nexus 搭建 Maven 仓库 ) https://hanshuliang.blog.csdn.net/article/details/127385094 博客资源