前两篇讲了任务的加入和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时进入到上面的代码,停下来。

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

原生的 要求就一个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方法:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

传入的对象分别为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。

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

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

    上一篇文章中说了怎样在windows搭建cts以及执行cts进行測试.这篇文章来讲讲怎样在eclipse中配置源代码,进行debug调试. 下载 cts源代码地址:https://android.go ...

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

    TestInvocation /** * {@inheritDoc} */ @Override public void invoke(ITestDevice device, IConfiguratio ...

  3. Cts框架解析(15)-任务运行完

    case运行完成后.会回到CtsTest的run方法中: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L ...

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

    环境搭建 下载 cts工具的下载地址:http://source.android.com/compatibility/downloads.html windows选择Android4.4 R3 Com ...

  5. Cts框架解析(8)-IBuildProvider

    IBuildProvider接口中定义了三个方法 /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under ...

  6. Cts框架解析(12)-ITargetPreparer

    測试开启前的设备系统准备工作. 接口 /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Ap ...

  7. [转载]iOS 10 UserNotifications 框架解析

    活久见的重构 - iOS 10 UserNotifications 框架解析 TL;DR iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  8. iOS 10 UserNotifications 框架解析

    摘自:https://onevcat.com/2016/08/notification/ iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  9. Poco::TCPServer框架解析

    Poco::TCPServer框架解析 POCO C++ Libraries提供一套 C++ 的类库用以开发基于网络的可移植的应用程序,功能涉及线程.文件.流,网络协议包括:HTTP.FTP.SMTP ...

随机推荐

  1. Java 垃圾回收机制 (分代垃圾回收ZGC)

    什么是自动垃圾回收? 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制.所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象:而未使用中的对象(未引 ...

  2. MySQL sys Schema

    MySQL sys Schema 使用sys Schema的先决条件 使用sys Schema sys Schema Progress Reporting sys Schema Object Refe ...

  3. 8. EVENTS

    8. EVENTS EVENTS表提供有关事件管理器事件的信息,这将在"使用事件调度程序"中讨论. EVENTS表有以下列: - EVENT_CATALOG:事件所属目录的名称.这 ...

  4. debian 添加永久环境变量方法

    添加临时环境变量方法: export PATH=$PATH:/usr/local/....(你的环境变量路径) 永久添加环境变量,步骤如下: #在~/.bashrc文件末尾添加如下: PATH = $ ...

  5. 初识Pyhon

    如果你的系统安装了这两个版本,请使用Python 3 如果没有安装Python,请安装Python 3 主要介绍在windows 64位操作系统上安装Python 3 1. 安装Python 首先,检 ...

  6. 关于java.io.FileNotFoundException: /static/count.txt (No such file or directory) 问题的解决

    这个是BUG网上有三种合理的解释: 1)这个文件在你的程序中可能涉及了读写操作,但是普通用户没有这个权限,所以加上权限就好 chmod count.txt 2)在Linux文件上下层目录是以斜杠 ' ...

  7. 【shell】文本处理的一些小技巧

    一.Shell 二.Sed 三.Awk

  8. jquery select 常用操作总结

    由于在项目各种所需,经常碰到select不种操作的要求,今天特意总结了一下,分享: jQuery获取Select选择的Text和Value: 语法解释: 1. $("#select_id&q ...

  9. Leetcode 300.最长上升子序列

    最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的 ...

  10. linux下程序JDBC连接不到mysql数据库

    今天在linux下部署一个 JavaEE项目的时候总是连接不到Mysql数据库,检查之后发现连接池的配置确定是对的,进入linux服务器之后以mysql -uname -ppassword连接总是报A ...