1. 程式人生 > >為Android Studio編寫自定義Gradle外掛的教程

為Android Studio編寫自定義Gradle外掛的教程

Google已經建議Android開發全部轉向Android Studio開發,Android Studio 是使用gradle編譯、打包的,那麼問題來了,gradle可是有一堆東西...,為了徹底瞭解gradle,今天就來學習下如何寫自己的gradle外掛(當然外掛原始碼是使用groovy寫的),先看如下程式碼目錄:

2016224145421168.png (326×201)

如上圖所示,plugin目錄是外掛原始碼目錄,sample是用來測試外掛的。


1、在目錄plugin/src/main/groovy/com/micky/gradle/下新建外掛類MyCustomPlugin.groovy

package com.micky.gradle; 
 
import org.gradle.api.*; 
 
class MyCustomPlugin implements Plugin<Project> { 
  void apply(Project project) { 
    project.task('myTask') << { 
      println "Hi this is micky's plugin" 
    } 
  } 
} 

看看Plugin的原始碼,其實就是一介面

public interface Plugin<T> { 
  /** 
   * Apply this plugin to the given target object. 
   * 
   * @param target The target object 
   */ 
  void apply(T target); 
} 


2、在目錄plugin/src/main/resources/META-INF/gradle-plugins/下建立檔案com.micky.mycustom.properties用來指定外掛實現類

implementation-class=com.micky.gradle.MyCustomPlugin 

   特別注意下:檔名“com.micky.mycustom”即是以後我們在使用外掛時的apply plugin 'java' 的java,這裡我也是折騰了半天才得出的結果,坑啊。


3、一般情況下,我們還需要指定外掛專案名稱,在plugin目錄下新建settings.gradle

rootProject.name='gradle-micky' 

4、萬事具備,就差編譯了,編譯需要在plugin目錄下新建build.gradle

apply plugin: 'groovy' 
apply plugin: 'maven' 
 
dependencies { 
  compile gradleApi() 
  compile localGroovy() 
} 
 
repositories { 
  mavenCentral() 
} 
 
group='com.micky' 
version='1.0.0' 
 
uploadArchives { 
  repositories { 
    mavenDeployer { 
      repository(url: uri('../repo')) 
    } 
  } 
} 

在這個腳本里使用groovy外掛編譯groovy原始碼,宣告gradleAPI作為即時編譯依賴,apply plugin: 'maven' 是用來建立一個外掛jar檔案並且儲存在本地maven庫裡,本地maven庫即我們在腳本里建立的"../repo"目錄
執行命令:  

gradle uploadArchives

2016224145611491.png (559×192)

5、以上4個步驟已經編譯外掛並上傳到了本地庫中,接下來就看看怎麼使用外掛,在sample目錄下,新建build.gradle

buildscript { 
  repositories { 
    maven { 
      url uri('../repo') 
    } 
  } 
 
  dependencies { 
    classpath group: 'com.micky', 
      name: 'gradle-micky', 
      version: '1.0.0' 
  } 
} 
 
apply plugin: 'com.micky.mycustom' 

6、執行命令

2016224145636115.png (507×113)

myTask即我們在MyCustomPlugin.groovy程式碼中建立的任務。

7、自定義Task

(1)copy一份改名CustomPluginTask

在plugin\src\main\groovy\com\micky\gradle目錄建立原始檔 MyCustomTask.groovy

package com.micky.gradle; 
 
import org.gradle.api.DefaultTask 
import org.gradle.api.tasks.TaskAction 
 
class MyCustomTask extends DefaultTask { 
  @TaskAction 
  void output() { 
    println "Hello this is my custom task output" 
  } 
} 

(2)修改MyCustomPlugin.groovy

package com.micky.gradle; 
 
import org.gradle.api.*; 
 
class MyCustomPlugin implements Plugin<Project> { 
  void apply(Project project) { 
    project.task('customTask', type: MyCustomTask) 
  } 
} 

(3)修改plugin目錄下的build.gradle,修改版本號

apply plugin: 'groovy' 
apply plugin: 'maven' 
 
dependencies { 
  compile gradleApi() 
  compile localGroovy() 
} 
 
repositories { 
  mavenCentral() 
} 
 
group='com.micky' 
version='1.0.1' 
 
uploadArchives { 
  repositories { 
    mavenDeployer { 
      repository(url: uri('../repo')) 
    } 
  } 
} 

