Android gradle-plugin 相关

一、概念

Gradle Plugin 的作用是什么?
  • 模块化构建脚本的功能
  • 公共的功能可以抽取出来成为插件,可以供多个 Module (build.gradle)使用,增加复用性。

在 Android Studio 中gradle作为主要的构建工具,其核心工作任务在于执行一系列的Task。而 plugin 在 gradle 构建过程又扮演着举足轻重的角色,有时为了完成相应的构建任务必须通过引入相应的插件来辅助,这些插件中定义了构建Project需要的一系列Task,并且负责执行相应的Task,比如构建android应用 'com.android.application',构建 Library 的 'com.android.library'。 除了系统自带的插件外,有时候我们也需要开发属于我们自己的plugin,比如热修复,插件化开发中基本上都有可能会去自定义插件。

二、定义gradle plugin 的几种方式

自定义插件主要有三种方式

1、直接在 module 的 build.gradle 中开发
2、创建当前项目使用的插件
3、创建通用的插件,发布到maven

2.1 build.gradle 中开发

我们在自己module 的 build.gradle 中编写代码

apply plugin: 'com.android.application'

apply plugin: HelloPlugin

class HelloPlugin implements Plugin{
    @Override
    void apply(Project project) {
        project.task('testPlugin')  {
            println 'hello, plugin!'
        }
    }
}

上面我们定义了一个名为HelloPlugin的插件,然后其中定义了testPlugin 的task,下面我们测试看看效果,在Terminal 中执行 ./graadlew testPlugin 命令。

Android gradle-plugin 相关_第1张图片
执行结果

当然除了可以定义 task,还有很多其他用处,这里以 task 为例,看如何定义Gradle Plugin

2.2 创建当前项目使用的插件

1、新建一个类型为Java Library的Module,名字为buildSrc,注意这个名字只能为buildSrc,如果不是这个名称,这里是无法apply包名的,会提示找不到。buildSrc这个module是预留的module,会从这个module下搜寻gradle plugin。(或者直接在项目下新建一个 buildSrc 的文件夹,在添加build.gradle文件 和 src/main 目录)

2、除build.gradle,src/main外,其他文件都删除掉,删除main下的文件。

3、在src/main下新建groovy文件夹。

4、在groovy文件夹下新建package,包名随便取,例如com.daddyno1.buildsrc

5、在package下创建.groovy的文件,例如MyPlugin.groovy。

6、在跟 groovy 平级创建目录:resources/META-INF/gradle-plugins

7、在resources/META-INF/gradle-plugins下创建 ***.properties。注意:***就是以后 apply plugin:'***'的标识。本例中用:com.daddyno1.properties

8、编辑 com.daddyno1.properties 内容,标识真正的Plugin实现类,如:implementation-class=com.daddyno1.buildsrc.MyPlugin

9、修改 build.gradle文件:

apply plugin: 'groovy'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
   //Creates a dependency on the Groovy that is distributed with the current version of Gradle.
    implementation localGroovy()

    //Creates a dependency on the API of the current version of Gradle.
    implementation gradleApi()
}

sourceCompatibility = "8"
targetCompatibility = "8"

整体项目目录如下:

Android gradle-plugin 相关_第2张图片

MyPlugin.groovy 如下:

package com.daddyno1.buildsrc

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

class MyPlugin implements Plugin{

    @Override
    void apply(Project project) {
        println "========================= start ======================="
        println "========================= end ======================="
    }
}

在需要用到 pluginmodule 中使用 apply plugin: 'com.daddyno1'

编译一下看效果:

Android gradle-plugin 相关_第3张图片

2.3 创建通用的插件,发布到maven

略,具体参考:https://www.jianshu.com/p/6ec6b06cb5d6 。 其实跟第二种差别不大,就是使用了 maven plugin 把代码发布到仓库。

三、插件扩展 Extension

什么是扩展插件?

扩展插件 Extension 就是用于 Plugin 与 Project 通讯用的。

我们可以在 build.gradle 中通过配置 Extension 相关属性,然后将这个 Extension 这个对象传递给我们自定义的Plugin。 更详细的举例参考(https://www.jianshu.com/p/ffd6153ace1d)

四、通过学习 hugo (https://github.com/JakeWharton/hugo)能够获得什么

1、通过面向切面的方式(AspectJ)实现对方法的性能检测。
2、定义Android Gradle Plugin,更好的理解 Plugin的作用 (公共的功能可以抽取出来成为插件,可以供多个 Module (build.gradle)使用,增加复用性。
3、Plugin Extension 的使用

参考:
https://www.jianshu.com/p/ffd6153ace1d
https://www.jianshu.com/p/6ec6b06cb5d6

你可能感兴趣的:(Android gradle-plugin 相关)