Robotium Robotium 跨进程(底层设备事件注入)

Fresh · 2015年02月04日 · 最后由 magicyang 回复于 2015年02月04日 · 2409 次阅读
本帖已被设为精华帖!

Android 跨进程注入最大的问题在于 Android 上层对跨进程注入事件的权限限制,那么能不能绕开上层直接操作底层设备呢
答案是肯定的。

传统方法:
1、Monkey Server 利用 Monkey 进程跨进程注入事件的权限

2、利用 Uiautomator:Android 提供了接口返回 Uiautomation 实例,在 Robotium Case 中可直接使用
To get an instance of UiAutomation, call Instrumentation.getUiAutomation()
UiAutomation mUiAutomation = getInstrumentation.getUiAutomation();
3、利用 adb 注入事件

4、抛开以上曲线救国的方法,这里重点要讲的是以下内容:
直接往 linux 底层/dev/input/event* 写事件
该部分需要用 C 来完成,ndk-build 编译成.so 供上层调用

Like this:
C:
JNIEXPORT void JNICALL Java_com_example_jnidemo_MainActivity_inject(JNIEnv* env, jobject thiz, uint16_t type, uint16_t code, int32_t value)
{

struct uinput_event event;
int fd_kb = open("/dev/input/event21",O_RDWR);
memset(&event, 0, sizeof(event));
event.type = type;
event.code = code;
event.value = value;
write(fd_kb, &event, sizeof(event));
}

Android:
public native String inject(int type,int code,int value);

这儿有一个坑,不同手机分管事件的设备不一样,比如上面的 event21 再其他手机上可能就不是这个了
解决方法:遍历 dev/input 下所有设备往里面写数据(有点小暴力)

Ok,事件注入到这就算没问题了,为了方便我们可以再在上层写一个 Server 程序供程序供 Robotium Case 中调用
当然这就涉及到 IPC 通信
Android IPC 通信实现方式大概分为:广播、aidl 等,封装完了剩下的就是 Case 中调用了(这里就不讲了相信大家都会)

OK done.

共收到 4 条回复 时间 点赞


对了说明一下 需要 root(chmod 设备可写入的权限),上面 gif 为返回键到主页再注入了 menu 事件(看不到动图的请 F5 _

_,顶一个。不过话说感觉这个方法比 AIDL 还坑啊,SERVER 端的工作量一点没少,还要用 NDK 和手机适配。。。~
大侠,这方法有啥别的方法搞不定的内容不?~借鉴一下啊?

#2 楼 @yangchengtest 额,特点还没想过,大概是:没系统版本限制吧~脱离数据线?更稳定?你给总结总结,_(其实我在用第二种方法)

@fresh 呵呵,大侠那就更好了!!!~
UiAutomation mUiAutomation = getInstrumentation.getUiAutomation();
UIAUTOMATOR 是实例化对象,但是我们经常提到的 UIAUTOMATOR 是测试框架。这个完全不知道怎么折腾了。
比如说我要获取跨 APP 时,A 调用 INTENT 跳转到 B 应用,我要获取一下 B 应用的某个 TEXT 的内容。这个有具体的例子么?
看 UIAUTOMATOR 实例 injectInputEvent(InputEvent event, boolean sync) 都是这种接口,UiAutomation 测试框架提供的方法可以直接通过该实例实现么?
这个属于万分感谢!!!~

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