该方法会做一个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