執行gradle uploadArchives 編譯外掛包
        
(4)sample目錄下的build.gradle

buildscript { 
  repositories { 
    maven { 
      url uri('../repo') 
    } 
  } 
 
  dependencies { 
    classpath group: 'com.micky', 
      name: 'gradle-micky', 
      version: '1.0.1' 
  } 
} 
apply plugin: 'com.micky.mycustom'  

執行gradle customTask 結果如下:

2016224145747922.png (563×125)


8、向Plugin Task 傳遞引數
(1)拷貝一份上面的程式碼,改名為CustomPluginTaskWithParam,修改plugin\src\main\groovy\com\micky\gradle\MyCustomPlugin.groovy

package com.micky.gradle; 
 
import org.gradle.api.*; 
 
class MyCustomPluginExtension { 
  def message = "From MyCustomPluginExtention" 
  def sender = "MyCustomPluin" 
} 
 
class MyCustomPlugin implements Plugin<Project> { 
  void apply(Project project) { 
    project.extensions.create('myArgs', MyCustomPluginExtension) 
    project.task('customTask', type: MyCustomTask) 
  } 
} 

(2)修改plugin\src\main\groovy\com\micky\gradle\MyCustomTask.groovy

package com.micky.gradle; 
 
import org.gradle.api.DefaultTask 
import org.gradle.api.tasks.TaskAction 
 
class MyCustomTask extends DefaultTask { 
  @TaskAction 
  void output() { 
    println "Sender is ${project.myArgs.sender},\nmessage: ${project.myArgs.message}" 
  } 
} 

       
(3)修改plugin/build.gradle

apply plugin: 'groovy' 
apply plugin: 'maven' 
 
dependencies { 
  compile gradleApi() 
  compile localGroovy() 
} 
 
repositories { 
  mavenCentral() 
} 
 
group='com.micky' 
version='1.0.2' 
 
uploadArchives { 
  repositories { 
    mavenDeployer { 
      repository(url: uri('../repo')) 
    } 
  } 
} 

        執行gradle uploadArchives 編譯外掛包    

(4)修改sample/build.gradle

buildscript { 
  repositories { 
    maven { 
      url uri('../repo') 
    } 
  } 
 
  dependencies { 
    classpath group: 'com.micky', 
      name: 'gradle-micky', 
      version: '1.0.2' 
  } 
} 
 
apply plugin: 'com.micky.mycustom' 

(5)執行gradle customTask,結果如下:

2016224145851154.png (558×129)

(6)在gradle檔案配置引數

buildscript { 
  repositories { 
    maven { 
      url uri('../repo') 
    } 
  } 
 
  dependencies { 
    classpath group: 'com.micky', 
      name: 'gradle-micky', 
      version: '1.0.2' 
  } 
} 
 
apply plugin: 'com.micky.mycustom' 
 
myArgs { 
  sender='Micky Liu' 
  message='Gradle is so simple.' 
} 

 
(7)執行gradle customTask,結果如下:

2016224145926554.png (561×131)

8、向Plugin Task 傳遞巢狀試複雜引數
(1)拷貝一份上面的程式碼,改名為CustomPluginTaskWithNestParam,修改plugin\src\main\groovy\com\micky\gradle\MyCustomPlugin.groovy

package com.micky.gradle; 
 
import org.gradle.api.*; 
 
class MyNestPluginExtension { 
  def receiver = "Kate Zhou" 
  def email = "[email protected]" 
} 
 
class MyCustomPluginExtension { 
  def message = "From MyCustomPluginExtention" 
  def sender = "MyCustomPluin" 
} 
 
class MyCustomPlugin implements Plugin<Project> { 
  void apply(Project project) { 
    project.extensions.create('myArgs', MyCustomPluginExtension) 
    project.myArgs.extensions.create('nestArgs', MyNestPluginExtension) 
    project.task('customTask', type: MyCustomTask) 
  } 
} 

(2)修改MyCustomPlugin.groovy

package com.micky.gradle; 
 
import org.gradle.api.DefaultTask 
import org.gradle.api.tasks.TaskAction 
 
class MyCustomTask extends DefaultTask { 
  @TaskAction 
  void output() { 
    println "Sender is ${project.myArgs.sender} \nmessage: ${project.myArgs.message}" 
    println "Receiver is ${project.myArgs.nestArgs.receiver} \nemail: ${project.myArgs.nestArgs.email}" 
  } 
} 

