该方法会做一个while循环一直等待找到一个跟用户提供的或者默认的序列号吻合的设备知道超时,如果找到了该设备就会以该设备作为参数去构造一个AdbChimpDevice的实例对象并返回:

  • 133行: 进入while循环,如果在超时时间内还没有连接上目标设备的话就一直循环下去

  • 128和132行: 每次循环如果没有连接上目标设备的话就睡眠0.2秒再进行下次循环

  • 119行: 根据提供的设备序列号(正则表达式)查找目标Device设备,去哪里查找呢?其实就是去DeviceMonitor监控线程对象维护的最新Device设备队列中查找

  • 122行: 找到目标Device设备后,将该设备对象传进去到AdbChimpDevice的构造函数中去实例化AndroidChimpDevice对象并返回。我们往下会看到AdbChimpDevice在实例化的过程中会去实现ChimpManager对象来启动monkey进行通信

往下我们先重点分析119行findAttachedDevice是如何根据设备序列号找到目标Device对象的,然后再去分析AdbChimpDevice是如何构造起来的。我们先进入到findAttachedDevice方法中:

 

99   private IDevice findAttachedDevice(String deviceIdRegex)  

100   {  

101     Pattern pattern = Pattern.compile(deviceIdRegex);  

102     for (IDevice device : this.bridge.getDevices()) {  

103       String serialNumber = device.getSerialNumber();  

104       if (pattern.matcher(serialNumber).matches()) {  

105         return device;  

106       }  

107     }  

108     return null;  

109   }  

代码8-6-4 AdbBackend - findAttachedDevice

 

在第3节分析“启动AndroidDebugBridge”的过程中我们已经学习了AdbBackend在初始化AndroidDebugBridge对象后会将该实例保存到自身的bridge成员对象里面,所以这个方法做的事情就是通过这个AndroidDebugBridge实例去获得所有最新的Device设备列表(102行),然后比对每个Device设备的序列号和参数提供的时候吻合,如果是的话就返回(103-105行)。

我们先看下是怎么获得设备列表的:

482   public IDevice[] getDevices()  

483   {  

484     synchronized (sLock) {  

485       if (this.mDeviceMonitor != null) {  

486         return this.mDeviceMonitor.getDevices();  

487       }  

488     }  

489   

490     return new IDevice[0];  

491   }  

代码8-6-5 AdbBackend - getDevices

 

AndroidDebugBridge对象起启动DeviceMonitor设备监控线程对象后会将该对象保存起来到mDeviceMonitor成员变量里面,这些我们在前面都学习过了。这里AndroidDebugBridge的getDevices方法就是去DeviceMonitor对象中调用其getDevices方法来获取最新的设备列表的:

 

129   Device[] getDevices()  

130   {  

131     synchronized (this.mDevices) {  

132       return (Device[])this.mDevices.toArray(new   

Device[this.mDevices.size()]);  

133     }  

134   }  

代码8-6-6 DeviceMonitor - getDevices