Android Gradle插件开发基础

Posted yubo_725

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Gradle插件开发基础相关的知识,希望对你有一定的参考价值。

什么是Gradle

在Gradle官方文档上是这么描述的:

Gradle 是一种开源构建自动化工具,其设计足够灵活,几乎可以构建任何类型的软件。

Gradle 允许您构建任何软件,因为它对您尝试构建的内容或应该如何完成几乎没有做出任何假设。最显着的限制是依赖管理目前只支持 Maven 和 Ivy 兼容的存储库和文件系统。

Gradle 将其构建建模为任务(工作单元)的有向无环图 (DAG)。这意味着构建本质上是配置一组任务并将它们连接在一起——基于它们的依赖——以创建该 DAG。创建任务图后,Gradle 会确定哪些任务需要以何种顺序运行,然后继续执行它们。

Gradle插件

android开发中,我们最常见的是build.gradle中的apply plugin: 'com.android.application',这个apply plugin: 'com.android.application'便是Android提供的用于构建APK的一个gradle插件。

Gradle 插件打包了可重用的构建逻辑片段,可以在许多不同的项目和构建中使用。Gradle 允许您实现自己的插件,因此您可以重用您的构建逻辑,并与他人共享。

您可以使用您喜欢的任何语言实现 Gradle 插件,前提是该实现最终被编译为 JVM 字节码。在我们的示例中,我们将使用 Java 作为独立插件项目的实现语言,并在 buildscript 插件示例中使用 Groovy 或 Kotlin。一般来说,使用静态类型的 Java 或 Kotlin 实现的插件比使用 Groovy 实现的插件性能更好。

Gradle插件编写方式

一般有如下三种方式编写Gradle插件:

编写方式说明
构建脚本您可以直接在构建脚本中包含插件的源代码。这样做的好处是插件会自动编译并包含在构建脚本的类路径中,而您无需执行任何操作。但是,该插件在构建脚本之外不可见,因此您不能在定义它的构建脚本之外重用该插件。
buildSrc 项目您可以将插件的源代码放在rootProjectDir/buildSrc/src/main/java目录中(rootProjectDir/buildSrc/src/main/groovy或rootProjectDir/buildSrc/src/main/kotlin取决于您喜欢的语言)。Gradle 将负责编译和测试插件,并使其在构建脚本的类路径上可用。该插件对构建使用的每个构建脚本都是可见的。但是,它在构建之外不可见,因此您不能在定义它的构建之外重用插件。
独立项目您可以为您的插件创建一个单独的项目。该项目生成并发布一个 JAR,然后您可以在多个构建中使用它并与他人共享。通常,这个 JAR 可能包含一些插件,或者将几个相关的任务类捆绑到一个库中。或者两者的某种组合。

为了方便,本篇中全部使用Java来开发Gradle插件,你也可以用Groovy或者Kotlin来开发。

在开始下面的流程前,我们先创建一个空的Android项目。

下面分别用一个例子来说明在Android开发中三种编写Gradle插件的流程。

构建脚本

这种方式是最简单的,一般用于比较简单的逻辑,只需要修改build.gradle文件即可。
我们直接在新创建的Android项目的app/build.gradle文件末尾添加如下代码:

class MyPluginExtension {
	// 为插件扩展定义一个字符串类型的变量
    String message = "Hello this is my custom plugin..."
}

// gradle自定义的插件必须继承Plugin接口
class GreetingPlugin implements Plugin<Project> {

    @Override
    void apply(Project project) {
    	// 创建插件扩展,greeting为插件扩展的名称,可以在gradle文件其他地方使用
        def extension = project.extensions.create('greeting', MyPluginExtension)

        project.task('hello') {
            doLast {
            	// 插件的任务就是打印message信息
                println extension.message
            }
        }
    }
}

// 使用这个自定义的插件
apply plugin: GreetingPlugin

然后sync项目,在AndroidStudio右侧的Gradle视图里,可以发现Tasks/others下面出现了一个hello任务,我们双击该任务执行它,会发现控制台中出现如下信息:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这表明我们编写的插件代码正常工作。

其实为了让插件代码跟app/build.gradle文件中的其他配置互相独立,可以把插件代码单独用一个gradle文件来编写,比如你可以在app/build.gradle同级的目录下新建一个myplugin.gradle文件,然后将上面的插件代码全部写到其中,再在app/build.gradle文件中引用myplugin.gradle文件即可,app/build.gradle中引用的代码如下:

apply plugin: 'com.android.application'

// 这一行可以引用外部的gradle文件
apply from: './myplugin.gradle'

android {
	...
}

// 通过这种配置方式,修改自定义插件中配置的message的值
greeting {
    message = "new message..."
}

buildSrc项目

