2017-04-26 53 views
0

我的Android項目已經配置了不同的產品口味:如何過濾和執行特定的Gradle任務?

productFlavors { 
    devtracking { 
     dimension trackingFlavorDimension 
    } 

    livetracking { 
     dimension trackingFlavorDimension 
    } 

    stagingwebservice { 
     dimension webserviceFlavorDimension 
    } 

    livewebservice { 
     dimension webserviceFlavorDimension 
    } 

    playstore { 
     dimension brandDimension 
    } 

    fdroid { 
     dimension brandDimension 
    } 
} 

我怎麼能寫,只有建立release打造爲devtracking味道的任務嗎? 「過濾器」已準備就緒 - 我如何才能真正執行已過濾的任務?請注意,現在「過濾器」已在配置時執行。

task assembleDevtrackingRelease { 
    description "Assembles all Devtracking release builds." 
    group = "Build" 
    android.applicationVariants.all { variant -> 
     if (variant.name.contains("DevtrackingRelease")) { 
      println(variant.name) 
      // TODO Execute this variant 
     } 
    } 
} 

回答

0

隨着Selvin和mirceanis有很大的幫助,我終於想出了這個解決方案:

// Creates a parent task for a set of sub tasks. 
// Sub tasks are collected based on the given task name part. 
def createVariantBatchTask(taskNamePart, taskPrefix = "assemble", taskGroup = "Build") { 
    String taskName = "${taskPrefix}${taskNamePart.capitalize()}" 
    Task task = tasks.create(taskName) 
    task.description "${taskPrefix.capitalize()}s all $taskName builds." 
    task.group taskGroup 

    android.applicationVariants.all { variant -> 
     if (variant.name.toLowerCase().contains(taskNamePart.toLowerCase())) { 
      Task variantTask = tasks.findByName("${taskPrefix}${variant.name.capitalize()}") 
      if (variantTask != null) { 
       task.dependsOn variantTask 
      } 
     } 
    } 
} 

createVariantBatchTask("devtrackingRelease") 
createVariantBatchTask("devtrackingDebug") 

可能的改進:移動到一個自定義任務類buildSrc

0
task installDevtrackingReleaseFlavors() { 
    android.applicationVariants.all { v -> 
     if (v.name.endsWith('DevtrackingRelease')) { 
      String name = v.name.capitalize() 
      dependsOn "install$name" 
     } 
    } 
} 
+0

我不想'安裝'任務。當我調用'./gradlew tasks'時,我不想自動運行它。 – JJD

+1

它看起來像一個很好的軌道...改變安裝組裝,然後這個任務應該運行所有'assembleXXXXXXXDevtrackingRelease'任務...這個答案看起來像[Android Gradle Recipes for Android code]的副本(https://books.google.pl /books?id=10pODAAAQBAJ&pg=PA79&lpg=PA79&dq=android.applicationVariants.all+%7B+v + - %3E +如果+(v.name.endsWith()+%7B +字符串+名稱+%3D + v.name.capitalize() + dependsOn +安裝$名稱+%7D +%7D與源= BL&OTS = qKM0lIEMhK與SIG = iknp-r56E9kfKSFRLaqPc2OH4hE&HL = PL&SA = X&VED = 0ahUKEwjNzu__5sHTAhXJ1xQKHScECh8Q6AEIIzAA#v = onepage&q&F = FALSE),而不必更改您的requeriments – Selvin

+0

我不明白:該行執行的變種特定的任務?此外,電子書指出我需要添加一個'doLast'模塊來執行命令。 – JJD