第14章5节《MonkeyRunner源代码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer执行状态

上一小节我们描写叙述了HierarchyViewer是怎样组建ADB协议命令来实现ViewServer的port转发的。在port转发设置好后,下一个要做的事情就是去检測目标设备端ViewServer线程是否已经启动起来了。我们进入setupViewServer调用的DeviceBridge的isViewServerRunning方法:

165     public static boolean isViewServerRunning(IDevice device) {
166         final boolean[] result = new boolean[1];
167         try {
168             if (device.isOnline()) {
169                 device.executeShellCommand(buildIsServerRunningShellCommand(),
170                         new BooleanResultReader(result));
171                 if (!result[0]) {
172                     ViewServerInfo serverInfo = loadViewServerInfo(device);
173                     if (serverInfo != null && serverInfo.protocolVersion > 2) {
174                         result[0] = true;
175                     }
176                 }
177             }
178         } catch (TimeoutException e) {
               ...
187         }
188         return result[0];
189     }

代码14-5-1 DeviceBridge - isViewServerRunning

关键代码是上面的169行,通过Device类的实例来往ADB服务器发送对应的命令来检測ViewServer是否已经在执行。

device.executeShellCommand在前面章节已经分析过了,就是用来发送”adb shell”命令的。

我们看下buildIsServerRunningShellCommand方法。看这个命令是怎样组织起来的:

235     private static String buildIsServerRunningShellCommand() {
236         return String.format("service call window %d", SERVICE_CODE_IS_SERVER_RUNNING);
237     }

代码14-5-2 DeviceBridge - buildIsServerRunningShellCommand

而全局变量 SERVICE_CODE_IS_SERVER_RUNNING 的定义是:

 48     private static final int DEFAULT_SERVER_PORT = 4939;
 49     // These codes must match the auto-generated codes in IWindowManager.java
 50     // See IWindowManager.aidl as well
 51     private static final int SERVICE_CODE_START_SERVER = 1;
 52     private static final int SERVICE_CODE_STOP_SERVER = 2;
 53     private static final int SERVICE_CODE_IS_SERVER_RUNNING = 3;

代码14-5-3 DeviceBridge - 全局变量演示样例

236行整出来的这一串不就是”service call window 3”嘛。

所以结合device.sendShellCommand,其实就是往设备发送了命令”adb shell service call window 3”,上一章我们才用它来查询ViewServer的执行状态了!

注:很多其它文章请关注公众号:techgogogo或个人博客http://techgogogo.com。当然,也很欢迎您直接微信(zhubaitian1)勾搭。本文由天地会珠海分舵原创。转载请自觉,是否投诉维权看心情。

时间: 2024-10-23 22:09:06

第14章5节《MonkeyRunner源代码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer执行状态的相关文章

第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览

在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事件源来学习事件源的框架结构.首先,要理解事件源,必须先搞清楚几个问题: 事件从哪里来? Monkey的事件来源有多个方面,可是作为MonkeyRunner框架的一部分,它的事件来源主要是来自MonkeyRunner通过网络Socket(USB/TCP协议)发送过来的命令字串.MonkeySource

第14章4节《MonkeyRunner源代码剖析》 HierarchyViewer实现原理-装备ViewServer-port转发

在初始化HierarchyViewer的实例过程中,HierarchyViewer会调用自己的成员方法setupViewServer来把ViewServer装备好,那么我们这里先看下这种方法: 39 private void setupViewServer() { 40 DeviceBridge.setupDeviceForward(mDevice); 41 if (!DeviceBridge.isViewServerRunning(mDevice)) { 42 if (!DeviceBridg

第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程

到此为止我们描述的MonkeyRunner对应用的点击拖放等操作都是直接通过指定坐标点来实现的,比如下面触摸一个坐标点为(60,90)的按钮的脚本例子: 1 device.touch(60,900,MonkeyDevice.DOWN_AND_UP) 代码14-1-1 直接使用坐标点操作应用 这样子做的话代码会存在以下几大缺点: 缺乏易用性:要操作某个控件之前需要先想办法如通过工具来定位该控件的坐标点 可扩展性差:当屏幕分辨率改变的时候需要另外写一个通用算法来处理坐标点的变化 可读性差:代码到处都

第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数

MonkeyRunnerStarter是MonkeyRunner启动时的入口类,由于它里面包括了main方法.它的整个启动过程主要做了以下几件事情: 解析用户启动MonkeyRunner时从命令行传输进来的參数: 由于MonkeyRunner须要依据指定的參数才干做事情,比方输入的一个须要执行的脚本. 假设确实不知道不论什么參数的话它就会进入MonkeyRunner的交互模式,事实上就是Jythong的交互模式,让用户能够边写代码边执行 启动AndroidDebugBridge: 事实上就是启动

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

这里如果你对java熟悉的话其实很简单,就是根据控件属性的名字对properties列表进行一次排序而已.如果你对java不熟悉的话,那就要先去查下Collections.sort这个方法是怎么回事了.顾名思义它提供的是对一个集合List的排序功能,但是根据什么来排序呢?这里就涉及到两个概念了: Comparator接口:提供的是一个接口,用户应该去实现该接口来提供列表中两个元素的对比功能 另外一个是匿名类:上面的new Comparator的写法就是建立一个实现了Comparator接口的匿名

老李推荐:第14章7节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-获取版本号 2

代码先是发送”LIST”命令到ViewServer列出所有的打开的窗口,然后把每个窗口都保存起来.342行起按照源码的注释解析就是说:从协议版本3以后开始加入了窗口自动更新的功能,但是在此之前,如果用户想要获得一个获得焦点的窗口的话,需要通过显式的创建一个特殊的哈希值为-1的Window实例来完成.怎么知道它的哈希值是-1呢?请看Window类的getfocusedWindow方法: return new Window(device, "<Focused Window>",

第14章7节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-获取版本号

这里获取的版本号有两个,一个是ViewServer自身的版本号,一个是ViewServer当前使用协议的版本号. 我们这里为什么需要获取ViewServer版本以及其协议版本呢?其实主要原因是ViewServer有些功能在老版本上是不支持的,比如HierarchyViewer在列出当前所有Activity窗口的时候,针对获取焦点的窗口会根据不同的ViewServer协议版本而作不同处理,请看源码示例: 316 public static Window[] loadWindows(IHvDevic

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

老李推荐: 第8章4节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-启动AndroidDebugBridge 上一节我们看到在启动AndroidDebugBridge的过程中会调用其start方法,而该方法会做2个主要的事情: 715行startAdb:开启AndroidDebugBridge 722-723行:初始化android设备监控并启动DeviceMonitor设备监控线程. 其中第一点我们上一小节已经做了详尽分析了,那么我们往下就去分析下第2点. Dev

老李推荐: 第1章1节《MonkeyRunner源码剖析》概述:前言

老李推荐: 第1章1节<MonkeyRunner源码剖析>概述:前言 前言 相信大家做过安卓移动平台UI自动化开发的必然会用过,至少听过MonkeyRunner这个名字.MonkeyRunner是一个针对安卓平台的UI自动化测试框架,这个框架的其中一个但绝不是唯一的优点是支持用当今非常流行和高效的Python语言来进行脚本开发.同时,它相比Instrumentation框架或者基于Instrumentation的自动化测试框架最大的优点之一就是可以跨应用测试. 这本书不会有什么序言或者致谢什么