亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android?Gradle?插件自定義Plugin實(shí)現(xiàn)注意事項(xiàng)

 更新時(shí)間:2022年06月16日 10:53:41   作者:??自動(dòng)化BUG制造器????  
這篇文章主要介紹了Android?Gradle?插件自定義Plugin實(shí)現(xiàn)注意事項(xiàng),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

Android Gradle Plugin

在 Android 項(xiàng)目中的 build.gradle 文件中,經(jīng)??梢钥匆?jiàn)一些 plugin 聲明:

plugins {
    id 'com.android.application'
	  id 'com.android.library'
}
// or
apply plugin: 'com.android.application'
apply plugin: 'com.android.library'

上面是兩種引用 gradle 插件的常用代碼,com.android.application 是用來(lái)構(gòu)建 apk 的 gradle 插件;com.android.library 是用來(lái)構(gòu)建 Android Library 的 gradle 插件。

Gradle 是什么?

Gradle 是自動(dòng)化構(gòu)建工具,多項(xiàng)目構(gòu)建而設(shè)計(jì)的。通過(guò) groovy 或 kotlin 來(lái)編寫(xiě)構(gòu)建腳本。主要用來(lái)處理:

  • 自動(dòng)處理包依賴關(guān)系
  • 自動(dòng)處理部署問(wèn)題

過(guò)去 Java 開(kāi)發(fā)者常用 Maven 和 Ant 等工具進(jìn)行封裝布署的自動(dòng)化,或是兩者兼用,不過(guò)這兩個(gè)包彼此有優(yōu)缺點(diǎn):

  • 如果頻繁改變相依包版本,使用 Ant 相當(dāng)麻煩,
  • 如果瑣碎工作很多,Maven 功能不足
  • 而且兩者都使用 XML 描述,相當(dāng)不利于設(shè)計(jì) if、switch 等判斷式,即使寫(xiě)了可讀性也不佳

而 Gradle 改良了過(guò)去 Maven、Ant 帶給開(kāi)發(fā)者的問(wèn)題,至今也成為 Android Studio 內(nèi)置的封裝布署工具。

官方文檔:What is Gradle?

Gradle 插件

Gradle 的核心是提供自動(dòng)化處理流程。所有有用的特性,比如編譯 Java 代碼的能力,都是由插件添加的。

插件實(shí)際的作用有:

  • 拓展 Gradle Model (例如:添加可配置的新 DSL 元素)
  • 根據(jù)約定配置項(xiàng)目(例如:添加新的 Gradle Task 或配置一些合理的默認(rèn)值)
  • 應(yīng)用指定的配置(例如:添加一些倉(cāng)庫(kù)或執(zhí)行標(biāo)準(zhǔn))

好處:

通過(guò)應(yīng)用插件,而不是向項(xiàng)目構(gòu)建腳本添加邏輯,可以獲得的好處有:

  • 提高復(fù)用能力,減少跨多個(gè)項(xiàng)目維護(hù)類(lèi)似邏輯的開(kāi)銷(xiāo):同一個(gè)插件可以應(yīng)用到不同的項(xiàng)目。
  • 更好的模塊化:通過(guò)插件的形式,可以使項(xiàng)目架構(gòu)更加明確更容易理解。
  • 封裝重要的邏輯,允許構(gòu)建腳本盡可能具有聲明性。

分類(lèi)

Gradle 插件有兩種類(lèi)型,分為二進(jìn)制插件和腳本插件。

二進(jìn)制插件:

  • 二進(jìn)制插件可以通過(guò)實(shí)現(xiàn) org.gradle.api.Plugin 接口以編程方式編寫(xiě),也可以使用 Gradle 的一種 DSL 語(yǔ)言以聲明方式編寫(xiě)。
  • 二進(jìn)制插件可以駐留在構(gòu)建腳本中、項(xiàng)目層次結(jié)構(gòu)中或外部插件 jar 包中。

