Gradle for Android系列之三 tasks

ChuckChenLw發表於2017-01-07

  在之前第一篇文章中說過,Gradle最重要的概念是project和tasks,而一個Project也可以說只是包含了多個task的容器,所以在gradle中tasks的重要性不言而喻了。為了更好的介紹Android中常用的tasks,先來介紹task的基本知識。

  我們可以在app的build.gradle檔案中定義兩個簡單task分別hello,hello1:
  

task hello <<{
    print("hello task")
}

task hello1 {
    doLast{
        print("hello task")
    }
}

  hello中的“<<”表示追加的意思,即向hello中加入執行過程。我們還可以使用doLast來達到同樣的效果,如hello1。
  同步之後,我們可以在Android Studio的Gradle標籤頁看到可以使用的task,我們定義的在other下:
     Gradle for Android系列之三 tasks
    
    Gradle for Android系列之三 tasks

  雙擊相應的task,task將會邊執行,例如我們雙擊hello,那麼我們可以得到以下結果:
  這裡寫圖片描述
   列印出了hello task,得到了我們想要的結果。
   注:這裡我們也可以通過命令列執行gradlew tasks命令得到我們可以使用task。

  從上邊的小例子可以看出,Gradle建立task還是非常自然,非常簡單的,上面的task關鍵字實際上是一個方法呼叫,該方法屬於project。project中存在多個過載的task()方法。並且我們在呼叫這些方法可以不用將引數放在括號裡面。這裡還要介紹一個概念TaskContainer,我們自定義的2個task都位於TaskContainer中,project中的tasks屬性即表示該TaskContainer。接著看下邊的例子:
   

task showTasks {
   println tasks.class
   println tasks.size()
}

  該task主要列印了TaskContainer的資訊和其包含的task的數量,我們在沒有加入hello,hello1和加入之後的結果作比較:
  這裡寫圖片描述
  
  這裡寫圖片描述
  可以看出tasks的型別為

class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated

  在加入hello,hello1這兩個task之前tasks的size為14,加入之後為16。這裡還要說名一下計算的size是包括showTasks本身的。
  在上文中我們講到,通過task()方法建立的Task都被存放在了TaskContainer中,而project又維護了一個TaskContainer型別的屬性tasks,那麼我們也可以通過create()方法直接向TaskContainer裡面新增Task:
  

tasks.create(name: 'hello2') <<{
    print("hello2 task")
}

  同時,task之間也是可以相互依賴的,例如我要定義一個hello3的task依賴hello這個task,我們可以這樣寫:
  

task hello3(dependsOn: hello) {
    print("hello3 task");
}

  關於tasks的基本知識就介紹這麼多了。下面來看一下Android 常用的tasks。從上邊的截圖我們可以清楚的看到,當建立一個Android工程時,這個工程將包含android tasks,build tasks,build setup tasks,help tasks,install tasks,verification tasks等。平時我們用的比較多是build tasks,因為它包含了apk打包相關的task:
  assemble/assembleDebug/assembleRelease:針對每個版本/debug版/Release版建立一個apk。
  clean :清除所有的構建任務的output,包含apk檔案
  check: 執行Lint檢查並且能夠在Lint檢測到錯誤後停止執行
  build :執行assemble和check
  connectedCheck: 在測試機上執行所有測試任務
  deviceCheck :執行所有在遠端裝置上的測試任務
  installDebug和installRelease :在裝置上安裝一個Debug/Release版本
  關於assemble,還要說明一點,我們還可以根據要發版的渠道定義相對應的assemble,舉個例子,我們想要在豌豆莢釋出,那麼我們可以定義一個assembleWanDouJia來輸出釋出到豌豆莢的apk。
  build task依賴於check任務,但是不依賴於connectedCheck或者deviceCheck,執行check任務時Lint會產生一些相關檔案,可以在app/build/outputs中檢視。
  在上文已經講過,除了上邊已經存在的task,我們還可以自己定義。這需要結合自己的需求了。Gradle For Android中的tasks就先講到這兒了,下一篇我準備將一下依賴包的管理。
  

相關文章