第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
转载于:https://blog.51cto.com/10988776/1732580
第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动6相关推荐
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...
- 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...
老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...
- 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...
老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...
- 老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1...
老李推荐: 第8章4节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-启动AndroidDebugBridge 上一节我们看到在启动AndroidDebugBri ...
- 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 1...
老李推荐:第6章1节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览 在上一章中我们有简要的介绍了事件源是怎么一回事,但是并没有进行详细的描述.那么往下的这几个 ...
- 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...
老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列 事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些事件 ...
- 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 1...
老李推荐: 第3章2节<MonkeyRunner源码剖析>脚本编写示例: MonkeyDevice API使用示例 上一节我们学习了如何通过MonkeyRunner这个类的静态方法wait ...
- 老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树 1...
老李推荐:第14章8节<MonkeyRunner源码剖析> HierarchyViewer实现原理-获取控件列表并建立控件树 poptest是国内唯一一家培养测试开发工程师的培训机构,以学 ...
- 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数...
老李推荐:第8章2节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-解析处理命令行参数 MonkeyRunnerStarter是MonkeyRunner启动时的入 ...
- Spring源码剖析——Bean的配置与启动
IOC介绍 相信大多数人在学习Spring时 IOC 和 Bean 算得上是最常听到的两个名词,IOC在学习Spring当中出现频率如此之高必然有其原因.如果我们做一个比喻的话,把Bean说成Sp ...
最新文章
- delphi dbgrid 焦点 行号_火箭VS爵士领衔,多场焦点对决!今日NBA全部比赛视频直播预告...
- USB 之三 常用抓包/协议分析工具(Bus Hound、USBlyzer、USBTrace、USB Monitor Pro等)
- mPaas 运维流程介绍
- android 转场动画兼容问题,【Android】关于ARouter转场动画的问题
- VS2017——50G超豪华IDE套餐酸爽体验!
- java基础集合操作工具类Collections简述(java集合四)
- Oculus关于Internal Error:OVR53225466报错解决方法
- AR9285 bt3无线网卡驱动
- 太戈编程DEVC++教师答案库
- u盘复制文件第二台计算机无文件夹,u盘做成启动盘后拷贝进去的文件不见了怎么办...
- matlab 求傅里叶级数,MATLAB傅里叶级数.docx
- 力扣刷题 DAY_75 贪心
- C#检查网络是否连接的方法
- 分频器——秒分频、三分频、五分频、任意分频和偶数分频
- Wifi4更换Wifi6路由器的使用体验
- iTextSharp5.0页眉页脚及Asp.net预览的实现(PDF导出)
- RISC-V的ARTY工程实现
- 大话Linux之 跟我走吧,现在就出发[2]Linux我想和你在一起(2)Vim,vim,I love you!有图有真相!
- 广度优先搜索:迷宫问题
- 【论文笔记】Encoding cloth manipulations using a graph of states and transitions