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

  • 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

转载于:https://blog.51cto.com/10988776/1732580

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

  1. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...

  2. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...

    老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...

  3. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...

    老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...

  4. 老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1...

    老李推荐: 第8章4节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-启动AndroidDebugBridge 上一节我们看到在启动AndroidDebugBri ...

  5. 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 1...

    老李推荐:第6章1节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览 在上一章中我们有简要的介绍了事件源是怎么一回事,但是并没有进行详细的描述.那么往下的这几个 ...

  6. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...

    老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列 事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些事件 ...

  7. 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 1...

    老李推荐: 第3章2节<MonkeyRunner源码剖析>脚本编写示例: MonkeyDevice API使用示例 上一节我们学习了如何通过MonkeyRunner这个类的静态方法wait ...

  8. 老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树 1...

    老李推荐:第14章8节<MonkeyRunner源码剖析> HierarchyViewer实现原理-获取控件列表并建立控件树 poptest是国内唯一一家培养测试开发工程师的培训机构,以学 ...

  9. 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数...

    老李推荐:第8章2节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-解析处理命令行参数 MonkeyRunnerStarter是MonkeyRunner启动时的入 ...

  10. Spring源码剖析——Bean的配置与启动

    IOC介绍   相信大多数人在学习Spring时 IOC 和 Bean 算得上是最常听到的两个名词,IOC在学习Spring当中出现频率如此之高必然有其原因.如果我们做一个比喻的话,把Bean说成Sp ...

最新文章

  1. delphi dbgrid 焦点 行号_火箭VS爵士领衔,多场焦点对决!今日NBA全部比赛视频直播预告...
  2. USB 之三 常用抓包/协议分析工具(Bus Hound、USBlyzer、USBTrace、USB Monitor Pro等)
  3. mPaas 运维流程介绍
  4. android 转场动画兼容问题,【Android】关于ARouter转场动画的问题
  5. VS2017——50G超豪华IDE套餐酸爽体验!
  6. java基础集合操作工具类Collections简述(java集合四)
  7. Oculus关于Internal Error:OVR53225466报错解决方法
  8. AR9285 bt3无线网卡驱动
  9. 太戈编程DEVC++教师答案库
  10. u盘复制文件第二台计算机无文件夹,u盘做成启动盘后拷贝进去的文件不见了怎么办...
  11. matlab 求傅里叶级数,MATLAB傅里叶级数.docx
  12. 力扣刷题 DAY_75 贪心
  13. C#检查网络是否连接的方法
  14. 分频器——秒分频、三分频、五分频、任意分频和偶数分频
  15. Wifi4更换Wifi6路由器的使用体验
  16. iTextSharp5.0页眉页脚及Asp.net预览的实现(PDF导出)
  17. RISC-V的ARTY工程实现
  18. 大话Linux之 跟我走吧,现在就出发[2]Linux我想和你在一起(2)Vim,vim,I love you!有图有真相!
  19. 广度优先搜索:迷宫问题
  20. 【论文笔记】Encoding cloth manipulations using a graph of states and transitions

热门文章

  1. [转]EOS智能合约 私链激活 基本操作
  2. shell脚本编写知识2
  3. lsnrctl start启动监听很慢(AIX平台)
  4. 运维侠客行杭州站沙龙回顾 | 云时代下的运维管理实践(附干货下载)
  5. 飞得更高:(三)人不好招啊
  6. 深入理解 Laravel Eloquent(三)——模型间关系(关联)
  7. 配置VMware ESXi 5事件发送到SYSLOG服务器
  8. NFS的access denied
  9. 面试题:找出出现次数超过1/2和1/3的数
  10. 查看磁盘空间,清理缓存