android 事件生成录制脚本

简介: 引用: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语法规则与代码格式的内容,以实现测试人员期望的动作或流程。

相关文章
|
2月前
|
Android开发
如何用Airtest脚本无线连接Android设备?
如何用Airtest脚本无线连接Android设备?
|
4月前
|
XML Java Android开发
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
39 0
|
4月前
|
XML Java Android开发
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
74 0
“framework必会”系列:Android Input系统(一)事件读取机制
曾经在开发的很长一段时间内,笔者对点击事件的认知只存在于自定义View中的`onTouchEvent`等方法的处理。 后来慢慢的接触到`Android的事件分发机制`,但也只是在**Activity->ViewGroup->View**层面的分发逻辑
|
1天前
|
Android开发 内存技术
Android 通过tinyalsa调试解决录制和播放音频问题
Android 通过tinyalsa调试解决录制和播放音频问题
6 1
|
1天前
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
6 0
|
2天前
|
Linux Shell Android开发
自动化脚本之GPIO/LED相关适用于Android/Linux
自动化脚本之GPIO/LED相关适用于Android/Linux
13 0
|
4月前
|
XML 编解码 算法
Android开发音效中录制WAV音频和录制MP3音频的讲解及实战(超详细 附源码)
Android开发音效中录制WAV音频和录制MP3音频的讲解及实战(超详细 附源码)
66 0
|
4月前
|
小程序 JavaScript 前端开发
微信小程序(十七)小程序监听返回键跳转事件(安卓返回也适用)
onUnload:function(){ wx.redirectTo({ url: '../index/index' }) wx.navigateTo({ url: '../index/index' }) wx.switchTab({ url: '../../member/member' }) }
305 0
|
4月前
|
XML 存储 Java
Android 开发音频录播中媒体录制器MediaRecorder和媒体播放器MediaPlayer的讲解及实战(超详细 附源码)
Android 开发音频录播中媒体录制器MediaRecorder和媒体播放器MediaPlayer的讲解及实战(超详细 附源码)
42 0