android 事件生成录制脚本

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 引用:http://www.jtben.com/document/919575 https://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&rlz=1C1GPCK_enCN395CN396&q=android+%E5%BD%9...

引用:http://www.jtben.com/document/919575

https://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&rlz=1C1GPCK_enCN395CN396&q=android+%E5%BD%95%E5%88%B6%E8%84%9A%E6%9C%AC&oq=android+%E5%BD%95%E5%88%B6%E8%84%9A%E6%9C%AC&gs_l=serp.3..0i30.4751.5114.0.5414.4.4.0.0.0.0.177.177.0j1.1.0...0.0...1c.1j4.5.serp.Futqp9gfiYI

跳转到:  导航搜索

 

Android 事件录制脚本的生成 

Software R&D Center-SW R&D Dept.-Sec.1
HZSWTL2011008

Prepared by: Andy3 Liu
Jan. 21 2011


目录

[隐藏]

背景

AndroidAutoTest tool是通过ADB shell getevent 命令从android设备获取事件数据来实现事件录制的。然而获取的原始事件数据是字符与16进制数组成的字符串序列,不具备可读性及可修改性。根据项目设计要求,需根据监听结果实时的动态生成可执行的python脚本,以便于后期事件回放。从getevent获取的原始事件数据示例如下:

         4244-540927: /dev/input/event0: 0003 0000 0000009e  
         4244-541083: /dev/input/event0: 0003 0001 000001c7  
         4244-541182: /dev/input/event0: 0001 014a 00000001 
         4244-541283: /dev/input/event0: 0000 0000 00000000  
         4244-573333: /dev/input/event0: 0001 014a 00000000  
         4244-573473: /dev/input/event0: 0000 0000 00000000  
         4246-190284: /dev/input/event0: 0003 0000 00000080  
         4246-190440: /dev/input/event0: 0003 0001 000000a4  
         4246-190541: /dev/input/event0: 0001 014a 00000001  
         4246-190622: /dev/input/event0: 0000 0000 00000000  
         4246-238300: /dev/input/event0: 0001 014a 00000000  
         4246-238454: /dev/input/event0: 0000 0000 00000000  
         4247-704749: /dev/input/event0: 0003 0000 00000084  
         4247-704904: /dev/input/event0: 0003 0001 0000011e  
         4247-705004: /dev/input/event0: 0001 014a 00000001  
         4247-705085: /dev/input/event0: 0000 0000 00000000  
         4247-750322: /dev/input/event0: 0001 014a 00000000  
         4247-750408: /dev/input/event0: 0000 0000 00000000


最终预期转化为类似如下的脚本内容:

         KeyDown(102)
         Delay(17)  
         KeyUp(102)  
         Delay(1563)  
         TouchDown(158,455)  
         Delay(33)  
         TouchUp()  
         Delay(1617)  
         TouchDown(128,164)  
         Delay(48)  
         TouchUp()  
         Delay(1466)  
         TouchDown(132,286)  
         Delay(46)  
         TouchUp()

实现过程

整个过程最主要的工作就是解析事件数据流,即将数据流中解析成一个个完整独立的事件。

数据结构

以下2个类是解析过程中使用的主要数据结构:

EventItem:事件元,表示从设备读取的一行事件数据 Sec_time 事件发生时间的秒数
Ms_time 事件发生时间的微妙数
type 事件类型码
code 扫描码或键值
value
RawInputEvent:一个完整的事件所包含的所有属性,尚未被识别 When (default = -1) 事件发生时间的毫秒数
Type (default = -1) 事件类型码
Keycode (default = -1) 键值
Value (default = -1)
X (default = -1) X坐标值
Y (default = -1) Y坐标值

事件监听数据的获取

事件数据读取是通过调用ddmslib中的IDevice提供的public void executeShellCommand(String command, IShellOutputReceiver receiver, int maxTimeToOutputResponse)接口函数来实现的,此处command参数为:”getevent -t”。自定义一个实现了IShellOutputReceiver接口的MultiLineReceiver子类实例receiver,每当设备有事件发生时,receiver中实现的回调函数processNewLines(String[] lines)就会被调用,其参数lines就是从设备获取到的事件数据。接下来在processNewLines函数中解析lines即可。

监听数据解析

本节描述如何将原始事件数据中解析成事件。此部分由一个EventParse类完成。
由于android模拟器与真是设备以及设备与设备之间的存在差异,读取到的原始事件数据格式往往各不一样,解析起来略有不同,因此需要根据连接设备的不同实现各自的解析器类。以下内容暂基于模拟器。

