在Android Studio中自定义Gradle插件

创建Gradle Module

Android Studio中是没有新建类似Gradle Plugin这样的选项的,那我们如何在Android Studio中编写Gradle插件,并打包出来呢?

(1) 首先,新建一个Android Project

(2) 然后再新建一个Module,名称为myplugin,这个Module用于开发Gradle插件,同样Module里面没有Gradle Plugin选项,但是我们只是需要一个“容器”来容纳我们写的插件,因此,可以随便选择一个Module类型(如Phone&Tablet ModuleAndroid Librarty),因为接下来一步我们是将里面的大部分内容删除,所以选择哪个类型的Module不重要

(3) 将Module里面的内容删除,只保留build.gradle文件和src/main目录。由于gradle是基于groovy,因此,我们开发的Gradle插件相当于一个groovy项目。所以需要在main目录下新建groovy目录

(4) groovy又是基于Java,因此,接下来创建groovy的过程跟创建java很类似。在groovy新建包名,如:cn.appblog.plugin,然后在该包下新建groovy文件,通过new -> file -> MyPlugin.groovy来新建名为MyPlugin的groovy文件

(5) 为了让我们的groovy类申明为gradle的插件,新建的groovy需要实现org.gradle.api.Plugin接口。如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
package cn.appblog.plugin

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

public class MyPlugin implements Plugin<Project> {

void apply(Project project) {
System.out.println("========================");
System.out.println("Hello gradle plugin! Powered by AppBlog.CN");
System.out.println("========================");
}
}

因为我本人对groovy也不是特别熟悉,所以我尽可能的用Java语言,使用System.out.println而不是用groovy的pintln "",我们的代码里面啥也没做,就打印信息。

(6) 现在,我们已经定义好了自己的Gradle插件类,接下来就是告诉Gradle,哪一个是我们自定义的插件类,因此,需要在main目录下新建resources目录,然后在resources目录里面再新建META-INF目录,再在META-INF里面新建gradle-plugins目录。最后在gradle-plugins目录里面新建properties文件,注意这个文件的命名,你可以随意取名,但是后面使用这个插件的时候,会用到这个名字。比如,你取名为cn.appblog.gradle.properties,而在其他build.gradle文件中使用自定义的插件时候则需写成:

1
apply plugin: 'cn.appblog.gradle'

然后在cn.appblog.gradle.properties文件里面指明自定义的插件类

1
implementation-class=cn.appblog.plugin.MyPlugin

完整的目录结构应该如下:

1
2
3
4
5
6
7
8
9
10
11
myplugin
src
main
groovy
cn.appblog.plugin
MyPlugin.groovy
resources
META-INF
gradle-plugins
cn.appblog.gradle.properties
build.gradle

(7) 因为我们要用到groovy以及后面打包要用到maven,所以在我们自定义的Module下的build.gradle需要添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
//gradle sdk
implementation gradleApi()
//groovy sdk
implementation localGroovy()
}

repositories {
mavenCentral()
}

打包到本地Maven

前面我们已经自定义好了插件,接下来就是要打包到Maven仓库,可以选择打包到本地,或者是远程服务器中。在我们自定义Module目录下的build.gradle添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//group和version在后面使用自定义插件的时候会用到
group='cn.appblog.plugin'
version='1.0.0'

uploadArchives {
repositories {
mavenDeployer {
//提交到远程服务器:
// repository(url: "http://www.xxx.com/repos") {
// authentication(userName: "admin", password: "admin")
// }
//本地的Maven地址设置为D:/repos
repository(url: uri('D:/repos'))
}
}
}

其中,group和version后面会用到,我们后面再讲。虽然我们已经定义好了打包地址以及打包相关配置,但是还需要我们让这个打包task执行。点击执行Android Studio右侧的gradle工具:

1
:myplugin -> Tasks -> upload -> uploadArchives

可以看到有uploadArchives这个Task,双击uploadArchives就会执行打包上传!执行完成后,可以去Maven本地仓库查看一下:

