51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1653|回复: 0
打印 上一主题 下一主题

CTS 设备管理之自动检测设备

[复制链接]
  • TA的每日心情
    奋斗
    2021-8-6 16:14
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2018-4-11 15:44:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    经过三个月的蹉跎,项目终于可以推出1.0版本。中间经历过很多坑,中途我们的主程离职走了,我硬着头皮
    接替了他的工作,从cts框架的启动开始,一点一点地研究源码,debug来debug去,一点一点的理解其中的
    思想,到现在已经能在cts的框架的基础上做二次开发,能简单的认识到cts处理方式。很有幸我一进入自动化
    领域首先认识的是cts这套框架,随着研究的深入越来越佩服开发这套框架的google工程师们。我想说的是,
    做自动化框架开发的人都应该好好研究这个框架,肯定会受益匪浅。其实在学习的时候,我就已经写过好几
    篇文章,我也将其整理成合集,放到了testerhome上。但那个时候毕竟还是懵懂时期,也没有跳出框架从全
    局来考虑,现在刚好有点时间,慢慢的把这几个月的研究成果总结一下。

    设备管理的重要性

    做Android自动化工具开发的都了解,你首先要解决的问题是设备管理问题,在支持 Mult Device的工具中尤
    其重要。新设备的加入、已有设备的断线离线,在执行case的过程中遇到设备离线了如何去恢复等等,都是
    在设备管理范畴之内的。那么cts是如何做到的?

    1.包裹ADB

    1. package com.android.tradefed.device;

    2. import com.android.ddmlib.AndroidDebugBridge;
    3. import com.android.ddmlib.AndroidDebugBridge.IDeviceChangeListener;
    4. import com.android.ddmlib.IDevice;

    5. /**
    6. * A wrapper that directs {@link IAndroidDebugBridge} calls to the 'real'
    7. * {@link AndroidDebugBridge}.
    8. */
    9. class AndroidDebugBridgeWrapper implements IAndroidDebugBridge {

    10.     private AndroidDebugBridge mAdbBridge = null;

    11.     /**
    12.      * Creates a {@link AndroidDebugBridgeWrapper}.
    13.      */
    14.     AndroidDebugBridgeWrapper() {
    15.     }

    16.     /**
    17.      * {@inheritDoc}
    18.      */
    19.     @Override
    20.     public IDevice[] getDevices() {
    21.         if (mAdbBridge == null) {
    22.             throw new IllegalStateException("getDevices called before init");
    23.         }
    24.         return mAdbBridge.getDevices();
    25.     }

    26.     /**
    27.      * {@inheritDoc}
    28.      */
    29.     @Override
    30.     public void addDeviceChangeListener(IDeviceChangeListener listener) {
    31.         AndroidDebugBridge.addDeviceChangeListener(listener);
    32.     }

    33.     /**
    34.      * {@inheritDoc}
    35.      */
    36.     @Override
    37.     public void removeDeviceChangeListener(IDeviceChangeListener listener) {
    38.         AndroidDebugBridge.removeDeviceChangeListener(listener);
    39.     }

    40.     /**
    41.      * {@inheritDoc}
    42.      */
    43.     @Override
    44.     public void init(boolean clientSupport, String adbOsLocation) {
    45.         AndroidDebugBridge.init(clientSupport);
    46.         mAdbBridge = AndroidDebugBridge.createBridge(adbOsLocation, false);
    47.     }

    48.     /**
    49.      * {@inheritDoc}
    50.      */
    51.     @Override
    52.     public void terminate() {
    53.         AndroidDebugBridge.terminate();
    54.     }

    55.     /**
    56.      * {@inheritDoc}
    57.      */
    58.     @Override
    59.     public void disconnectBridge() {
    60.         AndroidDebugBridge.disconnectBridge();
    61.     }
    62. }
    复制代码

    这里实际上用到了代理模式。cts中自定义的类AndroidDebugBridgeWrapper包裹了AndroidDebugBridge,
    我们只需要和AndroidDebugBridgeWrapper交互就行了。然后在AndroidDebugBridge的基础上自定义了一
    些方法。继承的方法中重要的是addDeviceChangeListener和removeDeviceChangeListener这两个方法,
    待会我们就要用到。

    2.启动ADB


    1. public class DeviceManager implements IDeviceManager {

    2.     ......
    3.     private IAndroidDebugBridge mAdbBridge;
    4.     private ManagedDeviceListener mManagedDeviceListener;
    5.     ......
    6.     /**
    7.      * The DeviceManager should be retrieved from the {@link GlobalConfiguration}
    8.      */
    9.     public DeviceManager() {
    10.     }

    11.     /**
    12.      * Initialize the device manager. This must be called once and only once before any other
    13.      * methods are called.
    14.      */
    15.     synchronized void init(IDeviceSelection globalDeviceFilter,
    16.             List<IDeviceMonitor> globalDeviceMonitors, IManagedTestDeviceFactory deviceFactory) {
    17.         ......
    18.         mAdbBridge = createAdbBridge();
    19.         mManagedDeviceListener = new ManagedDeviceListener();
    20.         ......
    21.         mAdbBridge.addDeviceChangeListener(mManagedDeviceListener);
    22.        ......
    23.         mAdbBridge.init(false /* client support */, "adb");
    24.         ......
    25.     }
    26.     /**
    27.      * Creates the {@link IAndroidDebugBridge} to use.
    28.      * <p/>
    29.      * Exposed so tests can mock this.
    30.      * @returns the {@link IAndroidDebugBridge}
    31.      */
    32.     synchronized IAndroidDebugBridge createAdbBridge() {
    33.         return new AndroidDebugBridgeWrapper();
    34.     }
    35. }
    复制代码

    在DeviceManage类的init方法中,首先通过createAdbBridge()方法创建一个 IAndroidDebugBridge对象,其
    实质是刚才定义的AndroidDebugBridgeWrapper对象。这样的话我们就得到了该对象的一个实例,接着我
    们调用了该实例的init方法(其实有2行代码我故意忽略了,后面会隆重登场),这样ADB的初始化工作就完成了。

    3.状态监听器

    1. private class ManagedDeviceListener implements IDeviceChangeListener {

    2.         /**
    3.          * {@inheritDoc}
    4.          */
    5.         @Override
    6.         public void deviceChanged(IDevice idevice, int changeMask) {   
    7.         ......
    8.         }

    9.         /**
    10.          * {@inheritDoc}
    11.          */
    12.         @Override
    13.         public void deviceConnected(IDevice idevice) {  
    14.         ......        
    15.         }

    16.         /**
    17.          * {@inheritDoc}
    18.          */
    19.         @Override
    20.         public void deviceDisconnected(IDevice disconnectedDevice) {
    21.          ......
    22.         }
    23.     }
    复制代码

    在DeviceManager类中定义了一个私有类ManagedDeviceListener,该类实现了ADB中的接口IDeviceChangeL
    istener。该接口实际上是观察者模式中的一个抽象观察者,我们定义的ManagedDeviceListener类是一个具
    体观察者。当我们注册为设备状态的观察者后,设备状态发生变化后,我们会被通知到。这个时候我们隆
    重请出刚才我们忽略的2行代码:

    mManagedDeviceListener = new ManagedDeviceListener();
    ......
    mAdbBridge.addDeviceChangeListener(mManagedDeviceListener);
    这两行代码首先初始化了一个设备状态的具体观察者对象的实例,然后将其添加到通知列表中,这个时候
    ADB设备发生改变后,就会通知我们的对象,其中相应的三个方法deviceChanged,deviceConnected,devic
    eDisconnected会被调用,这个时候我们就可以通过一些处理得到新加入的设备,或者已有设备中离线的
    设备,然后将其删除。这样我们就能很好的监听着设备状态的改变。

    4.得到设备

    既然我们能准确的监听着设备状态的改变,我们就要用一个(或许是多个)容器去保存这些设备。具体的操
    作流程我觉得单独写一篇文章来讲比较好,这样才能对得起它良好的设计。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-20 22:26 , Processed in 0.064325 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表