天天看點

怎樣使用Android Studio開發Gradle插件

緣由

首先說明一下為什麼會有這篇文章。前段時間,插件化以及熱修複的技術非常熱,Nuwa熱修複的工具NuwaGradle,攜程動态載入技術DynamicAPK,還有希望做最輕巧的插件化架構的Small。這三個App有一個共同的地方就是大量的使用了Gradle這個強大的建構工具,除了攜程的架構外,另外兩個都公布了獨立的Gradle插件提供自己主動化建構插件,或者生成熱修複的更新檔。是以學習一下Gradle插件的編寫還是一件十分有意義的事。

插件類型

Gradle的插件一般有這麼幾種:

一種是直接在項目中的gradle檔案裡編寫。這種方式的缺點是無法複用插件代碼。在其它項目中還得複制一遍代碼(或者說說複制一遍檔案)

還有一種是在獨立的項目裡編寫插件,然後公布到中央倉庫。之後直接引用就能夠了。長處就是可複用。就和上面的Nuwa和Small一樣。

Gradle相關文法

本篇文章不會詳細說明Gradle相關的文法。​

Gradle插件開發

Gradle插件是使用Groovy進行開發的,而Groovy事實上是能夠相容Java的。

Android Studio事實上除了開發Android App外,全然能夠勝任開發Gradle插件這一工作,以下來講講詳細怎樣開發。

首先,建立一個Android項目。

之後。建立一個Android Module項目,類型選擇Android Library。

将建立的Module中除了build.gradle檔案外的其餘檔案全都删除,然後删除build.gradle檔案裡的全部内容。

在建立的module中建立檔案夾src,接着在src檔案檔案夾下建立main檔案夾,在main檔案夾下建立groovy檔案夾。這時候groovy檔案夾會被Android識别為groovy源代碼檔案夾。除了在main檔案夾下建立groovy檔案夾外,你還要在main檔案夾下建立resources檔案夾。同理resources檔案夾會被自己主動識别為資源檔案夾。

在groovy檔案夾下建立項目包名。就像Java包名那樣。resources檔案夾下建立檔案夾META-INF。META-INF檔案夾下建立gradle-plugins檔案夾。這樣。就完畢了gradle 插件的項目的總體搭建,之後就是小細節了。眼下,項目的結構是這種。

怎樣使用Android Studio開發Gradle插件

打開Module下的build.gradle檔案,輸入

以下我們在包名下建立一個檔案,命名為PluginImpl.groovy,注意有groovy字尾。然後在裡面輸入,注意包名替換為你自己的包名。

然後在resources/META-INF/gradle-plugins檔案夾下建立一個properties檔案。注意該檔案的命名就是你僅僅有使用插件的名字。這裡命名為plugin.test.properties,在裡面輸入

注意包名須要替換為你自己的包名。

這樣就完畢了最簡單的一個gradle插件。裡面有一個叫testTask的Task。運作該task後會輸出一段文字。就像當初我們輸出HelloWorld一樣。

公布到本地倉庫

接着。我們須要将插件公布到maven中央倉庫。我們将插件公布到本地倉庫就好了。在module項目下的buidl.gradle檔案裡增加公布的代碼。

上面的group和version的定義會被使用,作為maven庫的坐标的一部分,group會被作為坐标的groupId,version會被作為坐标的version,而坐标的artifactId組成即module名,我們讓其取一個别名moduleName。然後maven本地倉庫的檔案夾就是目前項目檔案夾下的repo檔案夾。

這時候。右側的gradle Toolbar就會在module下多出一個task

怎樣使用Android Studio開發Gradle插件

點選uploadArchives這個Task。就會在項目下多出一個repo檔案夾,裡面存着這個gradle插件。

怎樣使用Android Studio開發Gradle插件

檔案夾就像上圖這樣,詳細檔案夾結構和你的包名等一系列有關,time是我的module名。

公布到本地maven倉庫後,我們就使用它,在叫app的android項目下的gradle.build的檔案裡增加

apply plugin後面引號内的名字就是前文plugin.test.properties檔案的檔案名稱。而class path後面引號裡的内容,就是上面grade中定義的group。version以及moduleName所共同決定的,和maven是一樣的。

同步一下gradle,右側app下other分類下就會多出一個testTask,輕按兩下運作這個Task,控制台就會輸出剛才我們輸入的字元串

怎樣使用Android Studio開發Gradle插件

公布到Jcenter倉庫

接下來我們将其公布到jcenter中央倉庫。​

在項目根檔案夾下的build.gradle檔案裡增加。

在項目根路徑下建立bintray.gradle檔案,輸入

将相應的描寫叙述性文字改動為你自己的資訊。尤其是最前面的一系列的def定義,然後在gradle.properties檔案裡增加BINTRAY_USER和BINTRAY_KEY。

在你的module中apply該grade檔案

右側的gradle的toolbar就會多出幾個task

怎樣使用Android Studio開發Gradle插件

之後我們先運作other下的install這個task,再運作bintrayUpload這個task。假設不出意外,就上傳了。之後不要忘記到背景add to jcenter。

成功add到jcenter之後就會有link to jcenter的字樣

怎樣使用Android Studio開發Gradle插件

耐心等待add to center成功的消息,之後就能夠直接引用了。将module下的gradle檔案maven部分的定義

前面增加

終于的内容例如以下

就是這麼簡單,再次運作一下測試下是否成功。

最佳實踐

最佳實踐的來源是源自multidex,為什麼呢。由于近期當方法數超了之後,假設選擇multidex,編譯的過程就會慢非常多非常多,為了檢測究竟是哪一步的耗時。須要編寫一個插件來統計各個task運作的時間,是以就有了這麼一個最佳實踐。

在PluginImpl同級檔案夾下建立TimeListener.groovy檔案。輸入

然後将PluginImpl檔案裡的apply方法改動為

完畢後打包公布到jcenter()。之後你僅僅要引用了該插件,就會統計各個task運作的時間,比方運作app,就會輸出像以下的資訊。

怎樣使用Android Studio開發Gradle插件

最佳實踐的末尾,推廣一下這個插件,這個插件我已經将其公布到jcenter倉庫。假設要使用的話增加以下的代碼就可以

傳遞參數

上面的是小試牛刀了下,接下來我們須要獲得自己定義的參數。

首先依照上面的步驟建立一個module。建立PluginExtension.groovy,輸入

然後我們希望能傳入嵌套的參數,再建立一個PluginNestExtension.groovy。輸入

然後建立一個CustomTask.groovy。繼承DefaultTask類,使用 @TaskAction注解标注實作的方法

僅僅是做了拿到了參數,然後做最簡單的輸出操作,使用 ${project.pluginExt.param1}和 ${project.pluginExt.nestExt.nestParam1}等拿到外部的參數。

别忘了在META-INF/gradle-plugins檔案夾下建立properties檔案指定插件的接口實作類。

複制之前建立的PluginImpl.groovy到包下,改動apply方法

将插件公布到本地maven後,進行引用。

定義外部參數。這裡我們定義了param1,param2,nestParam1,nestParam2。此外param3和nestParam3保持預設。

同步一下gradle。運作customTask。

怎樣使用Android Studio開發Gradle插件

上面的代碼非常easy,不用解釋也能看到,是以不再解釋了。