Android智能事件触发器---ApkViewTracer

本文介绍我业余时间开发的一个工具,ApkViewTracer,主要是通过与Android模拟器中View Server通信,可以跟踪并分析模拟器当前Views的状态,可以向指定的某个View发送事件,触发其行为。目前,这个工具主要提供两个功能:
1.      Intelligent event trigger,在apk运行过程中更拟人地更智能地触发其行为,用于辅助Android Application的动态分析。
2.      Automated testing interface,类似于Robotium,提供一组API用于Android UI自动化测试。
(Google Code :http://code.google.com/p/apk-view-tracer/)

想法来源
         关于Mobile上的Application的动态分析。Android为开发者提供的模拟器就是动态分析的容器。动态分析,其目的就是要待分析的application在其运行过程中跑出来所有的实际行为(这当然是所期望的最佳结果,实际上并不可能完全得到)。因此,在apk的运行期间,程序能与之更拟人地交互,更好地触发其行为,是十分重要的。
         Android为开发者提供了Monkey,这只是个简单的命令行程序,它直接运行在模拟器或设备的adb shell下,通过一些参数配置,生成用户或系统的伪随机事件流。主要用于压力测试。
(详见http://developer.android.com/guide/developing/tools/monkey.html)
这样便存在有两个问题:
1.      在屏幕上任意坐标位置处随机触发事件,但其实这些位置并不响应触发事件
2.      触发事件的这个行为是随机的,并没有什么策略,因此可能在规定的运行时间内,它无法触发对人而言更高优先级的view响应事件。

因此,可能需要更拟人地更智能地去触发事件,至少需要有一个可配置的接口可以实现对动态分析更高效的事件流。
       
相关技术
         Android提供了一个工具叫HierarchyViewer,它通过与设备或模拟器中的android view server通信,得到当前设备上的Views的信息,然后构建出一个View Map,并图形化呈现出来。这是我这个工具想法的最初来源。
(详见http://developer.android.com/guide/developing/tools/hierarchy-viewer.html)

         第二个工具是MonkeyRunner,它和Monkey完全不同。如果把现阶段的monkey比做是幼儿园的小孩,那么MonkeyRunner就是一个初中生了。它支持自己编写插件,控制事件,随时截图,简而言之,任何你在模拟器/设备中能干的事情,MonkeyRunner都能干,而且还可以记录和回放。我主要通过它提供的接口来实现对View的操作,以此触发事件。
(详见http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html)

         还有个chimpchat.jar,这个jar包是被MonkeyRunner调用的,它在底层与Androidadb server进行通信,官方没有相关文档,可在Android SDK tools中找其源码。通过使用它,可以完成MonkeyRunner不能完成的操作,对MonkeyRunner的使用是个补充。

程序Intelligent event trigger介绍
对人而言,使用application的过程中,最直观的感受就是图像和文字,若图像和文字中包含有提示性的信息,人通常会按照application的提示去完成操作。
现在的基本策略是,“敏感词优先”策略:如果当前的可点击View列表中,其Text中包含有预定义的敏感词,如“download”,“next”,“click”,“link”等,则优先触发包含敏感词的view的点击事件,没有的话,则随机触发当前可点击View列表。
若当前View到达View Tree的最底层,其往下再没有可响应触发事件的view,则退回到上层,若当前View在规定时间内已退出该apk的view,则可重启该apk,继续运行。

Android智能事件触发器Intelligentevent trigger程序的主要框架如下:

其中Rule Parser模块用来处理外围的规则解析,如运行时事件的分布,事件总数等。
Strategy Parser模块用于解析事件触发的策略,目前只有敏感词优先策略,但支持扩展。
而View Client是与模拟器的Android view server和adb server通信的核心模块,其结构如下:

其中Device Command模块用于与模拟器中Android View Server通信,得到Views的信息。
View Parser用来分析Views信息,得到Views的状态,包括坐标,Text,可点击,可视等。
View Operator通过与Android adb server通信,对Views进行操作,发送事件。

Automated Testing Interface介绍
而同时,我还实现了一组API,可用来做Android的UI自动化测试,其接口均包含在AutomatedTestingInterface.py文件。
其类似于Robotium框架,但Robotium可以说是一个嵌入式框架,需要待测工程的源码,并需要借助于Android的Instrumentation机制才能完成测试。而ApkViewTracer则是运行在模拟器外面,通过与Android View Server和adb server的通信,可以实现完全黑盒的UI自动化测试。

ApkViewTracer 的AutomatedTesting Interface框架

这里View Operator是对之前View Client中的View Operator模块的封装。

下一步要解决的问题
1.      Android本身还存在一些问题:如在有的模拟器中,drag事件可能被Long Click event Listener捕获,因此目前并不完全支持LongClick event 和Drag event。这个好像是Android 的Bug。
2.      Performance问题。我是用python开发的,其中混合有jython的使用。其在模拟器外围,通过与模拟器中的Server通信,来完成各项工作,因此性能也是一个问题。

猜你喜欢

转载自iaiai.iteye.com/blog/2169111