zoukankan      html  css  js  c++  java
  • 老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1

    老李推荐: 第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

  • 相关阅读:
    ajax01
    django04
    数据库
    WeakHashMap类
    IdentityHashMap
    Hashtable类
    LinkedHashMap类
    HashMap和TreeMap类
    PriorityQueue
    Synchronized
  • 原文地址:https://www.cnblogs.com/poptest/p/5089487.html
Copyright © 2011-2022 走看看