事件类型

经分析可发现,Android设备的事件可以细分为如下5种基本类型:
KeyDown: 键按下
KeyUp: 键弹起
TouchDown: 触屏按下
TouchMove: 触屏移动
TouchUp: 触屏弹起

其他所有事件都是上述事件中的一种或多种的组合。

事件数据提取

从android设备读取的原始事件流由一行行如:

         422-211293: /dev/input/event0: 001 014a 00000001

的字符串组成,从左到右可以得到如下信息:

sec_time 事件发生时间的秒数
ms_time 事件发生时间的微妙数
deviceId android设备事件输入文件名
type 事件类型码
code 扫描码或键值
value

这样每一行都可以得到一个实例化的EventItem对象。这里一个EventItem对象就表示一个事件元素

事件识别

一个完整的keydown、TouchDown或TouchUp等事件是由一个或多个事件元素组成。通常一个完整的事件产生后会紧跟着一个事件同步行,标志一个完整事件的结束,该行数据由全零组成。开始处理前实例化一个空的RawInputEvent对象,然后我们可以一行一行的如下处理来填充这个对象:

Type Code Value 填充RawInputEvent实例
0x01 code (<0x100) 1 Keycode = code 
Value = 1
0x01 code (<0x100) 0 Keycode = code 
Value = 0
0x01 0x14a 1 Value = 1
0x01 0x14a 0 Value = 0
0x03 1 x X = x
0x03 0 y Y = y
0 0 0 事件完成

当读到一个事件同步行时,一个完整独立的事件就完成了,RawInputEvent实例中已经包含了该事件的完整数据。然后对该实例各属性进行判断来识别事件类型,具体如下:

RawInputEvent事件实例属性 识别结果
Type Keycode Value X Y
1 code 1     KeyDown事件,keycode=code
1 code 0     KeyUp事件,Keycode=code
3   1 x x TouchDown事件,X=x,Y=y
3   0 -1 -1 TouchUp事件
3   -1 x y TouchMove事件,X=x,Y=y

脚本生成

每解析出一个事件,我们就向录制脚本内容中添加一行对应代码,该行是一个已定义好的python函数的语句,表示执行一个事件动作,其参数就是该类型事件所必要的属性。函数与事件类型的对应关系如下:

事件类型 必要属性 Python语句
键按下 键值:Keycode KeyDown(keycode)
键弹起 键值:keycode KeyUp(keycode)
触屏按下 X坐标值:x Y坐标值:y TouchDown(x,y)
触屏弹起 TouchUp()
触屏移动 X坐标值:x Y坐标值:y TouchMove(x,y)

另外,每个事件发生的时间是不同的,两两之间有一定的间隔。在向脚本中新添加一行事件前,首先计算当前添加时间与上一事件的添加事件的差值s,然后插入一行python函数代码:Delay(s),表示两事件之间发生时间的间隔,再将当前事件代码添加进脚本中。

脚本运行

一次录制完成后,得到的脚本内容是由一连串python函数语句组成,示例如下图所示:
Simple-script.png
所有函数均是上一节中提到的6个事件函数中的一个。显然此脚本是无法直接执行的。所有脚本在被执行前都需事先加载一个公用的模块,该模块中定义了若干函数,包括上面6个事件函数。头模块加上录制得到的脚本内容就组成了一个可执行的python脚本,示例如下:
Detail-script.png
脚本录制完成之后执行之前可以被编辑修改,插入一些其他函数或逻辑判断语句等符合python语法规则与代码格式的内容,以实现测试人员期望的动作或流程。

相关文章
|
7月前
|
安全 Shell Android开发
Android系统 init.rc开机执行shell脚本
Android系统 init.rc开机执行shell脚本
1384 0
|
7月前
|
Android开发
如何用Airtest脚本无线连接Android设备?
如何用Airtest脚本无线连接Android设备?
129 0
|
2月前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
2月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
45 1
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
2月前
|
Android开发
Android 事件分发机制详细解读
Android 事件分发机制详细解读
44 5
|
4月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
4月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟悉整套的分发机制有助于更好的分析各种点击滑动失效问题,更好去扩展控件的事件功能和开发自定义控件,同时事件分发机制也是Android面试必问考点之一,如果你能把下面的一些事件分发图当场画出来肯定加分不少。废话不多说,总结一句:事件分发机制很重要。
202 9
|
4月前
|
开发工具 Android开发
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
43 0
|
6月前
|
存储 编解码 Android开发
58. 【Android教程】音频录制:MediaRecord
58. 【Android教程】音频录制:MediaRecord
69 2