Android Plugin for Gradle 筆記(一)


  • 前言

  Gradle 插件打包了可重用的構建邏輯,可在許多不同的項目和構建中使用。Gradle允許您實現自己的插件,因此您可以重復使用構建邏輯,並與他人共享。 

  以下是如何創建Plugin的具體流程

  • 開發工具

  Android Studio 3.6.3

  Gradle 5.6.4

  Groovy語言

  • Gradle Plugin 的打包方式
    • 構建腳本:插件邏輯寫在 build.gradle 中,適用於邏輯簡單的任務,但是該方式實現的插件在該構建腳本之外是不可見的,只能用於當前腳本。在這里不做介紹
    • buildSrc項目:該目錄buildSrc被視為包含的構建。發現目錄后,Gradle會自動編譯並測試此代碼,並將其放入構建腳本的類路徑中。對於多項目構建,只能有一個buildSrc目錄,該目錄必須位於根項目目錄中。 buildSrc應該比腳本插件更可取,因為它更易於維護,重構和測試代碼。

    • 獨立項目:您可以為插件創建一個單獨的項目。這個項目產生並發布了一個JAR,您可以在多個版本中使用它並與他人共享。通常,此JAR可能包含一些插件,或將幾個相關的任務類捆綁到一個庫中。或兩者的某種組合。
  • 構建腳本

創建一個簡單的插件

build.gradle
 
class JYTPlugin implements Plugin<Project> {
    void apply(Project project) {
            println("========================");
            println("hello JY Test plugin!");
            println("========================");
    }
}

apply plugin: JYTPlugin

  

  • 創建一個buildSrc模塊  

  復雜的構建邏輯通常很適合作為自定義任務或二進制插件進行封裝。自定義任務和插件實現不應存在於構建腳本中。buildSrc只要不需要在多個獨立項目之間共享代碼,就可以非常方便地使用該代碼。

  該目錄buildSrc被視為包含的構建。發現目錄后,Gradle會自動編譯並測試此代碼,並將其放入構建腳本的類路徑中。對於多項目構建,只能有一個buildSrc目錄,該目錄必須位於根項目目錄中。 buildSrc應該比腳本插件更可取,因為它更易於維護,重構和測試代碼。

  buildSrc使用適用於Java和Groovy項目的相同源代碼約定。它還提供對Gradle API的直接訪問。其他依賴項可以在專用的build.gradle下聲明buildSrc。

  我們看一下如何在Android Studio 中創建一個buildSrc 模塊 並書寫插件

  1. 首先,我們使用Android Studio 創建一個 Project 。

  2. 因為Android Studio 並沒創建插件的模版,所以我們使用Android Library Module,並且命名Module 的名稱為buildSrc,這里有個坑,文件夾的名字大小寫必須匹配,不然的話編譯的時候,Android Studio 會提示你“Duplicate root element buildSrc”

  

 

  注:因為android studio 會自動小寫你的Module Name ,需要手動修改下

  3. 創建完成后,將src/mian下面的東西刪除掉,清理掉build.gradle的內容,

  生成后的目錄結構大概的情況如下

  

 

 

 

  4. 由於gradle是基於groovy,因此,我們開發的gradle插件相當於一個groovy項目。所以需要在main目錄下新建groovy目錄,這時候groovy文件夾會被Android識別為groovy源碼目錄,代碼的部分有了,還需要配置文件的位置,需要在要在main目錄下新建resources目錄,相似的resources目錄會被自動識別為資源文件夾,resources的目錄的固定結構是resources/META-INF/gradle-plugins/xxx.properties ,

   有人會問了。為什么叫gradle-plugins,而不是gradle-plugin,難道下面可以配置多個?是的,下面可以配置多個,下面會說明properties文件的作用,理解了作用,你就會知道為什么會是s了

   下圖是生成的目錄結構

    

 

 

  5. 修改配置build.gradle

plugins {
    id 'groovy'
}

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

   6. 編寫插件

  創建文件groovy文件,本次創建的是JYTPlugin.groovy

package com.jykit.plugin

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

class JYTPlugin implements Plugin<Project> {
    void apply(Project project) {
        println("========================");
        println("hello JY Test plugin!");
        println("========================");
    }
}

7. 配置插件

插件已經開發完了,如何才能外面的人知道尼?如何才能被其他人使用尼?白話描述為,你叫啥?

我們在上面目錄結構的時候已經提到過配置文件是在放在resources/META-INF/gradle-plugins下的,我們需要在這個目錄下創建一個properties文件,這個文件的名字就是你插件的名字,這個文件里面的內容就是你插件的實現的類關聯,比如我們將我的插件命名為:JYTPluginName ,所以的我文件的名字叫JYTPluginName.properties,文件的內容配置為關聯方法

implementation-class=com.jykit.plugin.JYTPlugin

   

 看下效果圖

 

  7. 關聯使用

  插件的配置已經完成,如果使用尼?

  我們只需要在App的build.gradle中調用就可以了。

apply plugin: 'com.android.application'
apply plugin: 'JYTPluginName' #JYTPluginName 這個名字就是我們創建的JYTPluginName.properties 配置文件的名字
...
...

   

  8. 看下效果

  好了,我們已經完成了一個buildSrc Module的簡單開發,看下編譯一下app項目,看下效果  

