3種方法帶你玩自定義Android Gradle插件

2021-02-13 鴻洋

推薦一個熱修復框架,無需重啟應用,即可修復代碼和資源,零私有api調用,適用於2.x~P。

https://github.com/ximsfei/Stark

作者:binbinqq86

連結:

https://blog.csdn.net/binbinqq86/article/details/81033746

本文由作者授權發布。

gradle插件可以幫助我們幹很多事情,類似一個工具,可以根據你自己想要的效果去定製自己的插件,本文就講解一下怎麼去實現自己的一個插件。

根據官網描述,自定義插件一共有三種方式:

https://docs.gradle.org/current/userguide/custom_plugins.html

Build script——gradle文件,構建腳本內,不過這種只能在文件內使用

buildSrc project——buildSrc工程,可以在自己的工程內隨意使用,但是其他工程就無法使用

Standalone project——單獨項目的插件,可以隨意一個工程去引用,前提是需要發布到本地倉庫或者maven私服

下面我們就三種方式分別去看一下怎麼實現~

gradle文件內,就是自己新建一個,或者在項目或者工程的build.gradle裡面去寫一個類,來繼承org.gradle.api.Plugin,並實現裡面的apply方法。廢話不多說,直接上代碼:

apply plugin: Plugin2
class Plugin2 implements Plugin<Project>{

    @Override
    void apply(Project target) {
        println("this is a plugin in the file 'build.gradle'...")
    }
}

我們build一下: 

可以看到輸出了裡面的內容,這樣就完成了一個最簡單的插件開發,當然這裡沒有去做任何事情,只是列印一句話,後續我們會去開發一個比較實用的打包加固籤名apk的插件,這裡只是學會怎麼去做插件,但是這是插件只能在這個文件內引用,這樣局限性就比較大了,所以一般不採用此方式。

這種方式需要在工程下新建一個module,名字必須為buildSrc,我們看一下目錄結構: 

這種結構就是groovy工程,在android studio裡面創建一個library的module,然後刪除main下面的java文件夾,新建一個groovy文件夾,新建包,groovy文件,新建resources/META-INF/gradle-plugins,然後在該文件夾下創建一個以.properties結尾的文件,前面部分就是我們要引用的插件名稱,文件內容如下:

implementation-class=com.tb.plugin.TbPlugin

這就是告訴這個插件對應的groovy具體的類。我們再來看看TbPlugin文件:

package com.tb.plugin

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

class TbPlugin implements Plugin<Project>{

    @Override
    void apply(Project project) {
        println('this is a buildSrc plugin...')
    }
}

因為groovy完全兼容java,但是又進行了擴展,所以我們如果不會groovy語言,也可以直接使用java去寫代碼,注意插件必須繼承Plugin接口,然後就可以在apply方法去做自己想做的小工具了。。。

最後再來看一下build.gradle文件:

apply plugin: 'groovy'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

也是很簡單的幾句話,引入groovy插件,依賴gradle的api,groovy的api,然後就可以盡情的書寫代碼了。到此,buildSrc方式的自定義插件就結束了,來看一下怎麼引用吧~

// buildSrc下的插件 
//此處插件id大小寫,中下劃線均可*** 
//apply plugin: 『com.tb.plugin-buildSrc』 
//該方式可以不需要resources文件夾,直接引用插件全類名即可 
//apply plugin: com.tb.plugin.TbPlugin

通過以上兩種方式都可以很方便的引用插件,如果是通過類全名,可以連resources文件夾都不需要了,簡單吧!最後看一下運行結果:

上面這種方式也有局限性,就是只能在自己的工程裡使用,如果想寫一個插件,到處都可以用,那樣才是我們的最終目的,這就需要單獨建立一個工程,我們在工程裡新建一個module:

目錄結構跟上面也基本上沒有差別,唯一不同的是build.gradle文件,我們來看一下:

apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    compile gradleApi()
    compile localGroovy()
}

group='com.tb.plugin'
version='1.0.0'
archivesBaseName='module-plugin'

uploadArchives{
    repositories {
        mavenDeployer{
            repository(url: uri('../tbModulePlugin'))
        }
    }
}

可以看到,不同的地方就是這種方式,因為需要其他工程也可以引用,所以就需要我們去發布成jar包,可以發布到本地,也可以直接把jar包放到lib下面,也可發布到maven倉庫,可以是私服,如果想給所有人都能用,也可以發布到jcenter倉庫。

關於maven的發布的相關知識,可以參考我的另外一篇文章:Android和Maven倉庫那些事本文就簡單說一下怎麼發布到本地maven倉庫。

https://blog.csdn.net/binbinqq86/article/details/81033716

首先我們需要引入maven插件,然後指定maven發布需要的三個要素:

groupId,artifactId,version。

這三個也是後面我們引用的時候需要指定的東西,通過這三個要素,maven就可以找到我們指定的插件,第一個就是分組的id,一般是公司域名倒過來,第二個是工程名,也可以不寫,默認就是項目名,第三個是版本號。