1
2
3
4
5
6
7
D:\repos\cn\appblog\plugin\myplugin\1.0.0
myplugin-1.0.0.jar
myplugin-1.0.0.jar.md5
myplugin-1.0.0.jar.sha1
myplugin-1.0.0.pom
myplugin-1.0.0.pom.md5
myplugin-1.0.0.pom.sha1

其中,cn/appblog/plugin这几层目录是由我们的group指定,myplugin是模块的名称,1.0.0是版本号(version指定)

使用自定义的插件

接下来就是使用自定义的插件,一般就是在app这个模块中使用自定义插件,因此在工程目录或App Module的build.gradle文件中,需要指定本地Maven地址、自定义插件的名称以及依赖包名。简而言之,就是在app这个Module的build.gradle文件中后面附加如下代码:

App Module级build.gradle

1
2
//cn.appblog.gradle为resources/META-INF/gradle-plugins下的properties文件名称
apply plugin: 'cn.appblog.gradle'

工程级build.gradle

1
2
3
4
5
6
7
8
9
10
11
buildscript {
repositories {
maven { //本地Maven仓库地址
url uri('D:/repos')
}
}
dependencies {
//格式为 -> group:module:version
classpath 'cn.appblog.plugin:myplugin:1.0.0'
}
}

接下来就是看看效果啦!先clean project(很重要!),然后再make project,从messages窗口打印如下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> Configure project :app
========================
Hello gradle plugin! Powered by AppBlog.CN
========================

> Task :myplugin:compileJava NO-SOURCE
> Task :myplugin:compileGroovy UP-TO-DATE
> Task :myplugin:processResources UP-TO-DATE
> Task :myplugin:classes UP-TO-DATE
> Task :myplugin:jar UP-TO-DATE
> Task :myplugin:assemble UP-TO-DATE
...
> Task :app:packageDebug UP-TO-DATE
> Task :app:assembleDebug UP-TO-DATE

BUILD SUCCESSFUL in 1s

自定义的gradle插件运行成功

开发只针对当前项目的Gradle插件

前面我们讲了如何自定义gradle插件并且打包出去,可能步骤比较多。有时候,可能并不需要打包出去,只是在这一个项目中使用而已,那么无需打包这个过程。

只是针对当前项目开发的Gradle插件相对较简单。步骤之前所提到的很类似,只是有几点需要注意:

新建的Module名称必须为BuildSrc/buildSrc(大小写随意)
无需resources目录

目录结构如下所示:

1
2
3
4
5
6
7
buildSrc
src
main
groovy
cn.appblog.plugin
NativePlugin.groovy
build.gradle

其中,build.gradle内容为:

1
2
3
4
5
6
7
8
9
10
11
12
apply plugin: 'groovy'

dependencies {
//gradle sdk
implementation gradleApi()
//groovy sdk
implementation localGroovy()
}

repositories {
jcenter()
}

NativePlugin.groovy内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
package cn.appblog.plugin

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

public class NativePlugin implements Plugin<Project> {

void apply(Project project) {
System.out.println("========================");
System.out.println("这是本地插件!");
System.out.println("========================");
}
}

在app这个Module中如何使用呢?直接在app的build.gradle下加入

1
apply plugin: cn.appblog.plugin.NativePlugin  //注意不要单引号

clean project一下,再make project,messages窗口信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> Configure project :app
========================
Hello gradle plugin! Powered by AppBlog.CN
========================
========================
这是本地插件!
========================

> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:checkDebugManifest UP-TO-DATE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:prepareLintJar UP-TO-DATE
> Task :app:prepareLintJarForPublish UP-TO-DATE
> Task :app:generateDebugSources UP-TO-DATE

BUILD SUCCESSFUL in 39s

由于之前我们自定义的插件我没有在app的build.gradle中删除,所以Hello gradle plugin! Powered by AppBlog.CN这条信息还会打印。

本文转载至:https://blog.csdn.net/huachao1001/article/details/51810328

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :