目录
  1. 1. Gradle简介
    1. 1.1. 什么是Gradle
    2. 1.2. Gradle的基本组件
  2. 2. Plugin介绍
    1. 2.1. Plugin是什么
    2. 2.2. Plugin的使用
    3. 2.3. 自定义Plugin
    4. 2.4. 总结
做了这么久的Android,Gradle的plugin你知道吗?

做Android的你一定对build.gradle这个文件很熟悉,那么你也一定见过这个文件中的这句代码apply plugin: 'com.android.application',但是你知道这句代码的作用吗?

Gradle简介

什么是Gradle

  在开始讲plugin是什么之前,我觉得有必要先介绍一下Gradle是什么。其实,可以从两个方面来认识Gradle:

  1. Gradle是一个构建工具,可以用来编译,打包app、管理三方的依赖等。
  2. Gradle是一个编程框架,可以更迅速和方便地构建完整的解决编程问题的方案。

当你把 Gradle 当工具看的时候,我们只想着如何用好它。会写、写好配置脚本就 行,当你把它当做编程框架看的时候,你可能需要学习很多更深入的内容。在我们平时的开发中,一般就是把Gradle作为一个构建工具,但是一些高级的技术,如编译时修改字节码,又需要把Gradle当做一个编程框架来使用。所以说,Gradle到底是什么则要看我们的需求是什么了。

Gradle的基本组件

  Gradle 中,每一个待编译的工程都叫一个 Project。每一个 Project 在构建的时候都包含 一系列的 Task。比如一个 Android APK 的编译可能包含:Java 源码编译 Task、资源编译Task、JNI 编译 Task、lint 检查 Task、打包生成 APK 的 Task、签名 Task 等。

  一个 Project 到底包含多少个 Task,其实是由编译脚本指定的插件决定。插件是什么呢? 插件就是用来定义 Task,并具体执行这些 Task 的东西。

  刚才说了,Gradle 是一个框架,作为框架,它负责定义流程和规则。而具体的编译工作则是通过插件的方式来完成的。比如编译 Java 有 Java 插件,编译 Groovy 有 Groovy 插件,编译 Android App 有 Android App 插件,编译 Android Library 有 Android Library 插件。

  总结一下,Gradle 中每一个待编译的工程都是一个 Project,一般一个Project对应一个build.gradle文件,一个具体的编译过程是由一个一个的 Task 来定义和执行的,Task又由编译脚本指定的插件决定。这里的插件就是本文要讲的重点,就是Gradle的plugin。

Plugin介绍

Plugin是什么

  前文已经说了每个 Project 在构建的时候都包含 一系列的 Task,这些Task就是由Plugin来编写的。所以,我的理解就是Plugin是用来编写和定义一些Task的。

Plugin的使用

  那么,怎么使用plugin的呢?可以在gradle文件中通过apply函数来应用plugin,可以看下apply函数,如下

常用的是apply(Map<String,?> options)这种形式,这个方法的详细说明如下

可以看出options的有效值有3个:

  • from:用来引入其他的脚本
  • plugin:用来使用定义好的插件
  • to:(不常用,不知道有什么作用,知道的可以告知一下)

在Android项目中新建一个app Moudle的时候,app Moulde中的build.gradle文件的第一句是

1
apply plugin: 'com.android.application'

新建一个library Moudle的时候,library Moulde中的build.gradle文件的第一句是

1
apply plugin: 'com.android.library'

结合上面的apply函数,可以知道

1
apply plugin: 'xxx'//xxx是定义plugin时的properties文件的名称

语句是在Gradle中使用插件。现在来详细的分析下apply plugin: 'com.android.application'这个语句,前面说了com.android.application是定义plugin时的properties文件的名称,那么这个文件在哪里呢?看下图

但是呢!只有apply plugin: 'xxx'是不行的,这样会报错,说是找不到id为xxx的插件,可以共享的Plugin是以jar包的形式存在的,所以,要引用Plugin,需要先指定jar包的路径和版本,指定的方式如下图