最後我們發布到當前父目錄,也就是根工程目錄下的tbPlugin文件夾下,我們點擊gradle窗口,找到該task,雙擊執行: 


可以看到如上輸出,當然也可以使用gradle命令去執行,然後我們去tbPlugin文件夾看看: 

可以看到,目錄結構就是我們前面定義的groupId,artifactId,version,裡面有我們需要的jar文件,這樣就可以在其他工程進行本地的引入了: 


在工程的build.gradle文件添加如下依賴和倉庫地址: 

然後就可以在其他module去引用了,也可在其他工程去引用,實質就是引用這個jar包。

apply plugin: 『com.tb.plugin.module』

build一下,看看結果: 

列印出了我們的this is a module plugin…

至此三種自定義插件的方式就講完了,是不是很簡單~其實不止可以使用groovy去寫插件,還可以用java、kotlin等等你會的語言去寫,只需要我們在插件目錄的build.gradle文件加入相應的插件即可,比如java: 

這裡我們引入了java-gradle-plugin這個插件,他自動包含了java插件,但是可以用腳本的方式去定義插件名和id,省去了resources文件夾和properties文件,然後我們就可以像寫java一樣去寫插件了,再比如kotlin: 



我們只需要把groovy插件換成kotlin就可以用kotlin去編寫插件了,是不是很隨意!哈哈~

這裡有兩點需要說明一下:

為什麼引用的時候需要放到buildscript裡面,而不是allprojects裡面

為什麼採用的是classpath而不是compile或者api或者implementation

問題一:這是因為buildscript裡面的dependencies是gradle腳本使用的,而allprojects裡面的dependencies是給所有的項目使用的,而這裡我們寫的是插件,是給gradle用的,所以需要放到這裡,千萬不可混淆。

問題二:同樣也是因為gradle,classpath是gradle腳本用的,而另外的則是給項目使用的。

本文通過最簡單的方式,介紹了如何使用3種方式開發 Studio 插件,關於實際的應用場景,後面會再給大家推送。

最後放上源碼下載:

https://github.com/binbinqq86/groovy

推薦閱讀:

今日頭條適配方案

Android 有近10種動畫,你都知道嗎?

推薦4個不錯的開源項目

掃一掃 關注我的公眾號

如果你想要跟大家分享你的文章,歡迎投稿~

┏(^0^)┛明天見!

