1、Android Fuzz测试工具 Monkey源代码分析 2013.02 大纲 总体设计架构 问题: 如何运行使用? 如何创建和消费事件? 如何向 Activity注入事件? 如何做监控? 扩展 : IWindowManager事件注入背后! 总结 设计亮点 改进思路 问题 1:如何运行使用? 启动 App,用默认事件比例, 并向其 发送 100个伪 随机事件 (可以自行设置各种事件的比例) 总体设计 问题 2:如何创建和消费事件? 2.1: 主循环 Monkey.runMonkeyCycles 2.2 MonkeySourceRandom如何按比例生成事件 ? 默认比例 generateE
2、vents前据入参调整,规约累加 2.3 事件序列 第一个入队的 Event必然是 ActivityEvent Event序列: Key, Touch, Motion ACTION_DOWN ACTION_MOVE * N ACTION_UP 延时事件 2.4 几种事件的生成方式 Monkey事件体系 2.4.1 MonkeyMotionEvent 含 FACTOR_TOUCH, FACTOR_MOTION 是 一个基于屏幕绝对位置( x, y)的事件序列:ACTION_DOWN/MOVE/UP, MOVE事件序列带有随机性 2.4.2 MonkeyTrackballEvent 原理: 1、先
3、产生 10个随机 MOVE事件 2、再有一定几率产生一个 click事件 2.4.3 MonkeyKeyEvent 原理: 种类 : FACTOR_NAV,FACTOR_MAJORNAV, FACTOR_SYSOPS,NORMAL_KEYS 包含 ACTION_DOWN和 ACTION_UP事件对 2.4.4 MonkeyActivityEvent 1. Monkey.getMainApps()中初始化了可以切换的 App列表:基于 Component 2. 只会触发一个 Application的 入口 Activity 2.4.5 MonkeyFlipEvent 1. 模拟手机设备翻转,每次
4、取反 2. 直接写设备文件来模拟 问题 3. 如何 向 Activity注入事件? Command设计模式 3.1 依赖 WindowManager注入 MotionEvent KeyEvent 3.2 其他 FlipEvent:写设备文件 ActivityEvent: Intent ThrottleEvent:只是 sleep 问题 4、如何做监控: ActivityWatcher ActivityWatcher extends IActivityWatcher 主要监控 Activity的 crash和 ANR事件 问题 4、如何做监控: MonkeyNetworkMonitor Monk
5、eyNetworkMonitor extends IIntentReceiver .Stub 统计运行期 mobile和 wifi连接时长 问题 4、如何做监控: MonkeyNetworkMonitor 为什么监控网络会和 Intent扯上关系? 求证 :每次网络 连接变化 都会 由系统发出广播事件!而 Monkey捕获这类广播! IWindowManager事件注入背后 ! IWindowManager和 WindowManagerService的 binder通信不连接 关系 ? IWindowManager事件注入背后 ! injectEvent的整个过程? WM.injectKeyE
6、vent() WM.dispatchKey(); focus.mClient.dispatchKey(event); /( 成为焦点的) WindowState对象,有一个 mClient成员,这就是 IWindow! IWindowManager事件注入背后 ! 总结 设计亮点 事件的 Command设计模式 接口统一,可扩展,可自我运行 观察 者模式: Monitor体系 改进思路 缺点:时间根据事件比例全随机 1、可能覆盖丌到 App中的所有 Activity 2、丌会根据 Activity特点做针对性测试 ListView:上下滑动,图片点击等 MonkeySourceScript如何使用? 3、没有输入提交能力 让 Instrmentation拥有 Monkey的能力? 附录 最新的源码: https:/