在第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成员变量中。
在获得比对设备序列号后,findAttachedDevice就会跟提供的序列号进行比对,如果吻合就返回给调用者” 代码8-6-3 AdbBackend - waitForConnection”了。而AdbBackend的waitForConnection在获得这个Device实例后就会把它传到AdbChimpDevice的构造函数中来构造AdbChimpDevice的实例对象。我们看看它的构造函数是怎么做的:
68 public AdbChimpDevice(IDevice device)
69 {
70 this.device = device;
71 this.manager = createManager("127.0.0.1", 12345);
72
73 Preconditions.checkNotNull(this.manager);
74 }
代码8-6-8 AdbChimpDevice构造函数
如前面一直强调的,AdbChimpDevice是一个很重要的类,它是一个高层抽象的设备对象,它组合了代表通过monkey控制的设备ChimpManager和通过ADB控制的设备Device。这个组合关系就是通过上面这个AdnbChimpDevice构造函数体现出来的了。第70行组合的就是Device设备,71行组合的就是ChimpManager实例。只是Device实例是在启动设备监控线程DeviceMonitor中就已经实例化创建好的,而ChimpManager是在这个时候才进行创建的。创建的时候指定的是本机回环IP地址”127.0.0.1”,端口指定是monkey本地转发端口12345
创建ChimpManager的调用createManager的代码有点长,我们会分两部分来进行分析,其中第一部分是启动Monkey,第二部分是创建ChimpManager。我们先看第一部分:
123 private ChimpManager createManager(String address, int port) {
124 try {
125 this.device.createForward(port, port);
126 } catch (TimeoutException e) {
127 LOG.log(Level.SEVERE, "Timeout creating adb port forwarding", e);
128 return null;
129 } catch (AdbCommandRejectedException e) {
130 LOG.log(Level.SEVERE, "Adb rejected adb port forwarding command: " + e.getMessage(), e);
131 return null;
132 } catch (IOException e) {
133 LOG.log(Level.SEVERE, "Unable to create adb port forwarding: " + e.getMessage(), e);
134 return null;
135 }
136
137 String command = "monkey --port " + port;
138 executeAsyncCommand(command, new LoggingOutputReceiver(LOG, Level.FINE));
139
140 try
141 {
142 Thread.sleep(1000L);
143 } catch (InterruptedException e) {
144 LOG.log(Level.SEVERE, "Unable to sleep", e);
145 }
146 InetAddress addr;
147 try
148 {
149 addr = InetAddress.getByName(address);
150 } catch (UnknownHostException e) {
151 LOG.log(Level.SEVERE, "Unable to convert address into InetAddress: " + address, e);
152 return null;
153 }
...
}
代码8-6-9 AdbChimpDevice - createManager之启动monkey