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插件项目主要也是用在当前项目中,不能被外部的项目引用,它的创建有一套固定的流程,步骤如下:
- 在项目根目录下新建一个
buildSrc
目录,然后点击Android Studio的make按钮编译项目,IDE会自动在buildSrc目录下创建一些文件,如下图所示:
- 在
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
}
- 在
buildSrc
目录下创建src
目录,并在src
目录下分别创建main/java
和main/resources
目录 - 在
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...");
}
}
- 配置插件。要配置插件,需要在
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插件的开发了,开发步骤如下:
-
在Android项目上右键,选择
New
-Module
-Java or Kotlin Library
创建一个Java library,这里我们取名为plugin -
在该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仓库的地址 } } }
-
同第二种实现gradle插件的方式一样,在library的根目录下创建
src
目录,并在src
目录下分别创建main/java
main/resources
目录 -
在
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..."); } }
-
在
src/main/resources/META-INF/gradle-plugins
目录下创建文件,文件名为com.example.plugin.properties
,文件内容为:implementation-class=com.example.plugin.MyPlugin
-
通过Gradle sync项目,在AndroidStudio右侧的Gradle视图中,我们会看到该插件对应的任务,如下图所示:
我们双击Tasks - upload - uploadArchives任务,AS会自动将该插件打包并上传到maven仓库,注意在上面的第2步中,我们设置了maven仓库为本地地址./repo
,则任务执行成功后,会在library的根目录下生成repo目录,如下图所示:
为了引用该插件,我们需要在Android项目中做如下配置:
-
在项目根目录的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 } }
-
在app module的build.gradle文件头部引用该插件:
apply plugin: 'com.example.plugin'
然后编译项目,可以看到该插件输出的日志信息。
源码
本篇博文的源码可以在这里下载:
https://github.com/yubo725/gradle-plugin-demo
参考
以上是关于Android Gradle插件开发基础的主要内容,如果未能解决你的问题,请参考以下文章
Android Gradle 插件Gradle 基础配置 ② ( Gradle 空白项目构建示例演示 )