前言
Hypnus是古希腊神话中的睡神,以Hypnus命名这个插件是希望我们程序员能够得到更多的休息。
由于项目越来越大,不管是用模块化还是组件化从点击运行按钮到项目编译完成需要一段时间,Hypnus要做的就是在编译完成后能够以音乐的形式通知到我们开发者(现在AndroidStudio在处于后台时候编译完成是有通知提示的,但我要做的是希望能够解放我们的双眼)。这样我们开发者可以在不影响开发效率情况下,稍作休息。
由于Hypnus并不会影响到源代码,并且需要知晓编译、运行的task执行完成的状态,因此Hypnus使用plugin的形式开发。
Hypnus插件开发
首先,我们要知道插件是什么。在Project的gradle中会有这样的代码:
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
没错,这两个就是插件。下面看看如何开发一个Android插件
-
创建一个module
这个module选择什么类型呢?其实无所谓,你可以先选择一个java-library,我们把该module命名为hypnus。 -
将hypnus里gradle中的内容全部替换成如下内容:
apply plugin: 'groovy' dependencies { // gradle sdk compile gradleApi() // groovy sdk compile localGroovy() }
-
将main/java重命名为在main/groovy,并在包下面创建Hypnus.groovy。注意后缀名。文件内容如下:
public class Hypnus implements Plugin<Project> { @Override void apply(Project project) { System.out.println("===============Hypnus Start================") System.out.println(project.name) System.out.println("===============Hypnus End================") } }
-
在main文件夹下,依次创建resources/META-INF/gradle-plugins文件夹
-
在上一步中创建的gradle-plugins文件夹中创建hypnus.properties,内容如下:
implementation-class=com.fcat.android.plugin.hypnus.Hypnus
-
发布插件到本地
在module下的gradle文件中添加maven的支持,最终内容如下:apply plugin: 'groovy' apply plugin: 'maven' dependencies { // gradle sdk compile gradleApi() // groovy sdk compile localGroovy() } uploadArchives { repositories { mavenDeployer { pom.groupId = "com.fact.android.plugin" pom.artifactId = "hypnus" pom.version = "0.0.1" //本地路径 repository(url: uri("/Users/fcat/Documents/maven/repo")) } } }
然后在gradle的视图中双击击uploadArchives
这样在**/Users/fcat/Documents/maven/repo** 的目录下就可以看到该插件 -
使用插件
在project的gradle中添加插件及本来插件路径,代码如下:buildscript { ext.kotlin_version = '1.3.31' repositories { maven { url 'file:///Users/fcat/Documents/maven/repo' } google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.fcat.android.plugin:hypnus:0.0.1' } }
在app的gradle中添加对该插件的引用:
apply plugin: 'hypnus'
这样在重新Rebuild Project的时候在Build Output会有以下输出:
当看到上面的输入信息时表名该插件应用成功。 -
Hypnus功能实现
上面做的插件什么功能也没有,接下来看看如何给插件添加功能。针对当前的需求,我们需要知道项目是何时编译完成的,非常幸运在 apply(Project project) 的方法中就包含了这样的回调:
public class Hypnus implements Plugin<Project> { @Override void apply(Project project) { project.getGradle().addBuildListener(new BuildListener() { @Override void buildStarted(Gradle gradle) { } @Override void settingsEvaluated(Settings settings) { } @Override void projectsLoaded(Gradle gradle) { } @Override void projectsEvaluated(Gradle gradle) { } @Override void buildFinished(BuildResult buildResult) { //TODO 项目build完成可以播放音乐了 } }) } }
至此我们的Hypnus插件开发完毕
本来是想把完整代码都写上,但有几个知识点并不在插件开发范围内
总结
做下总结,相关知识点如下:
- 插件开发的基本流程
- 如何发布自己的 jar/aar 到本地仓库
- 插件中如何对gradle做拓展
项目地址:https://github.com/FullCat/Hypnus