红色的框框是我自己自定义的插件的路径,绿色的框是Android项目自己引入的插件的路径,就是前面一幅图,gradle-3.5.3的路径。好了,已经知道怎么使用plugin了,下面就说下怎么自定义自己的plugin。

自定义Plugin

  自定义Gradle插件有三种方式,具体内容可以查看官方文档,本文选择常用的一种方式,就是定义可共享的插件的方式来讲解。

  在AndroidStudio中新建一个Module,Library和App的Module都行,然后删除无用的文件夹和文件,使最后的文件结构如下图所示

这里主要的有三个文件,build.gradle、com.demo.plugin.properties和CustomPlugin。看下build.gradle文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
apply plugin: 'kotlin'
apply plugin: 'maven'
//设置源码路径
sourceSets {
main {
kotlin {
srcDir '../systrace-gradle-plugin/src/main/kotlin'
}

resources {
srcDir '../systrace-gradle-plugin/src/main/resources'
}
}
}

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation gradleApi()
implementation localGroovy()
//Android编译的大部分gradle源码,比如上面讲到的TaskManager
implementation 'com.android.tools.build:gradle:3.5.3'
//这个依赖里其实主要存了transform的依赖,注意,这个依赖不同于上面的gradleApi()
implementation 'com.android.tools.build:gradle-api:3.5.3'
//ASM相关
implementation 'org.ow2.asm:asm:6.0'
implementation 'org.ow2.asm:asm-util:6.0'
implementation 'org.ow2.asm:asm-commons:6.0'
}
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = project.group
pom.artifactId = project.name
pom.version = project.version
repository(url: uri('/Users/work/Android/repos')) //文件发布目录(相对当前 build.gradle 的路径)
}
}
}

文件的内容比较简单,就是添加一些配置项。再看下com.demo.plugin.properties这个文件,代码如下

1
implementation-class=com.demo.plugindemo.CustomPlugin

代码就一句,作用就是定义插件的入口类,最后看下CustomPlugin文件,内容如下

1
2
3
4
5
6
7
8
class CustomPlugin:Plugin<Project> {
override fun apply(target: Project) {
print("===========")
target.afterEvaluate {//可以在这里获取gradle中的属性
print("++++++++++")
}
}
}

当我们在项目中使用这个插件的时候,就会调用apply函数中的内容,我们可以在这个函数中完成自己想要的功能,如处理java编译后的字节码(后面的文章会有此内容)等。

  写好插件的内容后,下面就是将写好的插件导出使用了,上面的gradle中有一个函数,作用是导出插件,代码如下

1
2
3
4
5
6
7
8
9
10
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = project.group
pom.artifactId = project.name
pom.version = project.version
repository(url: uri('/Users/work/Android/repos')) //文件发布目录(相对当前 build.gradle 的路径)
}
}
}

只要双击图中的命令就可以导出了

最后生成的文件如下图。

关于怎么使用Plugin前面的文章已经说了,这里就不在赘述。

总结

  本文主要讲解了,Gradle是什么,Gradle的基本组件,Plugin是什么,怎么用Plugin已经如何自定义Plugin,相信大家阅读后一定对build.gradle中的apply plugin: 'xxx'有了更清除的认识。本文只是讲解了plugin是什么以及它的作用,但是并没有说为什么自定义plugin,这部分的内容将会留在下篇的文章中进行讲解,敬请期待。

文章作者: wizardev
文章链接: http://pi.wizardev.com:88/blog/%E5%81%9A%E4%BA%86%E8%BF%99%E4%B9%88%E4%B9%85%E7%9A%84Android%EF%BC%8CGradle%E7%9A%84plugin%E4%BD%A0%E7%9F%A5%E9%81%93%E5%90%97%EF%BC%9F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 wizardev的博客

评论