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

上一节我们看到在启动AndroidDebugBridge的过程中会调用其start方法,而该方法会做2个主要的事情:

  1. 715行startAdb:开启AndroidDebugBridge
  2. 722-723行:初始化android设备监控并启动DeviceMonitor设备监控线程。

其中第一点我们上一小节已经做了详尽分析了,那么我们往下就去分析下第2点。

DeviceMonitor主要的功能就是监控是否有安卓设备拔除或者连接上来,然后对每个连接上来的设备的所有可调式进程进行监控。这个功能更多是给DDMS这个调试工具使用的,大家从AndroidDebugBridge所在的jar包ddmlib.jar应该就能猜到其实DDMS用到的也是这个jar包。

Android的每一个应用程序都是运行在独立的进程中的,且每个进程都是在自己的虚拟机(VM)中运行的,其实这个就基本上是Android操作系统的沙箱(SandBox)的概念了。目的就是以防你的进程到处乱闯搞破坏。每个进程的VM都会提供唯一的一个端口作连接调试器用。DDMS启动时会连接到AndroidDebugBridge(也就是ADB服务器了)。当一个设备被连接时,一个虚拟机在设备上启动或停止时它会通知DDMS,在DDMS和adb之间创建一个虚拟机的监控服务。一旦虚拟机运行,DDMS会通过AndroidDebugBridge的DeviceMonitor线程检索虚拟机的进程ID(pid),并通过设备上的adb守护进程打开一个连接到虚拟机的调试器。这样DDMS就能和虚拟机对话了。

图8-4-1 DDMS界面

DeviceMonitor这个类对于MonkeyRunner框架来说最重要的功能是它保存了一个代表所有连接上来的设备的Device列表,这个Device类非常的重要,基本可以说MonkeyRunner和ADB服务器的沟通最终都是通过它来做的,所以它相当于一个安卓设备在PC端的代理,我们下一章会对这个类做详细的分析。下面我们先看下DeviceMonitor这个类:

图8-4-2 DeviceMonitor类

这个类是ddmlib库的一个类,上面类图列出了DeviceMonitor关键的成员变量和方法,我们先对它们做初步的介绍,这样有利于大家更好的跟随我在下面对这个类的源代码进行分析:

  • mServer: DebugBridgeServer对象,因为需要向ADB服务器发送相应的设备监控命令,所以在DeviceMonitor初始化的时候会把一个DebugBridgeServer实例传进来保存到mServer中
  • mMainAdbConnection: 一个SocketChannel实例,DeviceMonitor在对每个设备进行监控之前需要先和ADB服务器建立链接
  • mDevices: 代表一个安卓设备的Device实例组成的一个列表。注意这个Device在整个MonkeyRunner框架中非常的重要,如前面所述,它基本上可以被看成是真实安卓设备在PC端的一个代理,很多发送给ADB服务器的命令最终都是通过它发送出去的。DeviceMonitor监控线程一旦发现新设备就会建立一个Device实例并放到mDevices列表里面,反之,如果一个设备被移除,就会从mDevices列表中移除
  • start: 一个默认权限的方法,所以可以被同一个ddmlib包里面的AndroidDebugBridge调用。它的作用是启动设备列表监控线程,线程循环主体在下面描述的deviceMonitorLoop方法里面
  • getDevices: 返回上面的mDevices设备。MonkeyRunner类的waitForConnection方法在建立与设备的连接时,最终会调用到这个方法来获得所有设备并根据设备序列号找到目标设备去连接
  • deviceMonitorLoop: 向ADB服务器发送”host:track-devices”设备监控命令来循环获取最新的字串类型的设备列表,这个命令类似于在命令行发送”adb devices”来获得当前连接的设备列表,但是不同的地方是该监控命令发送给ADB服务器后,ADB服务器会周期性的更新设备列表然后主动发送回来。每个循环完成后,如果发现ADB服务器有数据过来,都会调用下面的processIncomingDeviceData方法来作更新mDevices设备列表等事宜
  • sendDeviceListMonitoringRequest:上面的deviceMonitorLoop方法调用来往ADB服务器发送”host:track-devices”设备列表监控命令的方法
  • processIncomingDeviceData:上面的deviceMonitorLoop方法在发现ADB服务器有数据过来的时候会调用这个方法来从与ADB服务器连接的mMainAdbConnection这个SocketChannel中把最新的字串类型设备列表读出来,然后为每个设备实例化一个Device实例并将这些实例放到一个列表中,传送给下面的updateDevices方法来处理
  • updateDevices: 在收到上面processIncomingDeviceData发送过来的最新的Device类型的设备列表后,updateDevices会根据当前持有的mDevices设备列表来检查究竟哪些设备是新增加进来的,哪些是被移除掉的,哪些是状态改变了的来作相应的处理:
    • 新设备: 将该设备加入到DeviceMonitor维护的mDevices设备列表里面,并调用下面的startMonitoringDevice来为该设备的每个可调试应用进程建立一个监控线程来监控该VM进程
    • 设备变成ONLINE状态: 将mDevices设备列表里面对应的设备设置成ONLINE状态,并调用下面的startMonitoringDevice来为该设备的每个可调试应用进程建立一个监控线程来监控该VM进程
    • 设备从ONLINE变成其他状态:将mDevices设备列表里面对应的设备设置成对应状态
    • 移除设备: 将该设备从当前设备列表mDevices中移除掉
  • startMonitoringDevice: 获得对应设备中的所有可调试VM进程的PID列表(可调试进程指的是DalvikVM中每个启动了JDWP线程让DDMS等调试工具连接的进程),连接上每个VM的调试端口并建立对应的客户端监控线程来监控该进程。因为客户端机器下层的JDWP相关的代码主要是给DDMS等监控调试工具使用的,所以本书不会往下作深入分析
  • sendDeviceMonitoringRequest: startMonitoringDevice方法调用本方法来获得指定设备可调试的所有进程的PID,其实发送的就是”track-jdwp“命令

