日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android自定义task,Android Gradle 自定义Task 详解

發布時間:2023/12/15 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android自定义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

格式:

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() {

@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, 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' 不是內部或外部命令,也不是可運行的程序或批處理文件。

下載完成后,我將壓縮包解壓放在 d 盤的 soft 目錄中。

環境變量

GRADLE_HOME

D:softgradle-4.3-all

Path

D:softgradle-4.3-allgradle-4.3in

參考資料

個人微信號:zhaoyanjun125 , 歡迎關注

總結

以上是生活随笔為你收集整理的android自定义task,Android Gradle 自定义Task 详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。