Cts框架解析(6)-任务的运行

前两篇讲了任务的加入和9大项配置,这篇讲任务的运行。

任务的运行

任务的运行在CommandScheduler的run方法中,所以删除全部的断点,在run方法中打上断点,重新启动启动debug:

先看while循环以下的第一行代码

ExecutableCommand cmd = dequeueConfigCommand();
private ExecutableCommand dequeueConfigCommand() {
        try {
            // poll for a command, rather than block indefinitely, to handle shutdown case
            return mCommandQueue.poll(getCommandPollTimeMs(), TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            CLog.i("Waiting for command interrupted");
        }
        return null;
    }

从队列中取出第一个对象。假设队列中没有元素那就返回null。返回后,while中会推断假设为null的话,就会结束再次调用

ExecutableCommand cmd = dequeueConfigCommand();

直到cmd不为null。

所以在

IDeviceSelection options = cmd.getConfiguration().getDeviceRequirements();

打上断点,按F8,程序会在cmd不为null时进入到上面的代码,停下来。

首先得到系统设备要求,依据该要求,推断是否有满足要求的设备并分配该设备。

原生的 要求就一个S/N号,ddms会依据该SN号分配一个IDevice,然后cts依据IDevice包装成ITestDevice对象返回。然后依据ITestDevice,IDeviceManager和ExecutableCommand開始真正的启动任务。

我们先不急于讨论运行的过程。而是继续向下看:

addInvocationThread(invThread);
if (cmd.isLoopMode()) {
    addNewExecCommandToQueue(cmd.getCommandTracker());
}

先将正在运行的线程存到set中,然后将该命令再次放入任务队列中。这种目的是为了能循环运行该任务。假设依据sn号没有分配成功ITestDevice,则会再次尝试一次,假设在规定时间内还没找到设备则放弃。

最后做一些tearDown操作。然后将case运行过程中的log保存到文件。就算运行完了。

如今回头看一下运行任务的线程中是怎样操作的:

private InvocationThread startInvocation(IDeviceManager manager, ITestDevice device,
            ExecutableCommand cmd) {
        final String invocationName = String.format("Invocation-%s", device.getSerialNumber());
        InvocationThread invocationThread = new InvocationThread(invocationName, manager, device,
                cmd);
        invocationThread.start();
        return invocationThread;
    }

InvocationThread为CommandScheduler私有内部类。继承与线程,这就属于线程里启动线程。所以直接看InvocationThread的run方法就ok了。在run方法里调用了ITestInvocation的invoke方法:

传入的对象分别为ITestDevice、IConfiguration、IRescheduler。前两个已经涉及到,最后一个IRescheduler是什么?自己看吧,也没啥意义。这样任务的前期的工作都已经搞定了。程序转到了TestInvocation的invoke方法。放到下一篇文章来讲,由于它非常重要,相当于一个调度室的作用。

总结

写了6篇,总结一些cts的过程。

任务的開始点是接受命令行中的參数。假设推断为运行cts任务,那么会在Console.run方法中启动加入命令任务的线程ArgRunnable<CaptureList>和运行任务的线程CommandScheduler。加入任务线程ArgRunnable<CaptureList>会调用CommandScheduler对象方法addCommand来向ConditionPriorityBlockingQueue<ExecutableCommand>(採用先进先出的队列)这个队列中加入。而运行任务线程CommandScheduler会通过调用自己的私有方法dequeueConfigCommand来从

ConditionPriorityBlockingQueue<ExecutableCommand>去取可运行的任务,每次取第一个。

然后调用InvocationThread这个线程去运行任务。

InvocationThread这个线程调用TestInvocation.invoke方法去运行任务。

明确了么。事实上非常easy。

时间: 2024-10-12 09:48:44

Cts框架解析(6)-任务的运行的相关文章

Cts框架解析(2)-cts调试环境的搭建

上一篇文章中说了怎样在windows搭建cts以及执行cts进行測试.这篇文章来讲讲怎样在eclipse中配置源代码,进行debug调试. 下载 cts源代码地址:https://android.googlesource.com/platform/cts 能够使用git下载到本地. 文件夹结构 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFC

Cts框架解析(5)

解析配置文件 Cts框架分为9大部分: cmd_options:命令行接受的参数选项,command包中. device_requirements:设备相关要求,device包中 device_options:设备参数,device包中 builde_provider:版本提供者,build包中 target_preparer:预置条件准备,targetprep包中 test:测试类型,存在testtype包中 device_recovery:任务执行过程中设备异常后的设备恢复,device包中

Cts框架解析(9)-IDeviceRecovery

当设备处于offline状态时,cts框架就要调用IDeviceRecovery接口类去做相应的恢复工作. 接口 /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the Licens

Cts框架解析(7)-任务执行的调度室

TestInvocation /** * {@inheritDoc} */ @Override public void invoke(ITestDevice device, IConfiguration config, IRescheduler rescheduler) throws DeviceNotAvailableException, Throwable { try { mStatus = "fetching build"; config.getLogOutput().init(

Cts框架解析(1)-windows下cts配置

环境搭建 下载 cts工具的下载地址:http://source.android.com/compatibility/downloads.html windows选择Android4.4 R3 Compatibility Test Suite (CTS) - ARM下载. 文件夹结构 解压后的文件夹结构例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L5L2T/fontsize/400/fil

Cts框架解析(13)-任务执行过程

因为测试任务是个很复杂的过程,所以要单独拿出来讲,里面还涉及了result_reporter的内容.所以这是一个大块.首先把断点打在CtsTest的run方法中,删除其他断点,重新启动debug模式: 首先会调用checkFields检查一下命令行参数.然后生成plan里的包名信息.(要理解plan的意思,plan就是cts目录下plan文件下的xml文件,它里面配置的entry代表一个测试项,一个测试项里又包含多个测试的case).本程序执行的是Signature计划,我们就来看看这个xml文

Cts框架解析(6)-任务的执行

前两篇讲了任务的添加和9大项配置,这篇讲任务的执行. 任务的执行 任务的执行在CommandScheduler的run方法中,所以删除所有的断点,在run方法中打上断点,重启启动debug: 先看while循环下面的第一行代码 ExecutableCommand cmd = dequeueConfigCommand(); private ExecutableCommand dequeueConfigCommand() { try { // poll for a command, rather t

Cts框架解析(3)

cts是建立在tradefederation项目上的,cts中的tradefed-prebuild.jar就是该项目编译后的jar包.在debug调试的时候少不了这个项目,所以现在开始把这个项目添加到eclipse中. 下载 如果有可以翻墙的话,建议下载最新的版本,我上传的tradefederation应该不是最新的,但是我翻不了墙,所以还是拿这个项目debug. 下载地址:http://download.csdn.net/detail/qhshiniba/8050545 配置 下载后解压后的文

Cts框架解析(8)-IBuildProvider

IBuildProvider接口中定义了三个方法 /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of th