移动测试基础 android 下的 uiautomator 有人编译过没

思寒_seveniruby · 2014年02月09日 · 最后由 Plasma 回复于 2015年06月09日 · 2475 次阅读

我想利用 uiautomator 的代码, 重新编译一个更强的版本, 大家谁试过重新编译 uiautomator,求下经验分享。
我最近刚开始看 ndk 的开发

uiautomator events 会记录一些事件, 不过这些事件的数据还不足,我想做一些补充, 搞个增强版编译到 android 中

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 12 条回复 时间 点赞

做一次完整的 Android 的编译就可以了。

#1 楼 @xiaocong 貌似只能在 ubuntu 下编译对吧. 我找个环境试试.我想修改下他的代码. 植入对 event 的坐标和 event.source 的一些信息. 把 events 的输出修改为 json 格式.

#1 楼 @xiaocong 我提取了 uiautomator 的部分代码进行编译, 我想单独编译出来 uiautomator.jar, 而不是整个 android 系统. 但是在 EventsCommand.java 中发现了一个很奇怪的导入
import com.android.uiautomator.core.UiAutomationShellWrapper;
我一直没找到整个类是从什么地方声明的. 貌似在 uiautomator 的代码里面是没有这个定义的.
但是我搜索 google 的 android 代码, 却发现了这个文件
uiautomator/library/testrunner-src/com/android/uiautomator/core/UiAutomationShellWrapper.java

这个文件并没有完整的对外发布出来, 貌似只在 android 的 git 源中.
非得编译整个 android 系统吗?

#3 楼 @seveniruby 我看到的 EventsCommand.java 没有这个 UiAutomationShellWrapper 类,不过有
UiTestAutomationBridge 这个类,这个类通过注册一个 mListener = new IAccessibilityServiceClientWrapper(null, looper, new Callbacks() {}

final IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface(
ServiceManager.getService(Context.ACCESSIBILITY_SERVICE));
try {
manager.registerUiTestAutomationService(mListener, mListener, info);
} catch (RemoteException re) {
throw new IllegalStateException("Cound not register UiAutomationService.", re);
}
来获得 events 相关信息。但是我移植这块代码后,执行出了权限错误。看了源码,在注册上面 mListener 需要 android.permission.RETRIEVE_WINDOW_CONTENT 权限,可该权限为系统权限。希望有所交流!

#4 楼 @michailclj 需要在 shell 下运行, 系统对 shell 和 uiautomator 有特殊赋予的权限. 或者你用 su 来启动你的程序也可以.
@xiaocong 说 UiAutomationShellWrapper 在 android 的源代码中, 所以我在下载整个 android 的代码来编译. 不过代码量太大, 用 repo 工具一直都没下载完整过代码. 老是报错, 所以 uiautomator 的编译就一直 delay 了

#5 楼 @seveniruby 嗯,通过手机连上数据线通过 adb shell uiautomator events,可以输出信息。我现在想有没有可能我不连接数据线,通过设备自身的应用执行 uiautomator events 来输出信息,我试了 Runtime.exec("uiautomator evnets");这个是无法启动 uiautomator 进程,不过通过加 su 确实可以启动 uiautomator 进程通过 ps 命令可以看到该进程的父进程是 root 用户,可是读取输入输出流一直阻塞。可不可以,应用程序去执行 shell ,不用 Runtime。

#6 楼 @michailclj 可以 我正在写一个 app 就是手机自己执行 快写好了 两周内就能发出来

#7 楼 @seveniruby 是用 Runtime.getRuntime().exec()这种方式执行 shell 命令吗?你是怎么实现,能否给个思路呢?

#8 楼 @michailclj 恩, 直接调用即可. 一些关键操作需要 root, 最好配合 su , 不过这种方式只能运行 events, 不能执行测试用例.

#9 楼 @seveniruby 嗯,我也试过这样调用,可是,发现输入输出流好像阻塞了,不知,你在实现的过程遇到过这样的情况吗?我现在想看看能不能不 root 运行 events。uiautomator 这个命令的所有者不是 shell 吗?

#10 楼 @michailclj events 命令不会返回, 你可以试试利用重定向导入文件, 看看有没有输出, 完成目标后直接 kill.

@seveniruby 单独编译 uiautomator 成功了吗,如何单独编译?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册