腳本插件:

  • 腳本插件是額外的構(gòu)建腳本,可以進(jìn)一步配置構(gòu)建并且通常實(shí)現(xiàn)一種聲明性的方法來(lái)操作構(gòu)建。它們通常在構(gòu)建中使用,盡管它們也可以外部化并從遠(yuǎn)程位置訪問(wèn)。
  • 插件通常以腳本插件開(kāi)始(因?yàn)樗鼈円子诰帉?xiě)),然后隨著代碼變得更有價(jià)值,它被遷移到可以在多個(gè)項(xiàng)目或組織之間輕松測(cè)試和共享的二進(jìn)制插件。

使用插件

要使用插件中封裝的構(gòu)建邏輯,Gradle 需要執(zhí)行兩個(gè)步驟。 首先,解析插件,然后需要將插件應(yīng)用到一個(gè)目標(biāo)上,通常是一個(gè) org.gradle.api.Project 對(duì)象。

  • 解析插件:解析插件的工作是找到包含給定插件的正確版本的 jar 并將其添加到腳本類(lèi)路徑中。一旦一個(gè)插件被解析,它的 API 就可以在構(gòu)建腳本中使用。
  • 應(yīng)用插件:應(yīng)用插件意味著在要使用插件的項(xiàng)目上實(shí)際執(zhí)行插件的Plugin.apply(T 。應(yīng)用插件是冪等的。也就是說(shuō),您可以安全地多次應(yīng)用任何插件而不會(huì)產(chǎn)生副作用。

本篇文章主要介紹如何實(shí)現(xiàn)一個(gè)二進(jìn)制插件。

實(shí)現(xiàn)一個(gè)插件

最簡(jiǎn)單的構(gòu)建 Gradle 插件的方式是 通過(guò)命令來(lái)構(gòu)建:

gradle init // or ./gradlew init

執(zhí)行命令:

  • 第一步,選擇項(xiàng)目類(lèi)型,4 是 Gradle 插件項(xiàng)目。
  • 第二步,選擇實(shí)現(xiàn)芋圓,這里主要是 插件的代碼語(yǔ)言,支持 Groovy、Java 和 Kotlin。
  • 第三步,選擇 DSL 語(yǔ)言(構(gòu)建腳本語(yǔ)言),支持 Groovy 和 Kotlin。
  • 第四步,輸入項(xiàng)目名稱和插件包名。

最后會(huì)顯示構(gòu)建結(jié)果。 構(gòu)建完的項(xiàng)目結(jié)構(gòu)是這樣的:

這里有很多不需要的文件目錄,包括用來(lái)測(cè)試和 Gradle 的一些相關(guān)內(nèi)容,都可以刪除(當(dāng)然你也可以不處理),因?yàn)楫?dāng)我們把這個(gè)項(xiàng)目引入到一個(gè) Android 項(xiàng)目中時(shí),Android 項(xiàng)目提供了 Gradle 相關(guān)文件。

如圖所示,ExamplePlugin 目錄下 gradle 相關(guān)的文件,在 Android 的根目錄中都存在。 其中構(gòu)建插件相關(guān)的內(nèi)容都在 build.gradle 文件中,首先是,插件項(xiàng)目引用的插件:

plugins {
    id 'java-gradle-plugin' 
    id 'maven' // maven 倉(cāng)庫(kù)
    id 'groovy'	// groovy 支持
}

需要重點(diǎn)注意的是,使用一些第三方依賴如果下載不到,要檢查引用的遠(yuǎn)程倉(cāng)庫(kù)是否在包含想要引用的依賴:

repositories {
    // Use JCenter for resolving dependencies.
    jcenter()
}

當(dāng)我想引用 com.android.tools.build:gradle 依賴時(shí),一直報(bào)錯(cuò),原因是 jcenter 中不存在這個(gè)項(xiàng)目,需要添加 google()。

然后是一些依賴:

dependencies {
    // ...
    testImplementation 'org.spockframework:spock-core:1.3-groovy-2.5'
}

接下來(lái)是比較重要的插件定義:

gradlePlugin {
    // Define the plugin
    plugins {
        customName {
            id = 'com.example.plugin.customname'
            implementationClass = 'com.example.plugin.ComExamplePluginPlugin'
        }
    }
}

