前言
Hypnus是古希臘神話中的睡神,以Hypnus命名這個插件是希望我們程序員能夠得到更多的休息,遠離ICU。
由於項目越來越大,不管是用模塊化還是組件化從點擊運行按鈕到項目編譯完成需要一段時間,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