buildSrc编写gradle插件项目主要也是用在当前项目中,不能被外部的项目引用,它的创建有一套固定的流程,步骤如下:

  1. 在项目根目录下新建一个buildSrc目录,然后点击Android Studio的make按钮编译项目,IDE会自动在buildSrc目录下创建一些文件,如下图所示:
    在这里插入图片描述
  2. buildSrc目录下新建build.gradle文件并加入如下代码:
apply plugin: 'java-library'

sourceSets {
    main {
        java{
            srcDir 'src/main/java'
        }
        resources {
            srcDir 'src/main/resources'
        }
    }
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}
  1. buildSrc目录下创建src目录,并在src目录下分别创建main/javamain/resources目录
  2. src/main/java目录下编写插件代码,比如这里我们创建一个简单的插件类,代码如下:
package com.test.myplugin;

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

public class MyPlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
        System.out.println("Hello from MyPlugin...");
    }
}
  1. 配置插件。要配置插件,需要在src/main/resources/目录下再创建META-INF/gradle-plugins目录,并在该目录中添加一个文件,文件的命名需要根据插件所在类的名称来,比如上面我们编写的插件类在com.test.myplugin包下面,那么就需要创建一个com.test.myplugin.properties文件,该文件内容如下:
implementation-class=com.test.myplugin.MyPlugin

项目整体的结构如下图:
在这里插入图片描述
以上所有步骤都做完之后,即可在app module中引用插件了,引用插件的方法是直接在app/build.gradle文件头部通过apply plugin: 'com.test.myplugin’的方式即可,然后我们通过AndroidStudio make图标编译项目,在输出的日志中会发现该插件打印的消息,如下图所示:
在这里插入图片描述

独立项目

如果要使我们编写的gradle插件被外部项目所引用,比如每个AndroidStudio创建的项目都依赖了’com.android.application’这个插件,那么我们就需要使用这种独立项目来完成gradle插件的开发了,开发步骤如下:

  1. 在Android项目上右键,选择New - Module - Java or Kotlin Library创建一个Java library,这里我们取名为plugin

  2. 在该library module的build.gradle文件中编写如下代码:

    apply plugin: 'groovy'
    apply plugin: 'maven'
    
    repositories {
        mavenLocal()
    }
    
    dependencies {
        implementation gradleApi()
    }
    
    //publish to local directory
    group "com.example.plugin"
    version "1.0.0"
    
    uploadArchives{ //当前项目可以发布到本地文件夹中
        repositories {
            mavenDeployer {
                repository(url: uri('./repo')) //定义本地maven仓库的地址
            }
        }
    }
    
  3. 同第二种实现gradle插件的方式一样,在library的根目录下创建src目录,并在src目录下分别创建main/java main/resources目录

  4. src/main/java目录下编写插件代码,这里测试用的代码如下:

    package com.example.plugin;
    
    import org.gradle.api.Plugin;
    import org.gradle.api.Project;
    
    public class MyPlugin implements Plugin<Project> {
    
        @Override
        public void apply(Project project) {
            System.out.println("Hello this is a single gradle plugin...");
        }
    }
    
  5. src/main/resources/META-INF/gradle-plugins目录下创建文件,文件名为com.example.plugin.properties,文件内容为:

    implementation-class=com.example.plugin.MyPlugin
    
  6. 通过Gradle sync项目,在AndroidStudio右侧的Gradle视图中,我们会看到该插件对应的任务,如下图所示:
    在这里插入图片描述
    我们双击Tasks - upload - uploadArchives任务,AS会自动将该插件打包并上传到maven仓库,注意在上面的第2步中,我们设置了maven仓库为本地地址./repo,则任务执行成功后,会在library的根目录下生成repo目录,如下图所示:
    在这里插入图片描述

为了引用该插件,我们需要在Android项目中做如下配置:

  1. 在项目根目录的build.gradle文件中添加如下配置

    buildscript {
        repositories {
            google()
            mavenCentral()
            maven { // (1) 这里的地址填你本机的repo目录地址
                url '/Users/xxx/AndroidStudioProjects/TestGradlePlugin/plugin/repo'
            }
        }
        dependencies {
            classpath "com.android.tools.build:gradle:4.2.2"
            classpath "com.example.plugin:plugin:1.0.0" // (2)这个版本号为之前上传时配置的版本号
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
  2. 在app module的build.gradle文件头部引用该插件:

    apply plugin: 'com.example.plugin'
    

    然后编译项目,可以看到该插件输出的日志信息。

源码

本篇博文的源码可以在这里下载:
https://github.com/yubo725/gradle-plugin-demo

参考

Gradle官方文档
Gradle插件开发指南

以上是关于Android Gradle插件开发基础的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle插件开发基础

Android Gradle 插件Gradle 基础配置 ② ( Gradle 空白项目构建示例演示 )

如何使用Android Studio 开发Gradle插件

入坑 Android Gradle 插件开发

拥抱 Android Studio 之五:Gradle 插件开发

Android Gradle 插件基础