這里需要注意的是 customName 是你可以隨意定義的字符串,這個(gè)字符串會(huì)在 Plugin.apply 方法中使用到。 Id 就是插件唯一標(biāo)識(shí),后續(xù)在其他項(xiàng)目中引用的時(shí)候,也是引用這個(gè) id 。 implementationClass 的值指向一個(gè)實(shí)際的代碼類(lèi),這個(gè)類(lèi)實(shí)現(xiàn)了 org.gradle.api.Plugin 。 自動(dòng)生成的 Plugin 實(shí)現(xiàn)類(lèi)是這樣的:

class ComExamplePluginPlugin implements Plugin<Project> {
    void apply(Project project) {
        // Register a task
        project.tasks.register("customName") {
            doLast {
                println("Hello from plugin 'com.example.plugin.customname'")
            }
        }
    }
}

在這個(gè) apply 方法中,使用之前我們定義的 customName 注冊(cè)了一個(gè) Task 。 實(shí)際上 Gradle 后續(xù)就是執(zhí)行這個(gè) Task ,來(lái)執(zhí)行代碼塊中的代碼的。

在很多之前的 Gradle 插件實(shí)現(xiàn)方案中,需要?jiǎng)?chuàng)建 resources/META-INF/gradle-plugin/xxx.properties ,而通過(guò)上面的方式,不需要在去創(chuàng)建這個(gè)文件了。 這樣一個(gè)插件的定義基本上就完成了。

發(fā)布插件

我們已經(jīng)定義好了一個(gè) Gradle 插件,那么應(yīng)該如何校驗(yàn)這個(gè)插件是否真的能夠使用呢?為了解決這個(gè)問(wèn)題,我們要把 Gradle 插件發(fā)布到遠(yuǎn)程倉(cāng)庫(kù)或者本地目錄,然后供其他項(xiàng)目引用,以此來(lái)測(cè)試插件。 以本地發(fā)布為例,在插件項(xiàng)目的根目錄下的 build.gradle 文件中添加:

plugins {
	  // ...
    id 'maven-publish' // 用來(lái)發(fā)布插件
}
publishing {
    repositories {
        maven {
            // $rootDir 表示你項(xiàng)目的根目錄
			  // 這里配置發(fā)布到的本地目錄
            url = "$rootDir/repo" 
        }
    }
    publications {
        publish(MavenPublication) {
            // 插件的組ID,建議設(shè)置為插件的包名
            groupId = 'com.example.plugin.customname'
            // 插件的名字,后續(xù)在引用時(shí)會(huì)用到
            artifactId = 'customName'
            version = '0.0.1'
            // 組件類(lèi)型
            from components.java
        }
    }
}

如果發(fā)布到本地,運(yùn)行 Gradle 命令:

./gradlew publishPublishPublicationToMavenLocal

則會(huì)發(fā)布到本地目錄 /Users/XXX/.m2/repository/ 中。

./gradlew publishPublishPublicationToMavenRepository

會(huì)發(fā)布到你在 build.gradle 中,指定的目錄 "$rootDir/repo" 中。

引用插件

在 Android 項(xiàng)目中引用的第一步是在根目錄的 build.gradle中添加 maven 倉(cāng)庫(kù),這樣 Gradle 才能從特定的本地目錄中找到我們的 jar 包:

repositories {
    jcenter()
    google()
    maven {
        url = "$rootDir/repo"
    }
}

第二步,在根目錄的 build.gradle 中添加依賴:

dependencies {
    classpath "com.example.plugin.customname:customName:0.0.1"
}

這個(gè)就是我們?cè)诎l(fā)布插件時(shí),指定的 groupId 、artifactId 和 version,規(guī)則是:

classpath "$groupId:$artifactId:$version"

然后,在需要引用的 module 下的 build.gradle 文件中應(yīng)用插件:

plugins {
    id 'com.example.plugin.customname'
}

這里的 id 是我們?cè)诙x插件時(shí)在 gradlePlugin 代碼塊中指定的。 這樣我們就成功的通過(guò) jar 包的形式引用到了插件。 這里以我另一個(gè)項(xiàng)目為例,我在 gradlePlugin 中指定的代碼塊自定義名稱為 transfrom :

gradlePlugin {
    plugins {
        transform {
			 // ...
        }
    }
}

引用成功后會(huì)在 Gradle Task 中多一個(gè)同名的任務(wù):

對(duì)應(yīng)的 Groovy 中實(shí)現(xiàn) apply 方法:

