android自定义task,Android Gradle 自定义Task 详解
一:Gradle 是什么
Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化構(gòu)建工具。
它使用一種基于Groovy的特定領(lǐng)域語言(DSL)來聲明項目設(shè)置,拋棄了基于XML的各種繁瑣配置。面向Java應(yīng)用為主。
當(dāng)前其支持的語言限于Java、Groovy、Kotlin和Scala,計劃未來將支持更多的語言。基于 groovy 腳本構(gòu)建,其 build 腳本使用 groovy 語言編寫。
關(guān)于 gradle 相關(guān)運用,可以移步 :Android Gradle使用總結(jié)
二:groovy 是什么
Groovy是一種動態(tài)語言,它和Java類似(算是Java的升級版,但是又具備腳本語言的特點),都在Java虛擬機(jī)中運行。當(dāng)運行Groovy腳本時它會先被編譯成Java類字節(jié)碼,然后通過JVM虛擬機(jī)執(zhí)行這個Java字節(jié)碼類。
關(guān)于 groovy 相關(guān)知識,移步到這里:Groovy 使用完全解析
三:Gradle 的 Project 和 Tasks
每次構(gòu)建(build)至少由一個project構(gòu)成,一個project 由一到多個task構(gòu)成。每個task代表了構(gòu)建過程當(dāng)中的一個原子性操作,比如編譯,打包,生成javadoc,發(fā)布等等這些操作。
gradle : 一個 project 包含多個 task,一個 task 包含多個 Action
project
-- task1 (Action1、Action2...)
-- task2 (Action1、Action2...)
-- ...
四:自定義 Task
格式:
task 任務(wù)的名字 {
//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 命令
//執(zhí)行 hello task
gradlew hello
//執(zhí)行 hello2 task
gradlew hello2
//執(zhí)行 hello3 task
gradlew hello3
五:創(chuàng)建Action
在上面的舉例中,是一個非正式的 task , 說非正式是因為創(chuàng)建的 task 里面沒有 action 。task 本質(zhì)上又是由一組被順序執(zhí)行的 Action 對象構(gòu)成,Action其實是一段代碼塊,類似于Java中的方法。
創(chuàng)建 Action 相關(guān) 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);
//已經(jīng)過時了,建議用 doLast 代替
Task leftShift(Closure action);
//刪除所有的Action
Task deleteAllActions();
小例子
build.gradle
//創(chuàng)建一個名字為hello的 task
task hello {
//創(chuàng)建一個 Action , 添加到 Action 列表的頭部
doFirst(new Action() {
@Override
void execute(Task task) {
println "action1++++++++++"
}
})
//創(chuàng)建一個 Action , 添加到 Action 列表的頭部
doFirst {
println "action2++++++++++"
}
}
在 Action 列表中添加了 兩個 Action , Action 列表如下圖所示:
運行 hello task : gradle hello
運行結(jié)果:
action2++++++++++
action1++++++++++
leftShift 說明
leftShift 的作用和 doLast 一樣,在action 列表尾部添加一個Action,只不過現(xiàn)在過時了,官方建議用 doLast 代替。下面舉個小例子:
build.gradle
task hello {
//在 Action 列表尾部添加一個 Action
leftShift {
println "+++++"
}
}
leftShift 還有一種簡潔寫法,用 << 代替, 如下所示:
build.gradle
task hello <
//在 Action 列表尾部添加一個 Action
println "+++++"
}
那么問題來了,task 中的 Action 在什么時候執(zhí)行?
六:Gradle 生命周期
1.初始化階段
會去讀取根工程中 setting.gradle 中的 include 信息,決定有哪幾個工程加入構(gòu)建,創(chuàng)建 project 實例,比如下面有三個工程: include ':app', ':lib1', ':lib2 。
2.配置階段
會去執(zhí)行所有工程的 build.gradle 腳本,配置 project對象,一個對象由多個任務(wù)組成,
此階段也會去創(chuàng)建、配置task及相關(guān)信息。
3.運行階段
根據(jù)gradle命令傳遞過來的task名稱,執(zhí)行相關(guān)依賴任務(wù)。Task 的 Action 會在這個階段執(zhí)行。
七:創(chuàng)建 Task 的另外一種方式
在上面講解了創(chuàng)建 task 的基本方式,其實 gradle api 給我們提供了其他的方式創(chuàng)建 task ,下面講解其他兩種方式。
tasks
build.gradle
//創(chuàng)建 hello2 task
tasks.create("hello2"){
doFirst {
println "hello2+++++"
}
}
自定義 DefaultTask 子類
class MyTask extends DefaultTask {
@TaskAction
void action(){
println "action1+++++"
}
}
//創(chuàng)建 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, 執(zhí)行task2之前先執(zhí)行task1
task2.dependsOn task1
執(zhí)行 task2
gradlew task2
執(zhí)行效果
我是task1----
我是task2----
2、mustRunAfter
兩個 task 依賴
task task1 << {
println "我是task1----"
}
task task2 << {
println "我是task2----"
}
//task2 運行之前先運行task1
task2.mustRunAfter task1
執(zhí)行 task1 : gradlew task1
我是task1----
執(zhí)行 task2 : gradlew task2
我是task2----
同時執(zhí)行 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
執(zhí)行 gradlew task1 task2 task3
我是task1----
我是task2----
我是task3----
執(zhí)行 gradlew task1 task3 task2
我是task1----
我是task3----
我是task1----
在出現(xiàn)語法矛盾的情況下,依賴關(guān)系形成閉環(huán),編譯器會報錯
task1.mustRunAfter task2
task2.mustRunAfter task1
3、shouldRunAfter
形成依賴關(guān)系可有可無。
build.gradle
task task1 << {
println "我是task1----"
}
task task2 << {
println "我是task2----"
}
task1.shouldRunAfter task2
運行: gradlew task1 task2
我是task2----
我是task1----
在出現(xiàn)語法矛盾的情況下,依賴關(guān)系形成閉環(huán),會自動打破閉環(huán)。不會報錯
九:系統(tǒng)默認(rèn) task
gradle 默認(rèn)提供了很多 task 給我們使用,比如 copy、delete
1、copy
build.gradle
task 任務(wù)的名字 (type: Copy) {
//action
}
Api 介紹
//數(shù)據(jù)源目錄,多個目錄
public AbstractCopyTask from(Object... sourcePaths)
//目標(biāo)目錄,單一
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);
小例子:
復(fù)制圖片:單一數(shù)據(jù)源
task copyImage(type: Copy) {
from 'C:\Users\yiba_zyj\Desktop\gradle\copy'
into 'C:\Users\yiba_zyj\Desktop'
}
復(fù)制圖片:多個數(shù)據(jù)源
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'
}
復(fù)制圖片:過濾文件
只會復(fù)制后綴為 .jpg 的文件
task copyImage(type: Copy) {
from 'C:\Users\yiba_zyj\Desktop\gradle\copy'
into 'C:\Users\yiba_zyj\Desktop'
include "*.jpg"
}
復(fù)制文件:過濾文件,重命名
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")
}
文件覆蓋規(guī)則
相同文件覆蓋
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) {
//刪除系統(tǒng)桌面 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 命令
查看項目所有默認(rèn)自帶的 task,不包括自定義 task
gradlew tasks
查看所有 task (默認(rèn) task + 自定義task)
gradlew tasks --all
查看某個 task 的相關(guān)信息,這些結(jié)果包含了任務(wù)的路徑、類型以及描述信息等
gradlew help --task taskName
查看 gradle 版本
gradlew -version
3、給task 添加描述 description
task task1 << {
description = "這是一段描述信息"
println "我是task1----"
}
十一:Gradle 環(huán)境變量配置
在上面的介紹中,運行 task 的方式是用 gradlew , 那我們怎么用 gradle 。如果在終端運行 gradle 就會提示 gradle 不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件。
'gradle' 不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件。
下載完成后,我將壓縮包解壓放在 d 盤的 soft 目錄中。
環(huán)境變量
GRADLE_HOME
D:softgradle-4.3-all
Path
D:softgradle-4.3-allgradle-4.3in
參考資料
個人微信號:zhaoyanjun125 , 歡迎關(guān)注
總結(jié)
以上是生活随笔為你收集整理的android自定义task,Android Gradle 自定义Task 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全民k歌在线状态怎么隐藏
- 下一篇: 抽不到就告它? 奥地利裁定《FIFA》开