往下我们先重点分析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
在第4节“启动设备监控线程DeviceMonitor”中我们已经学习了当DeviceMonitor在往ADB服务器发送监控命令“host:track-devices”后,一旦监控到有设备新增加或者移除或者状态变化等,就会将设备的改动更新保存到mDevices这个Device列表里面。以上方法返回的就是这一整个列表。
代码8-6-4 AdbBackend - findAttachedDevice中,findAttachedDevice在获得这个设备列表后,会取出每个设备的序列号来和目标设备序列号进行对比查找直接找到吻合的设备才返回,那么我们看下其对应的获取序列号的方法device.getSerialNumber():
244 public String getSerialNumber()
245 {
246 return this.mSerialNumber;
247 }
代码8-6-7 Device - getSerialNumber
直接返回的就是Device设备保存的mSerialNumber变量,这个变量就是代表了对应设备的序列号。大家应该还记得第4节”启动设备监控线程DeviceMonitor”中分析到“processIncomingDeviceData”方法时,一旦ADB服务器将最新的设备列表发送过来的时候就会取出每个设备的序列号和设备状态来初始化Device设备来把该设备的序列号,设备状态保存到该Device设备对应的mSerialNumber和mStat成员变量中。