Android與Gradle(一):Gradle外掛開發

為什麼不問問神奇的滑稽呢發表於2017-12-21

試試神奇的Gradle吧

Gradle是一個基於Apache Ant和Apache Maven概念的專案自動化構建工具。

這是比較官方的說法,對於大多數Android開發者來說,也許根本不關心構建或者不瞭解構建過程,也就是在按下“執行”按鈕後的“一瞬間”裡自動完成的。事實上在Android Studio中,這些工作都是由Gradle來做的。

我們能夠在appbuild.gradle裡邊看到大量的配置程式碼:

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.em.codegen"
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    ...
}
複製程式碼

在Eclipse中開發的時候,大多數資訊都是寫在manifest.xml檔案中的。

為什麼要用Gradle

作為一個開發者,自動化專案就是日常開發的一部分。如果構建程式碼和其他程式碼一樣,能夠被擴充套件、測試和維護,那豈不爽哉? 沒錯,Gradle就是那種你要找的構建工具。

Gradle引人注目的特質

  1. 可表達的構建語言和底層的API
  2. Gradle就是Groovy
  3. 靈活的約定
  4. 可擴充套件的構建
  5. 輕鬆的可擴充套件性 ...

巴拉巴拉巴拉巴拉,我就不多說了,這些教科書式的定義如果你想看,那麼請參看**《實戰Gradle》(電子工業出版社)。對我們Androider來說,感覺最爽的是compile '...'**,我想你知道我在說什麼(滑稽),程式猿都很懶的,別跟我講你很勤快。

為什麼從Gradle外掛開發說起

筆者在專案過程中使用了GreenDAO這個資料庫框架,發現它的大致結構是一個Gradle外掛加上一個Java庫。

這是我原先的猜測,但後來檢視了原始碼才知道,它用的是freemarker模版生成框架。我起初誤以為它是使用的類似於JCodeModel這樣的框架,花了大量的時間去學習JCodeModel的用法才知道完全是白費功夫-.-

projectbuild.gradle檔案中新增了如下引用:

classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
複製程式碼

appbuild.gradle檔案中新增了如下引用:

apply plugin: 'org.greenrobot.greendao'
...
compile 'org.greenrobot:greendao:3.2.0'
複製程式碼

在開發者自定義好實體類,然後打上註解,然後點選build,GreenDAO外掛會根據註解的實體類在app的build目錄下生成相應的DAO類,然後開發者就可以在程式碼中呼叫這個生成的DAO類了。

我想到了實際專案中應該可以用得到這種思路,於是查閱了各種資料,然後實踐,最後成功的實現了類似的功能。特此做一個筆記,以後肯定能用得到。

開發環境一覽

以下內容因為開發環境的版本差異,可能會出現些許不同,因此僅作參考。

名稱 版本 備註
JDK 1.8.0_91
Android Studio 2.3.3
gradle 3.3 Android Studio 2.3.3自帶的gradle版本

揚帆起航

BuildSrc

首先,新建一個Android專案,名稱隨意,版本隨意。

建好了之後將Android檢視切換到Project檢視,如下,無關緊要的都打上了碼,當它們不存在就好了:

Project檢視

專案根目錄下新建一個目錄buildSrc,然後在buildSrc目錄下新建如下圖結構的資料夾:

目錄結構

基本結構就是src->main->groovy->com.em(你的外掛專案包名),也許現在你看到的跟我的圖不太一樣,不要緊,接著往後面看。

buildSrc根目錄下新建檔案build.gradle,雙擊開啟,新增以下程式碼:

apply plugin: 'groovy'
	
dependencies {
    compile gradleApi()
    compile localGroovy()
}
複製程式碼

然後開啟專案根目錄下開啟settings.gradle,在**':app'**後邊新增程式碼:

, ':buildSrc'
複製程式碼

注意有逗號哦,新增完成後,提示如下內容,意思就是gradle檔案已經修改,請同步,點選Sync Now開始同步:

同步提示

同步完成後,神奇的事情發生了,你會看到buildSrc目錄下的檔案發生了“翻天覆地”的變化:

buildSrc標準目錄

groovy已經被Android Studio所接受,識別為groovy程式碼根目錄了。

外掛開發“環境”搭建

在前面的步驟中,外掛開發的基本環境已經搭建完成了,外掛所需要的程式碼都是建立在包com.em下的。

在剛才的包裡新建檔案MyPlugin.groovy,並新增如下程式碼:

package com.em

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

class MyPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        //這裡寫外掛的邏輯
    }
}
複製程式碼

這段程式碼就是Groovy,所謂的Java的“加強版”,如果你還不知道Groovy,那麼你可以自行學習一下Groovy,這裡就不展開說明了。Gradle開發所使用的語言一般是Groovy,或者混合了Java。(Groovy程式碼中可以直接呼叫Java程式碼)

簡單外掛開發

apply函式中新增程式碼:

project.tasks.create(name: 'hello') {
	println 'hello'
}
複製程式碼

直接開啟app目錄下的build.gradle,在上方新增:

import com.em.MyPlugin//按照包名.類名引用外掛類
apply plugin: MyPlugin//啟用外掛
複製程式碼

新增完成之後點選彈出的提示中的Sync Now,開啟Gradle Console視窗,往上翻,可以看到:

自定義task輸出

那麼一個簡單外掛就做好了,前面說明的內容包括任務定義(task)、應用外掛。你也許會問,為什麼你看到的android外掛是這樣應用的:

apply plugin: 'com.android.application'
複製程式碼

因為它有一個名字,這裡的引用方式是引用它的名字,這個名字是唯一的。

自定義外掛名稱

main目錄下新建資料夾META-INF,然後在META-INF下新建資料夾gradle-plugins。接下來要給外掛命名,建議的名稱格式是包名.外掛自定義名稱,比如剛才定義的外掛名稱就應該是com.em.mp。名字定好了之後就在剛才建立的資料夾下新建檔案com.em.mp.properties,完成後的目錄結構應該與下圖結構相似:

外掛命名

開啟檔案com.em.mp.properties,新增外掛定義:

implementation-class=com.em.MyPlugin//等號右邊就是前文定義的外掛類的完整包名+類名
複製程式碼

這樣名字就定義好了,那麼在appbuild.gradle中就可以採用類似於android外掛的方式引用了:

apply plugin: 'com.em.mp'
複製程式碼

自定義Gradle外掛,外掛命名已經實現了。在buildSrc中直接自定義是最簡單的外掛開發方式,可以直接進行外掛程式碼測試。如果你開發的外掛是要上傳到Maven伺服器,給別人用的,建議就不要使用這種方式了,當然你可以先使用這種方式做好外掛並完成測試,保證不出錯誤的情況下,把開發完成的程式碼拷貝到預釋出的專案目錄下進行程式碼打包上傳。


本篇文章僅代表個人觀點,難免會有疏漏或者謬誤之處,歡迎批評指正。

系列

  1. Gradle外掛開發
  2. 外掛打包上傳到Maven伺服器

相關文章