有了以上的基本认识后,我们继续往下分析其代码实现。AndroidDebugBridge启动起来后,下一步就是把这个ADB实例传到DeviceMonitor来去监测所有连接到adb服务器也就是pc主机端的android设备的状态:

70   DeviceMonitor(AndroidDebugBridge server)

71   {

72     this.mServer = server;

73

74     this.mDebuggerPorts.add(Integer.valueOf(DdmPreferences.getDebugPortBase()));

75   }

代码8-4-1 DeviceMonitor构造函数

保存好AndroidDebugBridge实例后,下一步就是继续AndroidDebugBridge启动函数start()启动DeviceMonitor设备监控线程:

79   void start()

80   {

81     new Thread("Device List Monitor")

82     {

83       public void run() {

84         DeviceMonitor.this.deviceMonitorLoop();

85       }

86     }.start();

87   }

代码8-4-2 DeviceMonitor - start

转载于:https://www.cnblogs.com/poptest/p/5089487.html

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

  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. 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 1...

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

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

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

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

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

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

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

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

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

  9. 第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿 ...

最新文章

  1. Linux下三个密码生成工具
  2. XenApp_XenDesktop_7.6实战篇之八:申请及导入许可证
  3. 数据事务四种隔离机制和七种传播行为
  4. 22w+的人选择了这款蓝牙耳机
  5. mysql创建表语句 引擎、编码和字符集设置
  6. 关于Adapter对数据库的查询、删除操作
  7. 设计模式之---Factory
  8. 测试ModelAttribute注解
  9. 集合遍历[设计模式总结] 9. 迭代器模式
  10. [vue-cli] vue-cli工程中常用的npm命令有哪些
  11. FCKeidtor的toolbarset的设置
  12. 【记录】JS回调函数(小例子)
  13. mysql 慢查询日志记录
  14. fork()和多线程
  15. 中医为什么会发明比血管更玄乎的经脉呢
  16. 如何解决您的虚拟主机中有文件触发了安全防护报警规则,可能存在webshell网页木马...
  17. 三阶矩阵的lu分解详细步骤_矩阵的LU分解
  18. Java之while循环基本使用
  19. 使用JS将PDF文档转成图片,一页文档对应一张图片,并支持将图片批量导出!
  20. 打字机效果的实现与应用

热门文章

  1. multipart/form-data ajax 提交问题(未解决)
  2. PowerDesigner生成数据库建表sql脚本
  3. 开发和使用Web用户控件
  4. c#编译器对byte类型的一些规则 (转)
  5. [转载]WebForm下使用 jQuery.loadUserControl异步load用户控件
  6. C#中Cache的使用
  7. javascript运行时问题
  8. 在 Linux 下确认 NTP 是否同步的方法
  9. 使用HttpWebRequest请求API接口以及其他网站资源
  10. htc g12刷机的成功经验--只面向小白