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.


↙↙↙阅读原文可查看相关链接,并与作者交流