第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动6

这一部分的代码逻辑关系是这样的:

  • 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

 


你可能感兴趣的:(软件测试开发)