> Task :buildSrc:compileJava NO-SOURCE
> Task :buildSrc:compileGroovy UP-TO-DATE
> 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:testClasses UP-TO-DATE
> Task :buildSrc:test NO-SOURCE
> Task :buildSrc:check UP-TO-DATE
> Task :buildSrc:build UP-TO-DATE

> Configure project :app
========================
hello JY Test plugin!
========================

CONFIGURE SUCCESSFUL in 3s

CONFIGURE SUCCESSFUL in 126ms
  •  獨立項目編譯

   為什么要創建獨立的項目?難道直接使用buildSrc方式創建不香嗎?

   buildSrc的方式是便於調試和項目內部使用,如果說外部項目想要使用你的Plugin就需要重新再項目下去創建buildSrc,這樣如果有問題需要版本修復的話,就難以統一管理了,所以Gradle 提供了一個插件管理的方法,下面我們動手看下如何創建一個獨立的項目編譯

  創建獨立項目的優點

    1.  插件名字自定義,

    2. 可以統一進行版本管理

  1.  創建一個Android Plugin Module,創建方法和上面創建buildSrc的方法類似,只是項目的名稱可以自定義,無需強制使用buildSrc,我們參照上面創建buildSrc的方法創建了一個JYTAlonePlugin

 

 

  2. 編寫build.gradle 

plugins {
    id 'groovy'
    id 'maven'
}

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

   

  3. 編寫插件  

package com.jykit.plugin

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

class JYTAlonePlugin implements Plugin<Project> {
    void apply(Project project) {
        println("========================");
        println("hello JY Alone Test plugin!");
        println("========================");
    }
}

   4. 編寫配置文件

創建JYTAlonePluginName.properties並配置

implementation-class=com.jykit.plugin.JYTAlonePlugin

  

  看下整體的效果

 

 

  是不是很熟悉?沒錯,現在的步驟和創建buildSrc的東西都一樣,只是Plugin的名字有差別而已

 

  5. 接下來,我們來配置打包,將我們的插件進行發布

  我們只需要在Module下的build.gradle后面填寫一些配置就可以了

    1. goup插件的分組配置說明
    2. version 插件的版本管理
    3. 上傳的Task  
group 'com.jykit.plugin.JYTAlonePlugin' #包名
version '1.0.0'    #版本號

repositories {
    mavenCentral()
}

uploadArchives {    #打包的Task
    repositories {
        mavenDeployer {
            //提交到遠程服務器:
            // repository(url: "http://www.xxx.com/repos") {
            //    authentication(userName: "admin", password: "admin")
            // }
            //本地的Maven地址設置為
            repository(url: uri('/Users/mac/.gradle/repos'))
        }
    }
}

   好了,我們配置好了,repository(url: uri('/Users/mac/.gradle/repos'))這里就寫明了我們的插件的本地位置,我們可以打開Gradle的編譯菜單

 

 

   我們就可以看到uploadArchives的Task了,執行下,等待結果。  

> Task :jytaloneplugin:compileJava NO-SOURCE
> Task :jytaloneplugin:compileGroovy UP-TO-DATE
> Task :jytaloneplugin:processResources UP-TO-DATE
> Task :jytaloneplugin:classes UP-TO-DATE
> Task :jytaloneplugin:jar UP-TO-DATE
> Task :jytaloneplugin:uploadArchives

BUILD SUCCESSFUL in 544ms
4 actionable tasks: 1 executed, 3 up-to-date
3:51:54 PM: Task execution finished 'uploadArchives'.

   可以看到,我們已經執行成功了,再去我們的配置的本地路徑去看下

 

 

 

  我們的插件已經生成成功了。

  6. 使用插件

  使用插件也比較簡單,可以參照android studio的自有插件的寫法配置下

  在Project的build.gradle 中告知編譯器,我需要使用本地倉庫查找插件,並告知依賴的插件的名字

buildscript {
    
    repositories {
        google()
        jcenter()
        // 告知編譯器,我需要使用本地倉庫的位置
        maven {
            url uri('/Users/mac/.gradle/repos')
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.3'
        //鏈接我的插件,其中 com.jykit.plugin.JYTAlonePlugin 為之前創建的group的名字 
        // jytaloneplugin 為你的Moudel的名字
       // 1.0.0 為配置的version
        classpath 'com.jykit.plugin.JYTAlonePlugin:jytaloneplugin:1.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

   配置完了如上配置,你可以編譯一下工程,細心的同學會發現,你的的編譯器中會顯示在現在這個插件

  在需要使用app的build.gradle 中就可以配置這個Plugin的使用啦

apply plugin: 'JYTAlonePluginName' //JYTAlonePluginName 是你的配置JYTAlonePluginName.properties文件的名字

  

  OK ,我們去編譯一下Project,看下效果

> Task :buildSrc:compileJava NO-SOURCE
> Task :buildSrc:compileGroovy UP-TO-DATE
> 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:testClasses UP-TO-DATE
> Task :buildSrc:test NO-SOURCE
> Task :buildSrc:check UP-TO-DATE
> Task :buildSrc:build UP-TO-DATE

> Configure project :app
========================
hello JY Alone Test plugin!
========================

CONFIGURE SUCCESSFUL in 2s

CONFIGURE SUCCESSFUL in 109ms

   

  關於網絡的maven倉庫或者在本地創建http的倉庫,可以參照Nexus搭建

   以上是為了學習記錄使用

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM