Brooks

珍惜生命中的每一次冲动

0%

Android Gradle Plugin 入门

Android Gradle Plugin 简称 AGP,目前不少公司使用,来完成一些自动化功能。利用提供的 Transform API 来完成字节码插桩。

Gradle插件开发

方式 说明
build script 脚本 把插件 写在 build.gradle文件中,一般用于简单的逻辑,只对该build.gradle可见
buildSrc 目录 将插件源码放在目录buildSrc/src/main/ 中,只对该项目可见
独立项目 独立的java项目/模块,可以将文件包发布到仓库(Jcenter、MavenCenter),方便其他项目引入使用

方式一:

实例:获取git-commit,在app的build.gradle文件中定义

1
2
3
4
5
6
7
8
9
10
11
12
13
//获取 short git-commit  i
def gitSha() {
try {
String gitRev = 'git rev-parse --short HEAD'.execute(null,project.rootDir)
.text.trim()
if (gitRev == null) {
throw new GradleException("can't get git rev, you should'")
}
return gitRev
} catch (Exception e) {
throw new GradleException("can't get git rev, you should add ...")
}
}

方式二:

1、在项目的根目录下创建buildSrc目录,这个名字不能错,必须是buildSrc。创建完之后,rebuild一下工程,会在buildSrc下自动生成一些目录。(网上截图)

在这里插入图片描述

2、在buildSrc目录下创建build.gradle文件,并编写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//use java library
apply plugin: 'java-library'

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

配置说明:

1
2
3
4
5
6
7
8
9
apply plugin: 'java-library' //使用java来编写插件就引入java库
apply plugin: 'groovy' //使用groovy来编写插件就引入groovy库

//源码配置
srcDir 'src/main/java' //如果使用java就配置
srcDir 'src/main/groovy'//如果使用groovy就配置

//资源配置
srcDir 'src/main/resources'

3、在buildSrc目录下创建src/main/java目录,之后再创建插件的包名:com.learn.plugin,编写代码

1
2
3
4
5
6
7
8
9
10
11
package com.learn.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(">>> 自定义插件 MyPlugin");
}
}

4、在buildSrc目录下创建src/main/resources目录,在resources目录下创建目录META-INF/gradle-plugins目录,最后在该目录下编写插件属性文件com.learn.plugin.properties文件

1
2
3
4
5
6
7
8
/**
*属性文件的命名规则是:
*名称是创建的插件的包名,然后以.properties后缀结尾
*文件中的implementation-class用来指定插件实现类。
*文件名就是插件名,即在宿主中使用插件时的apply plugin 后的参数
*/

implementation-class=com.learn.plugin.MyPlugin

5、使用插件, 在app模块下的build.gradle中引入插件:

apply plugin: 'com.learn.plugin,这里引入的插件名就是插件的包名。

1
2
3
4
apply plugin: 'com.android.application'
apply plugin: 'com.learn.plugin' //引用自定义的插件

....

6、测试插件
点击Android studio右上角的 sync按钮或者build项目,观察输入台:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> Task :buildSrc:compileJava UP-TO-DATE
> Task :buildSrc:compileGroovy NO-SOURCE
> Task :buildSrc:processResources UP-TO-DATE
> Task :buildSrc:classes UP-TO-DATE
> Task :buildSrc:jar UP-TO-DATE
> Task :buildSrc:assemble UP-TO-DATE
> Task :buildSrc:compileTestJava NO-SOURCE
> Task :buildSrc:compileTestGroovy NO-SOURCE
> Task :buildSrc:processTestResources NO-SOURCE
> Task :buildSrc:check UP-TO-DATE
> Task :buildSrc:build UP-TO-DATE

> Configure project :app
>>> 自定义插件 MyPlugin==========

方式三:

在当前项目下,创建一个module选中 Java Library,命名为 Plugin(module名称随意)

1、在module的src/main/java下创建 自己的包名,以及插件类

image-20210804230453329

2、添加gradle Sdk的依赖,因为要使用gradle的API

1
2
3
4
5
6
7
8
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation gradleApi() //依赖 gradle sdk

//依赖Android的gradle插件,使用他的api获取编译完成的apk信息
implementation "com.android.tools.build:gradle:3.5.4"

}

3、在上面创建的包下,创建java类 编写插件代码。

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
/**
* 定义插件
*/
public class JiaguPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
//创建 插件扩展,用来配置一些信息
ProcessLiveExt liveExt = project.getExtensions().create("live", ProcessLiveExt.class);

//在gradle分析完build.gradle文件之后,回调。 此时才能获取到配置的信息
project.afterEvaluate(new Action<Project>() {
@Override
public void execute(Project project) {
String username = jiaguExt.getUsername();
String password = jiaguExt.getPassword();

//创建任务名,再侧边栏gradle下会显示出来.
//当点击gralde里的processLive任务时,会执行ProcessLiveTask里的代码
project.getTasks().create("processLive" , ProcessLiveTask.class, "processLive", liveExt);
}
}
}

//上面的字符串“jiagu”就是在 build.gralde文件中,定义的节点配置名
live {
username 'hanyaping'
password '372186554'
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ProcessLiveTask extends DefaultTask {
@Inject
public ProcessLiveTask(String tag, ProcessLiveExt ext) {
setGroup("brooks");//创建目录,把自定义任务放到同一个分组中
System.out.println("tag" + tag + " " + ext);
}

//点击侧边栏gradle里的processLive任务会执行这个方法 【TaskAction注解,就是调用入口】
@TaskAction
public void action() {
getProject().exec(new Action<ExecSpec>() {
@Override
public void execute(ExecSpec execSpec) {
//执行 jar命令
System.out.println("===========开始Live=================");
execSpec.commandLine("bash", "-c", "ls ./");
}
});
}
}

后续和 方式二 类同。

感谢:

https://blog.csdn.net/u010982507/article/details/104875115

欢迎关注我的其它发布渠道