我经过调研,发现 app 的录制工具实现方式有百度 cafe,adb shell getevent 等。
cafe 使用的是 hook 方法,貌似还利用了 android 安全漏洞,但是 android4,.2 以后这个漏洞修复了,估计就没法用了吧。而且 hook 这个东西不怎么懂。
我自己想了一个录制方法,使用 android accessibility 辅助功能监听用户操作事件,通过 AccessibilityEvent 的 getSource() 方法获取事件信息。
start time: 24808.582 TYPE_VIEW_CLICKED:1
current node info:android.view.accessibility.AccessibilityNodeInfo@9662; boundsInParent: Rect(0, 0 - 68, 66); boundsInScreen: Rect(60, 435 - 128, 501); packageName: cn.kuwo.player; className: android.widget.CheckBox; text: null; contentDescription: null; viewIdResName: null; checkable: true; checked: false; focusable: true; focused: false; selected: false; clickable: true; longClickable: false; enabled: true; password: false; scrollable: false; [ACTION_FOCUS, ACTION_SELECT, ACTION_CLEAR_SELECTION, ACTION_CLICK, ACTION_ACCESSIBILITY_FOCUS] familyString:root-0-0-0-0;
其中 view id 永远为空,AccessibilityNodeInfo 有 getViewIdResourceName 方法,但是获取的值永远为空。
请问下大家,有没有什么好的脚本录制方法? 大家一起讨论下。
此外,我还看到有些测试脚本录制工具是基于 instrumentation 的,比如 testdroid, 不知道这个如何实现录制?
我总结了下,uiautomator 提供 AccessibilityEvent,通过这个方法,我们编写一个录制脚本,在脚本里监听 AccessibilityEvent,可以很容易捕获所有事件。但是 uiautomator 不能录制 webview。
instrumentation 框架可以通过 cafe 的方式,hook 所有的 listener,将自定义的 listener 去替换原有的 listener,并且加入录制代码。ps,这个地方有人知道 listener hook 需要 root 手机吗?
那么问题来了,uiautomator 和 instrumentation hook 这两种录制方法,到底有什么区别呢? 用哪种方法好呢? 我所了解的是 instrumentation 能够支持低版本和 webview,uiautomator 不可以,除此以外,还有什么区别吗?