1. 程式人生 > >Enjoy life,Enjoy coding!!

Enjoy life,Enjoy coding!!

一直都想好好學習AndroidStudio中的gradle,總感覺不懂如何在AndroidStudio中自定義gradle外掛的程式設計師就不是個好程式設計師,這次上網查了一下相關資料,做了一個總結~

1 建立Gradle Module

AndroidStudio中是沒有新建類似Gradle Plugin這樣的選項的,那我們如何在AndroidStudio中編寫Gradle外掛,並打包出來呢?

  • (1) 首先,你得新建一個Android Project
  • (2) 然後再新建一個Module,這個Module用於開發Gradle外掛,同樣,Module裡面沒有gradle plugin給你選,但是我們只是需要一個“容器”來容納我們寫的外掛,因此,你可以隨便選擇一個Module
    型別(如Phone&Tablet ModuleAndroid Librarty),因為接下來一步我們是將裡面的大部分內容刪除,所以選擇哪個型別的Module不重要。
  • (3) 將Module裡面的內容刪除,只保留build.gradle檔案和src/main目錄。
  • 由於gradle是基於groovy,因此,我們開發的gradle外掛相當於一個groovy專案。所以需要在main目錄下新建groovy目錄
  • (4) groovy又是基於Java,因此,接下來建立groovy的過程跟建立java很類似。在groovy新建包名,如:com.hc.plugin,然後在該包下新建groovy檔案,通過new->file->MyPlugin.groovy
    來新建名為MyPlugingroovy檔案。
  • (5) 為了讓我們的groovy類申明為gradle的外掛,新建的groovy需要實現org.gradle.api.Plugin介面。如下所示:
package  com.hc.plugin

import org.gradle.api.Plugin
import org.gradle.api.Project

public class MyPlugin implements Plugin<Project> {

    void apply(Project project) {
        System.out.println("========================"
); System.out.println("hello gradle plugin!"); System.out.println("========================"); } }

因為我本人對groovy也不是特別熟悉,所以我儘可能的用Java語言,使用System.out.println而不是用groovy的pintln "",我們的程式碼裡面啥也沒做,就列印資訊。

  • (6) 現在,我們已經定義好了自己的gradle外掛類,接下來就是告訴gradle,哪一個是我們自定義的外掛類,因此,需要在main目錄下新建resources目錄,然後在resources目錄裡面再新建META-INF目錄,再在META-INF裡面新建gradle-plugins目錄。最後在gradle-plugins目錄裡面新建properties檔案,注意這個檔案的命名,你可以隨意取名,但是後面使用這個外掛的時候,會用到這個名字。比如,你取名為com.hc.gradle.properties,而在其他build.gradle檔案中使用自定義的外掛時候則需寫成:
apply plugin: 'com.hc.gradle'

然後在com.hc.gradle.properties檔案裡面指明你自定義的類

implementation-class=com.hc.plugin.MyPlugin

現在,你的目錄應該如下:


自定義外掛目錄結構
  • (7) 因為我們要用到groovy以及後面打包要用到maven,所以在我們自定義的Module下的build.gradle需要新增如下程式碼:
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    //gradle sdk
    compile gradleApi()
    //groovy sdk
    compile localGroovy()
}

repositories {
    mavenCentral()
}

2 打包到本地Maven

前面我們已經自定義好了外掛,接下來就是要打包到Maven庫裡面去了,你可以選擇打包到本地,或者是遠端伺服器中。在我們自定義Module目錄下的build.gradle新增如下程式碼:

//group和version在後面使用自定義外掛的時候會用到
group='com.hc.plugin'
version='1.0.0'

uploadArchives {
    repositories {
        mavenDeployer {
            //提交到遠端伺服器:
           // repository(url: "http://www.xxx.com/repos") {
            //    authentication(userName: "admin", password: "admin")
           // }
           //本地的Maven地址設定為D:/repos
            repository(url: uri('D:/repos'))
        }
    }
}

其中,groupversion後面會用到,我們後面再講。雖然我們已經定義好了打包地址以及打包相關配置,但是還需要我們讓這個打包task執行。點選AndroidStudio右側的gradle工具,如下圖所示:


上傳Task

可以看到有uploadArchives這個Task,雙擊uploadArchives就會執行打包上傳啦!執行完成後,去我們的Maven本地倉庫檢視一下:


打包上傳後

其中,com/hc/plugin這幾層目錄是由我們的group指定,myplugin是模組的名稱,1.0.0是版本號(version指定)。

3 使用自定義的外掛

接下來就是使用自定義的外掛了,一般就是在app這個模組中使用自定義外掛,因此在app這個Module的build.gradle檔案中,需要指定本地Maven地址、自定義外掛的名稱以及依賴包名。簡而言之,就是在app這個Module的build.gradle檔案中後面附加如下程式碼:

buildscript {
    repositories {
        maven {//本地Maven倉庫地址
            url uri('D:/repos')
        }
    }
    dependencies {
        //格式為-->group:module:version
        classpath 'com.hc.plugin:myplugin:1.0.0'
    }
}
//com.hc.gradle為resources/META-INF/gradle-plugins
//下的properties檔名稱
apply plugin: 'com.hc.gradle'

好啦,接下來就是看看效果啦!先clean project(很重要!),然後再make project.從messages視窗列印如下資訊:


使用自定義外掛

好啦,現在終於運行了自定義的gradle外掛啦!

4 開發只針對當前專案的Gradle外掛

前面我們講了如何自定義gradle外掛並且打包出去,可能步驟比較多。有時候,你可能並不需要打包出去,只是在這一個專案中使用而已,那麼你無需打包這個過程。

只是針對當前專案開發的Gradle外掛相對較簡單。步驟之前所提到的很類似,只是有幾點需要注意:

  1. 新建的Module名稱必須為BuildSrc
  2. 無需resources目錄

目錄結構如下所示:


針對當前專案的gradle外掛目錄

其中,build.gradle內容為:

apply plugin: 'groovy'

dependencies {
    compile gradleApi()//gradle sdk
    compile localGroovy()//groovy sdk
}

repositories {
    jcenter()
}

SecondPlugin.groovy內容為:

package  com.hc.second

import org.gradle.api.Plugin
import org.gradle.api.Project

public class SecondPlugin implements Plugin<Project> {

    void apply(Project project) {
        System.out.println("========================");
        System.out.println("這是第二個外掛!");
        System.out.println("========================");
    }
}

app這個Module中如何使用呢?直接在app的build.gradle下加入

apply plugin: com.hc.second.SecondPlugin

clean一下,再make projectmessages視窗資訊如下:


列印資訊

由於之前我們自定義的外掛我沒有在appbuild.gradle中刪除,所以hello gradle plugin這條資訊還會列印.