(3)修改plugin/build.gradle

apply plugin: 'groovy' 
apply plugin: 'maven' 
 
dependencies { 
  compile gradleApi() 
  compile localGroovy() 
} 
 
repositories { 
  mavenCentral() 
} 
 
group='com.micky' 
version='1.0.3' 
 
uploadArchives { 
  repositories { 
    mavenDeployer { 
      repository(url: uri('../repo')) 
    } 
  } 
} 

(4)執行gradle uploadArchives 編譯外掛包
(5)修改sample/build.gradle

buildscript { 
  repositories { 
    maven { 
      url uri('../repo') 
    } 
  } 
 
  dependencies { 
    classpath group: 'com.micky', 
      name: 'gradle-micky', 
      version: '1.0.3' 
  } 
} 
 
apply plugin: 'com.micky.mycustom' 
 
myArgs { 
  sender='Micky Liu' 
  message='Gradle is so simple.' 
} 

          
(6)執行執行gradle customTask,結果如下:

2016224150016512.png (561×156)

(7)在gradle檔案配置引數

buildscript { 
  repositories { 
    maven { 
      url uri('../repo') 
    } 
  } 
 
  dependencies { 
    classpath group: 'com.micky', 
      name: 'gradle-micky', 
      version: '1.0.3' 
  } 
} 
 
apply plugin: 'com.micky.mycustom' 
 
myArgs { 
  sender='Micky Liu' 
  message='Gradle is so simple.' 
  nestArgs { 
    receiver='David Chen' 
    email='[email protected]' 
  } 
 
} 

(8)執行gradle customTask,結果如下:

2016224150049182.png (563×154)

  原始碼地址:https://github.com/mickyliu945/GradleCustomPlugin

相關推薦

Android Studio編寫定義Gradle外掛教程

Google已經建議Android開發全部轉向Android Studio開發,Android Studio 是使用gradle編譯、打包的,那麼問題來了,gradle可是有一堆東西...,為了徹底瞭解gradle,今天就來學習下如何寫自己的gradle外掛(當然外掛原始碼是使用groovy寫的),先看如下

Android如何定義Gradle外掛

Android-如何自定義gradle外掛 自定義gradle外掛可以實現定製自己的構建流程,以達到複用目的; 1. 自定義外掛方式 自定義外掛有三種方式 新增腳步 在你的app專案的build.gradle中直接使用groovy腳步語言編寫外掛

Android studio 使用定義mk檔案編譯jni專案

最近將公司ndk專案從eclipse遷移到as,為了方便省事,直接使用原有mk檔案。參考網路資料,順利完成遷移工作。現貼出使用自定義mk檔案的關鍵程式碼,mark以備後面使用。 buildTypes { release { minifyEna

Android Studio建立定義jks簽名檔案(Mac os系統)

1,開啟你的專案,選擇Build-->Generate singed APK-->到達所需要的介面,如圖所示: 2,到達所需介面如圖所示: 注意:2,顯示的介面的呈現結果是因為我已經建立過jks檔案了,如果你沒有建立過的話就在圖2中箭頭所指的“Create new

Android Studio 打包定義apk檔名

使用Android Studio打包的時候,我們有時候需要自定義apk的檔名,在此記錄一下。 在app的build.gradle中,根節點下使用關鍵詞def宣告一個全域性變數,用於獲取打包的時間,格式可自定義,如下所示: 然後,在android節點中新增以下程式碼,注意:Gradle 3.0.0之前和3

Android Studio使用定義Android.mk檔案編譯ffmpegyuv-bgr

概述 最近做專案的時候,領導安排一個任務,讓測試一下,用ffmpeg中的yuv轉bgr函式的速度。之前編譯so庫大部分都是用eclipse,本次博主花了兩天時間,在Android studio上編譯並執行,在此做一下記錄。 設定Android Studio ndk 1、開啟setings

Android Studio新增定義類註釋模板 定義方法註釋模標

註釋模板 給類註釋或者方法註釋肯定要有的,但是系統自帶的又很不適用,那怎麼辦呢?看下方 類註釋模板 第一種方法 開啟Android Studio後,點選File -> Settings -> Editor -> File and Code Te

Android studio定義Android Studio方法註釋模板

前言 你們從Eclipse轉到Android Studio的時候,是不是會懷念Eclipse的方法註釋模版? 敲/**加回車,模板就出來了,而Android Studio卻不能自定義(或者我沒有找到) 現在我找到替代方法了,就是用live templates 步驟

定義 Gradle 外掛學習記錄

參考:https://juejin.im/entry/577bc26e165abd005530ead8 ## 建立Model 1.在Android studio 中建立Model,切換到project模式; 2.刪除model下的除build.gradle檔案和src/main目錄以

定義Gradle外掛(一)

Google已經建議Android開發全部轉向Android Studio開發,Android Studio 是使用gradle編譯、打包的,那麼問題來了,gradle可是有一堆東西...,為了測底瞭解gradle,今天就來學習下如何寫自己的gradle外掛(當然外掛原

Android Studio 生成定義apk、aar名稱

在Android studio中預設生成的apk、aar的名稱都是app-release.apk、app-debug.apk、app-release.aar、app-debug.aar。通過修改app下的build.gradle可以自定義生成的apk、aar名稱一、自定義ap

安卓開發通過定義Gradle外掛實現自動化埋點

一 埋點現狀: 公司APP在實際開發中埋點是一個很碎片化的問題,我總結了以下幾點: 1.變化快,埋點文件經常變化,開發人員不得不修改程式碼,造成了一定的風險 2.頁面埋點之前是通過把握Activity和Fragment的生命週期實現大部分的統一配置,但是這裡面又牽扯到 Fr

【AndroidStudio】定義gradle外掛:無需釋出,僅用於當前專案

最近由於工作需要,想要做個gradle外掛輔助一下,各種難易程度的講解文章也看了不少,腦子裡的資訊比較亂,在這抽個時間整理一下。 因為是最近剛接觸gradle外掛的製作,剛開始除錯的時候構造的是可釋出的外掛模組,每次修改都得重新發布到本地,麻煩死了~ 在這裡提供一個免釋出

定義gradle外掛從入門到放棄

       最近參與基礎架構組的crashly收集專案,其中一個環節就是收集專案中使用到的公司內部的依賴庫和混淆後的mapping檔案, 然後呼叫python檔案實現檔案和資料欄位的上傳。請求網路上傳資料這塊python使用的程式碼量非常少就幾行程式碼的事情,所以我在專案中

擁抱 Android Studio 之五:Gradle 外掛開發

 轉載處:http://geek.csdn.net/news/detail/64058 實踐出真知 筆者有位朋友,每次新學一門語言,都會用來寫一個貪吃蛇遊戲,以此來檢驗自己學習的成果。筆者也有類似體會。所謂紙上得來終覺淺,絕知此事要躬行。這一章,筆者將以開發和釋出一

定義Gradle外掛(二)

上一篇部落格已經介紹瞭如何實現簡單的自定義gradle外掛,今天介紹如何自定義Task。 一、自定義Task          1、直接沿用上一篇的程式碼,copy一份改名CustomPluginTask          在plugin\src\main\groov

Android Studio定義註釋模板及顏色(基於TODO)

前言 最近在開發安卓專案時,發現 TODO 註釋(// todo) 更能起到提醒的作用,於是我將自己覺得重要的程式碼部分也用 todo 高亮出來,效果還不錯。 但是這樣做會有一個缺點,就是意義上有些混亂,todo 的原意是提醒該完成而未完成的事情,而我想要的

使用AndroidStudio定義Gradle外掛

1.概述 目標:編寫一個Gradle外掛,學習自定義Gradle外掛。 功能:利用lint自動刪除無用資源。 實現思路:先執行lint任務,通過解析生成的xml檔案,找到id為UnusedResources的檔案路徑,並遍歷刪除,輸出日誌。 開發工具:Andr

定義Gradle外掛和AspectJ實戰

生成gradle外掛步驟 create new Module select Android Library 把生成的module(例如:plugin)裡面的東西都刪除(除了build.gradle,但是要被gradle裡面的所有內容刪除) 在plugin

ionic和ionic2 環境下編寫定義cordova外掛

1 增加android的平臺 對於一個ionic專案,在主目錄下通過以下命令列增加android平臺。 cordova platform add android 然後在platforms目錄下就會出現一個android資料夾: 之後可以使用配置了