Android Gradle 自定义Task 详解
轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/76408024
本文出自【趙彥軍的博客】
系列目錄
Android Gradle使用總結
Android Studio 插件開發詳解一:入門練手
Android Studio 插件開發詳解二:工具類
Android Studio 插件開發詳解三:翻譯插件實戰
Android Studio 插件開發詳解四:填坑
Android Gradle 自定義Task 詳解
Android Gradle 自定義Task詳解二:進階
一:Gradle 是什么
- Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化構建工具。
- 它使用一種基于Groovy的特定領域語言(DSL)來聲明項目設置,拋棄了基于XML的各種繁瑣配置。面向Java應用為主。
- 當前其支持的語言限于Java、Groovy、Kotlin和Scala,計劃未來將支持更多的語言。基于 groovy 腳本構建,其 build 腳本使用 groovy 語言編寫。
關于 gradle 相關運用,可以移步 :Android Gradle使用總結
二:groovy 是什么
Groovy是一種動態語言,它和Java類似(算是Java的升級版,但是又具備腳本語言的特點),都在Java虛擬機中運行。當運行Groovy腳本時它會先被編譯成Java類字節碼,然后通過JVM虛擬機執行這個Java字節碼類。
關于 groovy 相關知識,移步到這里:Groovy 使用完全解析
三:Gradle 的 Project 和 Tasks
每次構建(build)至少由一個project構成,一個project 由一到多個task構成。每個task代表了構建過程當中的一個原子性操作,比如編譯,打包,生成javadoc,發布等等這些操作。
gradle : 一個 project 包含多個 task,一個 task 包含多個 Action
project -- task1 (Action1、Action2...)-- task2 (Action1、Action2...)-- ...四:自定義 Task
- 格式:
- 例子
build.gradle
//定義 task , 名字 hello task hello{println "hello world" }//定義 task,名字 hello task(hello2){println "hello world2" }//定義 task,名字 hello3 task ('hello3'){println "hello world3" }- 在終端運行 gradle 命令
五:創建Action
在上面的舉例中,是一個非正式的 task , 說非正式是因為創建的 task 里面沒有 action 。task 本質上又是由一組被順序執行的 Action 對象構成,Action其實是一段代碼塊,類似于Java中的方法。
創建 Action 相關 API
//在Action 隊列頭部添加ActionTask doFirst(Action<? super Task> action);Task doFirst(Closure action);//在Action 隊列尾部添加ActionTask doLast(Action<? super Task> action);Task doLast(Closure action);//已經過時了,建議用 doLast 代替Task leftShift(Closure action);//刪除所有的ActionTask deleteAllActions();小例子
build.gradle
//創建一個名字為hello的 task task hello {//創建一個 Action , 添加到 Action 列表的頭部doFirst(new Action<Task>() {@Overridevoid execute(Task task) {println "action1++++++++++"}})//創建一個 Action , 添加到 Action 列表的頭部doFirst {println "action2++++++++++"}}在 Action 列表中添加了 兩個 Action , Action 列表如下圖所示:
運行 hello task : gradle hello
運行結果:
action2++++++++++ action1++++++++++leftShift 說明
leftShift 的作用和 doLast 一樣,在action 列表尾部添加一個Action,只不過現在過時了,官方建議用 doLast 代替。下面舉個小例子:
build.gradle
task hello {//在 Action 列表尾部添加一個 Action leftShift {println "+++++"} }leftShift 還有一種簡潔寫法,用 << 代替, 如下所示:
build.gradle
task hello <<{//在 Action 列表尾部添加一個 Action println "+++++" }那么問題來了,task 中的 Action 在什么時候執行?
六:Gradle 生命周期
1.初始化階段
會去讀取根工程中 setting.gradle 中的 include 信息,決定有哪幾個工程加入構建,創建 project 實例,比如下面有三個工程: include ‘:app’, ‘:lib1’, ':lib2 。
2.配置階段
會去執行所有工程的 build.gradle 腳本,配置 project對象,一個對象由多個任務組成,
此階段也會去創建、配置task及相關信息。
3.運行階段
根據gradle命令傳遞過來的task名稱,執行相關依賴任務。Task 的 Action 會在這個階段執行。
七:創建 Task 的另外一種方式
在上面講解了創建 task 的基本方式,其實 gradle api 給我們提供了其他的方式創建 task ,下面講解其他兩種方式。
- tasks
build.gradle
//創建 hello2 task tasks.create("hello2"){doFirst {println "hello2+++++"} }- 自定義 DefaultTask 子類
運行 hello3 task: gradlew hello3
輸出
action1+++++
action2+++++
八: Task 依賴
1、dependsOn
build.gradle
task task1 << {println "我是task1----" }task task2 << {println "我是task2----" }//task2 依賴 task1, 執行task2之前先執行task1 task2.dependsOn task1執行 task2
gradlew task2
執行效果
我是task1----
我是task2----
2、mustRunAfter
兩個 task 依賴
task task1 << {println "我是task1----" }task task2 << {println "我是task2----" }//task2 運行之前先運行task1 task2.mustRunAfter task1- 執行 task1 : gradlew task1
我是task1----
- 執行 task2 : gradlew task2
我是task2----
- 同時執行 task1、task2 : gradlew task1 task2
我是task1----
我是task2----
三個 task 相互依賴
build.gradle
task task1 << {println "我是task1----" }task task2 << {println "我是task2----" }task task3 << {println "我是task3----" }task2.mustRunAfter task1 task3.mustRunAfter task1- 執行 gradlew task1 task2 task3
我是task1----
我是task2----
我是task3----
- 執行 gradlew task1 task3 task2
我是task1----
我是task3----
我是task1----
在出現語法矛盾的情況下,依賴關系形成閉環,編譯器會報錯
task1.mustRunAfter task2 task2.mustRunAfter task1[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KlirwnPb-1604565137929)(http://o7rvuansr.bkt.clouddn.com/markdown_test_TIM截圖20171102171717.png)]
3、shouldRunAfter
形成依賴關系可有可無。
build.gradle
task task1 << {println "我是task1----" }task task2 << {println "我是task2----" }task1.shouldRunAfter task2運行: gradlew task1 task2
我是task2----
我是task1----
在出現語法矛盾的情況下,依賴關系形成閉環,會自動打破閉環。不會報錯
九:系統默認 task
gradle 默認提供了很多 task 給我們使用,比如 copy、delete
1、copy
build.gradle
task 任務的名字 (type: Copy) {//action }- Api 介紹
小例子:
- 復制圖片:單一數據源
- 復制圖片:多個數據源
- 復制圖片:過濾文件
只會復制后綴為 .jpg 的文件
task copyImage(type: Copy) {from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy'into 'C:\\Users\\yiba_zyj\\Desktop'include "*.jpg" }- 復制文件:過濾文件,重命名
文件覆蓋規則
相同文件覆蓋
Copy 類的繼承圖
Copy (類)- AbstractCopyTask (抽象類) (from、 into、 include、rename)-ConventionTask(抽象類)- DefaultTask (類)- AbstractTask (抽象類)- TaskInternal (接口)- Task(接口) -Comparable<Task>, ExtensionAware(接口)-Project(接口) (delete 方法)2、Delete
- 刪除 Android 更目錄的aaa 文件
build.gradle
task deleteFile(type: Delete) {//刪除Android 更目錄的aaa 文件delete '../aaa' }- 刪除桌面上的文件
build.gradle
task deleteFile(type: Delete) {//刪除系統桌面 delete delete "C:\\Users\\yiba_zyj\\Desktop\\gradle\\delete" }十:小技巧
1、自定義 task 的名字用駝峰命名法
build.gradle
task deleteFile{//do some things }運行
gradlew dF 等價 gradlew deleteFile
打包時候運行 gradlew assembleRelease,可以簡寫成 gradlew aR
2、常見的 gradlew 命令
查看項目所有默認自帶的 task,不包括自定義 task
gradlew tasks
查看所有 task (默認 task + 自定義task)
gradlew tasks --all
查看某個 task 的相關信息,這些結果包含了任務的路徑、類型以及描述信息等
gradlew help --task taskName
查看 gradle 版本
gradlew -version
3、給task 添加描述 description
task task1 << {description = "這是一段描述信息"println "我是task1----" }十一:Gradle 環境變量配置
在上面的介紹中,運行 task 的方式是用 gradlew , 那我們怎么用 gradle 。如果在終端運行 gradle 就會提示 gradle 不是內部或外部命令,也不是可運行的程序或批處理文件。
'gradle' 不是內部或外部命令,也不是可運行的程序或批處理文件。官網下載:http://services.gradle.org/distributions/
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1Ve6SQLU-1604565137931)(http://o7rvuansr.bkt.clouddn.com/markdown_test_TIM截圖20171102141207.png)]
下載完成后,我將壓縮包解壓放在 d 盤的 soft 目錄中。
環境變量
- GRADLE_HOME
D:\soft\gradle-4.3-all
- Path
D:\soft\gradle-4.3-all\gradle-4.3\bin
參考資料
1、Android Gradle 必備實用技巧
2、Android Gradle使用總結
3、Groovy 使用完全解析
4、深入理解 Android Gradle 詳解
個人微信號:zhaoyanjun125 , 歡迎關注
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RygbeYbg-1604565137933)(http://o7rvuansr.bkt.clouddn.com/weixin200.jpg)]
總結
以上是生活随笔為你收集整理的Android Gradle 自定义Task 详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Studio 插件开发详
- 下一篇: Android Gradle 自定义Ta