这一部分的代码逻辑关系是这样的:
344行: 一个外部循环每次从上次保存下来的设备列表获得一个设备Device实例
350行: 再在一个内部循环从最新的设备列表中获得一个设备Device实例
353行:然后分别比较两个设备的序列号是否相等,相等则代表这个设备没有被移除。
357行: 如果设备没有被移除的话,那么判断这个设备是否是状态变化了?
358-373行: 变化了就需要把设备的状态改变过来
363-368行: 特别是在设备变成offline变成online状态后,需要去对该设备里面的可调试进程进行监控
372-373行: 并把该设备标识成还没有获取基本信息的状态,因为每个已经连接的online设备都应该保存有基本的build等信息
379行: 如果分析完一个设备发现只是状态变化了的话,最后把它从新设备列表中删除掉,因为已经分析过了,下面不需要再使用它了
384-388行: 如果设备已经被移除了的话(在新设备列表里面通过序列号找不到了), 那么需要把该设备移除出监控范围
以上代码是设备被移除和设备状态有更新时候的处理,那么新设备该怎么处理呢?毕竟一开始设备都是新的,这个才是关键点。
326 private void updateDevices(ArrayList<Device> newList) {
...
395 // at this point we should still have some new devices in newList, so we
396 // process them.
397 for (Device newDevice : newList) {
398 // add them to the list
399 mDevices.add(newDevice);
400 mServer.deviceConnected(newDevice);
401
402 // start monitoring them.
403 if (AndroidDebugBridge.getClientSupport()) {
404 if (newDevice.isOnline()) {
405 startMonitoringDevice(newDevice);
406 }
407 }
408
409 // look for their build info.
410 if (newDevice.isOnline()) {
411 devicesToQuery.add(newDevice);
412 }
413 }
414 }
415
416 // query the new devices for info.
417 for (Device d : devicesToQuery) {
418 queryNewDeviceForInfo(d);
419 }
420 }
421 newList.clear();
422 }
代码8-4-6 DeviceMonitor - updateDevices处理新增加设备
397行: 对所有剩余没有处理的新设备做一个循环
399行: 把该设备Device对象保留起来,下次有更新的时候需要用来跟新的设备列表做对比,正如代码5-4-5所做的事情
404-405行: 开始对新设备进行监控,其实说白了就是对新设备里面的每个可调式进程的vm建立一个客户端进行监控
418行: 获得新设备的基本信息,这个我们最后来分析
这里我们先重点看405行startMonitoringDevice:
509 private boolean startMonitoringDevice(Device device) {
510 SocketChannel socketChannel = openAdbConnection();
511
512 if (socketChannel != null) {
513 try {
514 boolean result = sendDeviceMonitoringRequest(
socketChannel, device);
515 if (result) {
516
517 if (mSelector == null) {
518 startDeviceMonitorThread();
519 }
520
521 device.setClientMonitoringSocket(socketChannel);
522
523 synchronized (mDevices) {
524 // always wakeup before doing the register. The synchronized block
525 // ensure that the selector won't select() before the end of this block.
526 // @see deviceClientMonitorLoop
527 mSelector.wakeup();
528
529 socketChannel.configureBlocking(false);
530 socketChannel.register(mSelector, SelectionKey.OP_READ, device);
531 }
532
533 return true;
534 }
535 }
... //省略错误处理代码
}
代码8-4-7 DeviceMonitor - startMonitoringDevice