Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 用IntelliJ實現android gradle插件

用IntelliJ實現android gradle插件

編輯:關於Android編程

android的gradle插件用了不少了,比如說官方的應用構建插件(com.android.application),lib構建插件(com.android.library),還有第三方的比如輔助multidex的DexKnifePlugin。但是怎麼自己創建一個gradle插件一直不明白,今天就試一試自己撸一個android gradle插件,畢竟實踐出真知。

基礎知識

首先得知道一個gradle插件有需要哪些元素。
我們以android的application插件為例,往往有如下代碼,這些代碼到底是什麼?

//root build.gradle
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
    }
//app build.gradle
apply plugin: 'com.android.application'
屬性 值 備注 pluginId com.android.application 對應一個Plugin類 groupId com.android.tools.build   artifactId gradle   version 2.2.3  

以上是一個gradle插件必須的屬性。然後既然是gradle 插件必須實現Plugin接口。groupId、artifactId、version指定了一個插件工程,每個插件工程下可以有若干個插件(每個插件一個pluginId)

創建gradle插件

首先選擇科學工具IntelliJ,之前在groovy入門指南1裡面已經配置好了groovy和IntelliJ的環境,所以可以直接搞起來。

1、打開IJ(IntelliJ),new->gradle->選上java和groovy->Next,如下圖所示

\

2、選擇groupId和artifactId以及版本。這3個是就是我們說的gradle插件四屬性的3個,他們可以確定classpath

\

這裡我們配置如下,注意版本號寫1.0

3、勾上use auto-import和 create directories for empty..,這樣會幫我們自動導包並創建好groovy和java根目錄

\

4、just next

5、第一次創建gradle工程,他會去下載2個jar,junit:4.11和org.codehaus.groovy:groovy-all:2.3.11,這個下載過程非常慢(好吧,其實是公司網絡比較坑),耐心等待。

\

6、jar包下載好之後,會自動創建main和test文件夾(其實gradle默認工程的創建也是在執行gradle任務),此時文件結構如下,注意groovy和java文件夾為藍色的

\

7、在build.gradle的dependencies裡面加入
    compile gradleApi()
    compile localGroovy()
8、在groovy文件夾下創建一個package,包名隨便起,就叫com.fish好了,然後在裡面new一個groovy類就叫FirstPlugin好了,並且讓FirstPlugin實現Plugin接口,這個Plugin是org.gradle.api.Plugin。然後實現apply接口,加點代碼,最後代碼如下,我們創建了一個task叫做showTipTask,task在funny這個group內(我們可以對task進行分組,待會會明白),showTipTask只是打印出一行文字。description是對這個task的描述,當用戶執行./gradlew tasks會顯示出來。
package com.fish

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

/**
 * Created by fish on 17/1/24.
 */
class FirstPlugin implements Plugin {
    void apply(Project project) {
        def showTipTask = project.tasks.create("showTips") << {
            println('hello I am the first custom plguin')
        }
        showTipTask.group = "funny"
        showTipTask.description = "Hello baby"

    }
}
9、此時plugin已經有了,就是FirstPlugin,我們需要把他傳到Maven Central或者jcenter上,這樣大家都可以用了,這裡只是個demo,我就不上傳了,我把他放在本地。如何配置:
在build.gradle內加如下代碼,這些代碼事件上是定義了一個task叫uploadArchives,執行uploadArchives就會把gradle插件打包然後上傳到本地或者遠端。
apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri('repo'))
        }
    }
}
10、此時可以嘗試生成插件,執行uploadArchives這個任務就行,有2種方法。方法1是點擊view-tool windows-gradle,在右邊找到uploadArchives,找不到的話可以點擊藍色刷新按鈕刷新一下,如下所示

\
方法2是還可以在IJ的terminal窗口執行./gradlew uploadArchives,推薦使用這種方法,可以看到清楚的日志,特別是失敗時日志信息很關鍵

10、不幸的是,失敗了,日志如下

Starting a Gradle Daemon (subsequent builds will be faster)
:compileJava UP-TO-DATE
:compileGroovy FAILED

FAILURE: Build failed with an exception.

可以用./gradlew uploadArchives --stacktrace看更詳細的信息,得到信息如下所示

Caused by: groovy.lang.GroovyRuntimeException: Conflicting module versions. Module [groovy-all is loaded in version 2.4.7 and you are trying to load version 2.3.11
        ... 10 more

看來是有2個groovy-all,原來IJ依賴了我默認的groovy是2.4.7版本的,然後這裡工程又依賴了2.3.11版本的,所以當然會出錯了,解決方法是在build.gradle裡注釋掉compile 'org.codehaus.groovy:groovy-all:2.3.11'這行代碼。

11、我們再執行./gradlew uploadArchives --stacktrace又會發現如下問題,miss了一個file,想想漏了什麼,我們沒有指明pluginId

\

補上它,在main/resources下創建META-INF/gradle-plugins文件夾,在裡面建一個properties文件,文件名隨便起(包名格式),比如就叫com.apple.propeties,文件裡配置類名

implementation-class=com.fish.FirstPlugin

好了run it,此時插件就生成了,生成的插件是主要是jar包和配置文件,結構如下

\

使用插件

現在插件已經寫好了,怎麼使用他呢?
new一個AS工程,叫UseShip好了。然後在根目錄的build.gradle加依賴 classpath 'com.netease:ship:1.0'
,在app的build.gradle加apply plugin: 'com.apple'
。現在插件就導進來了,我們在執行apply plugin: 'com.apple'
的時候會調用FirstPlugin的apply方法,在apply方法內我們定義了一個showTipTask,這個task在funny這個group下,來,我們驗證下,如下所示 ,果然找到了這個task

\

此時可以在terminal下執行./gradlew showTips,得到了正確結果,顯示 “hello I am the first custom plguin”

192:UseShip fish$ ./gradlew showTips
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html.
Incremental java compilation is an incubating feature.
:app:showTips
hello I am the first custom plguin

BUILD SUCCESSFUL

Total time: 9.344 secs

其他

我們這裡pluginId故意起的跟GroupId、ArtifictId沒什麼關系,是為了區分清楚,但實際上他們往往是關聯的。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved