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
| 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
| apply plugin: 'java-library'
sourceSets { main{
java{ srcDir 'src/main/java' } resources { srcDir 'src/main/resources' } } }
|
配置说明:
1 2 3 4 5 6 7 8 9
| apply plugin: 'java-library' apply plugin: 'groovy'
srcDir 'src/main/java' srcDir 'src/main/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下创建 自己的包名,以及插件类
2、添加gradle Sdk的依赖,因为要使用gradle的API
1 2 3 4 5 6 7 8
| dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation gradleApi() 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); project.afterEvaluate(new Action<Project>() { @Override public void execute(Project project) { String username = jiaguExt.getUsername(); String password = jiaguExt.getPassword(); project.getTasks().create("processLive" , ProcessLiveTask.class, "processLive", liveExt); } } }
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); } @TaskAction public void action() { getProject().exec(new Action<ExecSpec>() { @Override public void execute(ExecSpec execSpec) { System.out.println("===========开始Live================="); execSpec.commandLine("bash", "-c", "ls ./"); } }); } }
|
后续和 方式二 类同。
感谢:
https://blog.csdn.net/u010982507/article/details/104875115