相關焦點

  • Android Studio 自定義Gradle Plugin
    Gradle發行版本(一般是限定一個最低版本),也就是我們常見的類似gradle-3.3-all.zip這種東西,如下:distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip如果這兩個版本對應不上了,那你的工程構建的時候就會報錯。
  • Android Gradle 插件開發指南
    作為Android開發者,你可能見過無數個apply plugin:plugin_name,plugin_name對應著相應的插件。android library的插件。則會輸出以下內容:Hello from GreetingPlugin這個插件創建了一個名為hello的task,並在task中列印了GreetingPluginExtension#message的內容。create的第一個參數greeting是我們自定義配置的DSL名字,第二個參數是參數類的名字。
  • Android Studio自定義加固插件
    目錄前言平時我們打包生成apk後可能需要進行加固,如果每次手動去打開加固軟體然後再去加固非常的麻煩,因此我們可以通過自定義加固命令 <APK路徑> <outputPath> <輸出路徑> [-autosign] 【自動籤名】 [-automulpkg] 【自動多渠道】 [-pkgparam mulpkg_filepath] 【自定義文件生成多渠道
  • Gradle插件開發 APK瘦身資源自定義7z壓縮
    原文地址:http://www.jianshu.com/p/838a609a8365聲明|本文為CankingApp授權發布,未經允許請勿轉載項目開發中,隨著業務的增長,常常需要在apk編譯階段對包代碼或是資源做一定的自定義修改,比如熱修復,插件生成,無埋點統計,渠道包生成等等。
  • Gradle for Android 第二篇( Build.gradle 入門 )
    :1.2.3' }}allprojects { repositories { jcenter() }}buildscript 方法是定義了全局的相關屬性,repositories 定義了 jcenter 作為倉庫。
  • 通俗易懂的Gradle插件講解
    :1.8.4"  }}apply plugin: "com.jfrog.bintray"在buildscrip中來定義插件所在的原始倉庫和插件的依賴 ,再通過apply方法配置就可以了。:2.3.2'    }}apply plugin: 'com.android.application'這樣我們就可以使用Android Gradle插件,通過apply方法來使用App工程插件,這樣項目會編譯成為一個apk,這裡涉及了Android相關的知識,脫離了本文的討論範圍,具體的請見後續的Gradle for Android系列。
  • Android Gradle 乾貨
    如果你想要在多個構建或者項目中分享可重用代碼,Gradle的插件會幫助你實現。將Gradle插件應用於你的項目中,它會在你的項目構建過程中提供很多幫助:為你的添加項目的依賴的第三方庫、為你的項目添加有用的默認設置和約定(原始碼位置、單元測試代碼位置)。
  • Android Gradle 學習(一)
    (module)#### 介紹:用於聲明本模塊的倉庫、依賴、構建內容等#### 內容##### 引入gradle插件apply plugin:二進位插件apply from:應用腳本插件 二進位插件: 一般都是被打包在一個jar裡獨立發布的,比如我們自定義的插件
  • 寫給Android開發的Gradle知識體系
    項目的構建,谷歌為Gradle編寫了Android插件,新的Android構建系統就是由Gradle的Android插件組成的,Gradle是一個高級構建工具包,它管理依賴項並允許開發者自定義構建邏輯。
  • Android Gradle(1) 概念及基礎
    但是這裡不僅僅可以定義要編譯的module,還可以進行插件化編程。4.gradle.propertiesgradle的全局配置>buildscript / repositories /google/jcenter/dependencies / classpath 其實都是 一個一個的"方法名",方法自然是會帶上小括號,小括號裡面就會裝著參數,而參數類型恰恰就是 閉包Closure,最後一個 classpath比較特殊,他的參數類型是
  • 掌控 Android Gradle
    例如我們新建一個 Android 工程,在其根目錄中輸入:gradle tasks -q可以看到如下輸出(你可能需要事先配置gradle的環境變量,或也可使用./gradlew替代):根據上圖可以看到當前工程中的每條task都已羅列出,並且有黃色的輸出表示當前task的描述。
  • Gradle 與 Android 構建入門
    因為 Gradle 允許命令行啟動時附加參數來自定義 Gradle 的運行環境,所以百度app通過自定義 gradle-wrapper.jar,實現通過配置文件為不同內存大小的電腦、debug/release 包指定不同 gradle 運行內存,提升大家編譯速度。setting.gradle
  • Android Studio之gradle的配置與介紹
    所謂DSL就是專門針對Android開發的插件,比如標準Gradle之外的一些新的方法(Method)、閉包(Closure)等等。通過我們簡單的了解知道Gradle的語法足夠簡潔和簡單,而且可以使用大部分的java包,所以它就當之無愧地成為新一代的Build System。
  • 史上最全Android build.gradle配置詳解
    task clean(type: Delete){}是運行gradle clean時,執行此處定義的task任務,該任務繼承自Delete,刪除根目錄中的build目錄。其中buildscript包含repositories閉包和dependencies閉包。
  • 弄懂Gradle依賴 Android依賴導入全攻略
    所幸我們都可以在主工程和各個Module的build.gradle裡進行統一管理。本文將在Android Studio3.0環境下來匯總下這些用法。先來看下Android Gradle plugin 3.0幾個引入依賴的方法:Implementation對於使用了該命令編譯的依賴,對該項目有依賴的項目將無法訪問到使用該命令編譯的依賴中的任何程序,也就是將該依賴隱藏在內部,而不對外部公開。
  • Android Gradle 常用配置
    更多更詳細的屬性和方法查看下面貼出 Android Gradle DSL 文檔吧產品變種 產品變種可以理解為應用的不同版本。例如,農村版和非農版。可以自定義變種以使用不同的代碼和資源,同時共享和重複利用所有應用版本共用的部分。
  • [Android開發 IV ]build.gradle文件詳解
    因為gradle並不是專門為了構建安卓項目而開發的,Java,C++等很多項目都可以使用Gradle來構建。所以如果想用它來構建Android項目,需要聲明com.android.tools.build:gradle:4.1.0這個插件。
  • 【Android進階必備】Gradle 庖丁解牛之構建源頭源碼淺析
    ,本系列以官方 release 3.4 版本為基礎。不過還是要先打個預防針,竟然還有人覺得 Gradle 只能構建 Android App,這 TM 就尷尬了,我想說 Gradle 就是一套腳手架,你想幹啥玩意都可以,就看你想不想幹,他就是個自動化構建框架,你整明白它的核心以後,他的插件你只用依據規則使用即可,譬如用來構建 Android 的 apply plugin: 『com.android.application』 只是它的一個小插件而已,實質就看你想搞啥了
  • 擁抱Android Studio(二):Android Studio與Gradle深入
    或者你要實現所謂多渠道打包。關於 Product Flavor 中都能定義哪些屬性,請參考 Android Gradle DSL。Gradle 使用的倉庫要使用遠程依賴,就得有個庫的倉庫,Gradle 支持 maven 倉庫。這些庫可以是公用的,例如 mavenCentral 或者 jcenter,也可以使用私有庫。
  • 從Ant到Gradle的遷移之路
    (3)transformClassesWithDexForRelease:主要完成了將class文件和第三方庫一起打包生成Dex字節碼文件。(4)packageRelease:主要完成了將Dex字節碼文件和其他資源文件一起打包。在這個插件中,代碼編譯、打包等基本任務已經有了,但是我們還有一部分自定義的任務怎麼辦呢?只能從Ant移植過去!