@Override
void apply(Project project) {
    project.tasks.register("transform") {
        doLast {
            println("Hello from plugin 'com.chunyu.transform.plugin'")
        }
    }
}

執(zhí)行該任務(wù),會(huì)看到 log 面板中有對(duì)應(yīng)的輸出:

> Task :app:transform
Hello from plugin 'com.chunyu.transform.plugin'

成功的驗(yàn)證了,在 apply 中 print 代碼正確的執(zhí)行了。

到此這篇關(guān)于Android Gradle 插件自定義Plugin實(shí)現(xiàn)注意事項(xiàng)的文章就介紹到這了,更多相關(guān)Android Gradle 插件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android 開(kāi)發(fā)使用PopupWindow實(shí)現(xiàn)彈出警告框的復(fù)用類(lèi)示例

    Android 開(kāi)發(fā)使用PopupWindow實(shí)現(xiàn)彈出警告框的復(fù)用類(lèi)示例

    這篇文章主要介紹了Android 開(kāi)發(fā)使用PopupWindow實(shí)現(xiàn)彈出警告框的復(fù)用類(lèi),結(jié)合實(shí)例形式分析了Android基于PopupWindow彈出警告框的復(fù)用類(lèi)具體布局與功能實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-05-05
  • Android編程解析Json格式數(shù)據(jù)的方法

    Android編程解析Json格式數(shù)據(jù)的方法

    這篇文章主要介紹了Android編程解析Json格式數(shù)據(jù)的方法,涉及Android中json格式數(shù)據(jù)的構(gòu)造、讀取及遍歷等技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Android視圖綁定方法深入探究

    Android視圖綁定方法深入探究

    這篇文章主要介紹了Android視圖綁定方法,通過(guò)視圖綁定viewBinding功能,您可以更輕松地編寫(xiě)可與視圖交互的代碼。在模塊中啟用視圖綁定之后,系統(tǒng)會(huì)為該模塊中的每個(gè)XML
    2023-01-01
  • Android開(kāi)源項(xiàng)目PullToRefresh下拉刷新功能詳解2

    Android開(kāi)源項(xiàng)目PullToRefresh下拉刷新功能詳解2

    這篇文章主要為大家進(jìn)一步的介紹了Android開(kāi)源項(xiàng)目PullToRefresh下拉刷新功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android觸摸事件如何實(shí)現(xiàn)筆觸畫(huà)布詳解

    Android觸摸事件如何實(shí)現(xiàn)筆觸畫(huà)布詳解

    這篇文章主要給大家介紹了關(guān)于Android觸摸事件如何實(shí)現(xiàn)筆觸畫(huà)布的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • 深入解析Android App的LayoutInflate布局

    深入解析Android App的LayoutInflate布局

    這篇文章主要介紹了Android App的LayoutInflate布局,對(duì)LayoutInflate編寫(xiě)中經(jīng)常被無(wú)解及產(chǎn)生錯(cuò)誤的地方進(jìn)行了深入說(shuō)明,需要的朋友可以參考下
    2016-04-04
  • Android封裝對(duì)原生Log進(jìn)行封裝的操作

    Android封裝對(duì)原生Log進(jìn)行封裝的操作

    這篇文章主要介紹了Android封裝對(duì)原生Log進(jìn)行封裝的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Android中解決頁(yè)簽手指按下從左到右滑動(dòng)的bug

    Android中解決頁(yè)簽手指按下從左到右滑動(dòng)的bug

    有一種方法可以阻止父層的View截獲touch事件,就是調(diào)用 getParent().requestDisallowInterceptTouchEvent(true);方法。這篇文章給大家介紹了Android中解決頁(yè)簽手指按下從左到右滑動(dòng)的bug,一起看看吧
    2016-10-10
  • Android自定義popupwindow實(shí)例代碼

    Android自定義popupwindow實(shí)例代碼

    這篇文章主要為大家詳細(xì)介紹了Android自定義popupwindow實(shí)例代碼,popupwindow彈出菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android仿微信群聊頭像效果

    Android仿微信群聊頭像效果

    這篇文章主要為大家詳細(xì)介紹了Android仿微信群聊頭像效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評(píng)論