Android Gradle 自定義Task 詳解

来源:http://www.cnblogs.com/zhaoyanjun/archive/2017/12/05/7988965.html
-Advertisement-
Play Games

轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自 "【趙彥軍的博客】" 一:Gradle 是什麼 Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化構建工具。 它使用一種基於 ...


轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/76408024
本文出自【趙彥軍的博客】

一: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

  • 格式:
 task 任務的名字 {
    //do some things
 }
  • 例子

build.gradle

//定義 task , 名字 hello 
task hello{
    println "hello world"
}

//定義 task,名字 hello 
task(hello2){
    println "hello world2"
}

//定義 task,名字 hello3 
task ('hello3'){
    println "hello world3"
}

  • 在終端運行 gradle 命令

//執行 hello task
gradlew hello

//執行 hello2 task
gradlew hello2

//執行 hello3 task
gradlew hello3

五:創建Action

在上面的舉例中,是一個非正式的 task , 說非正式是因為創建的 task 裡面沒有 action 。task 本質上又是由一組被順序執行的 Action 對象構成,Action其實是一段代碼塊,類似於Java中的方法。

創建 Action 相關 API

 //在Action 隊列頭部添加Action
 Task doFirst(Action<? super Task> action);
 Task doFirst(Closure action);

 //在Action 隊列尾部添加Action
 Task doLast(Action<? super Task> action);
 Task doLast(Closure action);
    
 //已經過時了,建議用 doLast 代替
 Task leftShift(Closure action);

 //刪除所有的Action
 Task deleteAllActions();

小例子

build.gradle

//創建一個名字為hello的 task 
task hello {

    //創建一個 Action , 添加到 Action 列表的頭部
   doFirst(new Action<Task>() {
       @Override
       void 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 子類
class MyTask extends DefaultTask {
    
    @TaskAction
    void action(){
        println "action1+++++"
    }
}

//創建 hello3 task
task hello3 (type: MyTask){
    doLast{
       println "action2+++++"
    }
}

運行 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

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 介紹

//數據源目錄,多個目錄
public AbstractCopyTask from(Object... sourcePaths)  

//目標目錄,單一
public AbstractCopyTask into(Object destDir) 

//過濾文件 包含
public AbstractCopyTask include(String... includes)

//過濾文件 排除
public AbstractCopyTask exclude(String... excludes)

//重新命名,老名字 新名字
public AbstractCopyTask rename(String sourceRegEx, String replaceWith)

//刪除文件 Project 介面
boolean delete(Object... paths);

小例子:

  • 複製圖片:單一數據源

task copyImage(type: Copy) {
    from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy'
    into 'C:\\Users\\yiba_zyj\\Desktop'
}
  • 複製圖片:多個數據源

task copyImage(type: Copy) {
    from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' , 
         'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy'
    
    into 'C:\\Users\\yiba_zyj\\Desktop'
}
  • 複製圖片:過濾文件

只會複製尾碼為 .jpg 的文件


task copyImage(type: Copy) {
    from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy'
    into 'C:\\Users\\yiba_zyj\\Desktop'
    include "*.jpg" 
}
  • 複製文件:過濾文件,重命名

task copyImage(type: Copy) {
    from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy'
    into 'C:\\Users\\yiba_zyj\\Desktop'
    include "*.jpg"
    exclude "image1.jpg"
    rename("image2.jpg","123.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/

下載完成後,我將壓縮包解壓放在 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 , 歡迎關註


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 自己負責項目,簡單的搭建一個版本控制庫,選用linux 搭建SVN版本控制器作為公司的項目版本控制庫。廢話不多少,直接進入主題: 工具 yum yum命令是在Fedora和RedHat以及SUSE中基於rpm的軟體包管理器,它可以使系統管理人員交互和自動化地更細與管理RPM軟體包,能夠從指定的 ...
  • [20171205]uniq命令的輸入輸出.txt--//前幾天遇到XXD與通配符問題,鏈接http://blog.itpub.net/267265/viewspace-2147702/--//今天再次遇到uniq命令的輸入輸出問題.$ man uniqUNIQ(1) User Commands U ...
  • 1、關係數據操作 假設我們有兩張表。Table A 是左邊的表。Table B 是右邊的表。其各有四條記錄,其中有兩條記錄name是相同的,如下所示:讓我們看看不同JOIN的不同。 ...
  • 一、深入學習 group by group by ,分組,顧名思義,把數據按什麼來分組,每一組都有什麼特點。 1、我們先從最簡單的開始: select count(*) from tb1 group by tb1.sex; 查詢所有數據的條數,按性別來分組。這樣查詢到的結果集只有一列count(*) ...
  • 1、創建和查看索引 所謂普通索引,就是在創建索引時,不附加任何限制條件(唯一、非空等限制)。該類型的索引可以創建在任何數據類型的欄位上。 (1)創建表時,創建普通索引 語法: 例子: (2)在已經存在的表上創建普通索引 語法: 例子: 2、創建和查看唯一索引 (1)創建表時創建唯一索引 語法: 例子 ...
  • (1) 語句解析時的執行順序創建測試用的 函數create or replace function F1(v_in in varchar2) return varchar2 IS v_out varchar2(20);begin v_out := v_in; dbms_output.put_line ...
  • 1,create like: use a table to create another same table .ex: CREATE TABLE IF NOT EXISTS tb_test4 LIKE tb_test3; 2,event: CREATE EVENT event_test ON SC ...
  • 一.簡介 MongoDB 是一個基於分散式文件存儲的資料庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。 mongoDB mongoDB MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。他支持的數據結構非常鬆散, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...