第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动 4

整个方法的功能就是去构建一个发送到ADB服务器请求服务的命令,然后发送,读取结果,返回,错误处理:

  • 275行: 构建发送给ADB服务器的请求获得设备监控服务的命令字串”host:track-devices”, 我们在下一章描述MonkeyDevice实现原理的时候会详细描述formAdbRequest是如何构造一个ADB服务请求命令的

  • 278行: 通过AdbHelper的write方法往上面建立的与ADB服务器连接的SocketChannel mMainAdbConnection写入该请求,而该write方法最终调用的是SocketChannel的write方法往Socket写数据,我们在下一章描述MonkeyDevice实现原理的时候会详细描述

  • 280行: 与写Socket对应的就是读Socket了,发送完命令后就会调用AdbHelper的readAdbResponse方法来把命令发送的结果读取出来返回了, 注意这里读回来的只是命令发送的成功还是失败信息,并不是返回的设备列表。我们在下一章描述MonkeyDevice实现原理的时候会详细描述readAdbResponse这个方法

对应的 AdbHelper相应方法的实现细节我们下一章会详尽描述。这里我们只需要清楚这个方法做的事情就是刚才提到的往ADB服务器发送”host:track-devices”命令去请求相应设备监控服务就够了。那么这个服务请求是怎么回事呢?其实这个在第一章中已经描述过,用来就是让ADB服务器周期性的往客户端,也就是往这里的DeviceMonitor线程发送设备更新列表:

host:track-devices

这个服务是以上的host:devices的一个变种,客户端和ADB服务器的连接会一直保持,当有增加/移除设备或者设备状态改变的时候会主动的往连接上的客户端发送新的设备列表信息(4字节16进制长度+内容)。这样做的话就可以允许DDMS这些工具来实时跟踪所有连接上来的设备的状态,而不需要客户端每次都去连接ADB服务器获取对应信息。

最终这个命令返回格式跟你在命令行调用ADB命令行客户端发送命令”adb devices”,返回来的就是“设备序列号 设备状态”的格式: 图8-4-2 adb devices命令返回结果

注意这里device的状态其实就是oneline, 在ddmlib的IDevice类中有相应的定义:

86   public static enum DeviceState { BOOTLOADER("bootloader"),

 87     OFFLINE("offline"),

 88     ONLINE("device"),

 89     RECOVERY("recovery"),

 90     UNAUTHORIZED("unauthorized");

 91

 92     private String mState;

 93

 94     private DeviceState(String state) {

 95       this.mState = state;

 96     }

代码8-4-6 IDevice - DeviceState

 

“host:track-devices”这个监控请求命令发送一次后就会不停的周期性获得ADB服务器发送过来的设备列表,所以前面的deviceMonitorLoop循环在第一次循环之后其实可以简化成以下几行代码:

155   private void deviceMonitorLoop()

156   {

157     do

158     {

159       try

160       {

...

187         if (this.mMonitoring)

188         {

189           int length = readLength(this.mMainAdbConnection,

this.mLengthBuffer);

190

191           if (length >= 0)

192           {

193             processIncomingDeviceData(length);

194

195

196             this.mInitialDeviceListDone = true;

197           }

198         }

199       }

...

206     } while (!this.mQuit);

207   }

代码8-4-3 DeviceMonitor - deviceMonitorLoop简化版

 


你可能感兴趣的:(软件测试开发)