为什么gradle任务以错误的顺序运行?

时间:2019-05-06 05:32:46

标签: android gradle build.gradle adb

我想在UI测试后运行用于从android设备复制屏幕截图的任务。 我在模块中添加了build.gradle:

tasks.whenTaskAdded { task ->
    if (task.name == 'connectedMyAppDebugSources') {
        task.finalizedBy {
            // here is my task
        }
    }
}

当我使用此任务时:

def fetchScreenshotsTask = task('fetchScreenshots', type: Exec, group: 'reporting') {
    executable "${android.getAdbExe().toString()}"
    args 'pull', '/sdcard/Pictures/screenshots/.', reportDirectory
}

任务最后运行,但是如果测试在多个设备上运行,则此任务不起作用。 然后,我创建了一个任务,该任务获取所有正在运行的设备的ID,并为每个设备运行另一个复制任务:

task fetchScreenshotsForAllDeviceTask(group: 'reporting') {

String result = ""
new ByteArrayOutputStream().withStream { os ->
    def output = exec {
        executable "${android.getAdbExe().toString()}"
        args 'devices'
        standardOutput = os
    }
    result = os.toString()

}

List list = result.split('\n')
            .collect {it.split('\t').head()}
            .drop(1)

for(String item: list) {
    createDir(item)
    copy(item)
    clear(item)
    }
}

这是每个设备的“复制”任务:

def copy(String device) {
    def copyTask = exec {
        executable "${android.getAdbExe().toString()}"
        args '-s', item, 'pull', '/sdcard/Pictures/screenshots/.', reportDirectory
    }
}

问题是: 当我将fetchScreenshotsForAllDeviceTask任务插入到块中时,它将在测试开始时运行:

 task.finalizedBy {
            // here is my task
        }

如果将“ fetchScreenshotsTask”放在同一块中,它将在最后运行。

1 个答案:

答案 0 :(得分:0)

任务fetchScreenshotsForAllDeviceTask(group:'reporting')在配置阶段gradle生命周期中运行。 要在执行阶段运行此任务,需要在doLast块中运行此任务,或在任务中添加“ <<”:

task fetchScreenshotsForAllDeviceTask(group: 'reporting') << {
//here is task code
}