Gradle插件在項(xiàng)目中的應(yīng)用方式

Gradle基礎(chǔ)概念

  • projects ( 項(xiàng)目 ):每一個(gè)構(gòu)建都是由一個(gè)或多個(gè) projects 構(gòu)成的,安卓工程每個(gè)module工程就是一個(gè)project,對(duì)應(yīng)的是module里面的build.gradle文件
project.png
  • tasks ( 任務(wù) ):每一個(gè) project 是由一個(gè)或多個(gè) tasks 構(gòu)成的. 一個(gè) task 代表一些更加細(xì)化的構(gòu)建
task.png

Gradle 擴(kuò)展

如上圖project,project是實(shí)現(xiàn)了ExtensionAware的。ExtensionAware的getExtensions方法返回了一個(gè)ExtensionContainer,也就是一個(gè)可以擴(kuò)展容器。通過ExtensionContainer我們可以去創(chuàng)建擴(kuò)展。

org.gradle.api.tasks.TaskContainer接口:
//查找task
findByPath(path: String): Task
getByPath(path: String): Task
getByName(name: String): Task
withType(type: Class): TaskCollection
matching(condition: Closure): TaskCollection

//創(chuàng)建task
create(name: String): Task
create(name: String, configure: Closure): Task 
create(name: String, type: Class): Task
create(options: Map<String, ?>): Task
create(options: Map<String, ?>, configure: Closure): Task
ExtensionAware.png
ExtensionContainer.png
extuse.png

按照文檔,我們來試試

set.png

注釋掉配置里面的內(nèi)容,我們?cè)倏纯催\(yùn)行打印結(jié)果

notset.png

從上圖可以看出,如果我們沒有配置,就會(huì)使用默認(rèn)的,這種配置的寫法是不是似曾相識(shí),譬如我們經(jīng)常要改動(dòng)的android{}里面的版本號(hào)之類的,android 它就是一個(gè) Extension,看看源碼就知道android 實(shí)際就是 AppExtension 這個(gè)類。所以 android 能配置什么屬性就可以在 AppExtension查找即可。

/**
 * Gradle plugin class for 'application' projects.
 */
public class AppPlugin extends BasePlugin implements Plugin<Project> {
    
    protected BaseExtension createExtension(
            @NonNull Project project,
            @NonNull Instantiator instantiator,
            @NonNull AndroidBuilder androidBuilder,
            @NonNull SdkHandler sdkHandler,
            @NonNull NamedDomainObjectContainer<BuildType> buildTypeContainer,
            @NonNull NamedDomainObjectContainer<ProductFlavor> productFlavorContainer,
            @NonNull NamedDomainObjectContainer<SigningConfig> signingConfigContainer,
            @NonNull ExtraModelInfo extraModelInfo) {
        return project.getExtensions()
                .create(
                        "android",//"android" 就是 Extension 的名字
                        AppExtension.class,
                        project,
                        instantiator,
                        androidBuilder,
                        sdkHandler,
                        buildTypeContainer,
                        productFlavorContainer,
                        signingConfigContainer,
                        extraModelInfo);
    }


Gradle 本地腳本插件

有時(shí)候我們不希望很多把很多gradle腳本寫在build.gradle里面,通過apply就可以依賴本地其他gradle文件,就如同java里面import一樣

localgradle.png

Gradle 遠(yuǎn)程腳本插件

其實(shí)和本地插件一樣,只不過是依賴的遠(yuǎn)程http的url地址。有時(shí)候有些腳本我們需要?jiǎng)討B(tài)的改變的時(shí)候使用這種方法,譬如我們的依賴組件的版本號(hào)統(tǒng)一管理,所有同一個(gè)版本發(fā)布的組件引用同一個(gè)分支的遠(yuǎn)程gradle文件。

gitplugin.png
remoteplugin.png

Gradle 二進(jìn)制插件

Gradle插件主要是實(shí)現(xiàn)Plugin接口apply方法,下面是之前我寫的一個(gè)檢測(cè)項(xiàng)目中圖片是否全部是webp的插件,因?yàn)閣ebp體積小,用于體積優(yōu)化的任務(wù)插件

  1. 在項(xiàng)目工程的根目錄下創(chuàng)建buildSrc目錄,這個(gè)名字不能錯(cuò),必須是buildSrc。創(chuàng)建完之后,rebuild一下工程,會(huì)在buildSrc下生成一些目錄
  2. 在buildSrc目錄下創(chuàng)建build.gradle.kts文件,用kotlin寫插件
kotlingradle.png
plugins {
    `kotlin-dsl`
}
repositories {
    jcenter()
}
  1. 在buildSrc目錄下創(chuàng)建src/main/kotlin目錄,目錄名字一定不要錯(cuò)?。?!,然后編寫插件
taskImpl.png
  1. 在 main 目錄下新建 resources 目錄,然后在 resources 目錄里面再新建 META-INF 目錄,再在 META-INF 里面新建 gradle-plugins 目錄。最后在 gradle-plugins 目錄里面新建 properties 文件,注意這個(gè)文件的命名,你可以隨意取名,但是后面使用這個(gè)插件的時(shí)候,會(huì)用到這個(gè)名字。比如,你取名為com.example.harry.properties,那么這個(gè)插件的id就是com.example.harry
resource.png
  1. 在app中進(jìn)行引用
taskrun.png
  • 我們還可以通過另一種方式來生成插件
gradlePlugin {
    plugins {
        create("HarryPlugin2") {
            //插件id,用于引用插件,如:apply plugin: 'id'
            id = "com.example.harry2"
            //指定插件的實(shí)現(xiàn)類
            implementationClass = "com.example.harry.HarryPlugin2"
        }
    }
}
plugin2.png
  • 我們還可以通過這個(gè)buildSrc包來進(jìn)行依賴管理
deps.png
depimpl.png

獨(dú)立插件maven的發(fā)布

  • 直接新建一個(gè)module,不需要以buildSrc命令。新建module默認(rèn)的gradle里面內(nèi)容刪除掉,添加maven依賴,編寫插件后即可發(fā)布本地maven倉庫
maven.png

發(fā)布完成后即可在項(xiàng)目中引用


mavenapply.png

上面是使用的本地倉庫,如果有maven服務(wù)器,將url替換成遠(yuǎn)程maven即可。maven服務(wù)搭建請(qǐng)點(diǎn)擊這里

文中代碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容