Android 模拟系统事件(三)
来源:互联网 发布:北京php培训公司排名 编辑:程序博客网 时间:2024/05/17 21:58
简介
Android系统是基于Linux内核的,而Linux内核继承和兼容了丰富的Unix系统进程间通信(IPC)机制。Binder其实也不是Android提出来的一套新的进程间通信机制,它是基于OpenBinder来实现的。Binder是一种进程间通信机制,它是一种类似于COM和CORBA分布式组件架构,通俗一点,其实是提供远程过程调用(RPC)功能。
功能
向其它进程注入事件,比如触屏、单击、按键等人为事件。
我们已经知道了Android系统进程交互是采用什么机制了。那么如何实现进程交互?他的原理是什么?
原理是通过app操作手机超级终端命令来向系统驱动写命令实现。
- 模拟原理是对驱动发送消息,就是linux里面的input子系统。
- 命令格式: sendevent /dev/input/eventX [type] [key] [value]
- 其中/dev/input/eventX 对应的是设备,可以用getevent查看可用设备。
实现
1、获取真机设备事件信息,这可以参考获取小米设备信息的文章。
2、通过程序向手机超级终端写入命令。(注意:需要获取root权限)
代码
关键代码如下:
- String[] commands = new String[5];
- Log.d(PBConstants.TAG, "z=" + z);
- z = 0;
- commands[0] = "sendevent /dev/input/event" + z + " 1 116 1";
- commands[1] = "sendevent /dev/input/event" + z + " 0 0 0";
- commands[2] = "sleep 1";
- commands[3] = "sendevent /dev/input/event" + z + " 1 116 0";
- commands[4] = "sendevent /dev/input/event" + z + " 0 0 0";
- Process suProcess = Runtime.getRuntime().exec("su");
- DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
- // Execute commands that require root access
- for (int i = 0; i < 5; i++) {
- os.writeBytes(commands[i] + "\n");
- os.flush();
- }
- os.writeBytes("exit\n");
- os.flush();
- String[] commands = new String[9];
- event_id++;
- commands[0] = "sendevent /dev/input/event" + 1 + " 3 57 " + event_id;
- commands[1] = "sendevent /dev/input/event" + 1 + " 3 57 0";
- commands[2] = "Sleep 1";
- commands[3] = "sendevent /dev/input/event" + 1 + " 3 53 " + x;
- commands[4] = "sendevent /dev/input/event" + 1 + " 3 54 " + y;
- commands[5] = "sendevent /dev/input/event" + 1 + " 0 0 0";
- commands[6] = "Sleep 1";
- commands[7] = "sendevent /dev/input/event" + 1 + " 3 57 4294967295";
- commands[8] = "sendevent /dev/input/event" + 1 + " 0 0 0";
- Process suProcess = Runtime.getRuntime().exec("su");
- DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
- // Execute commands that require root access
- for (int i = 0; i < 9; i++) {
- os.writeBytes(commands[i] + "\n");
- os.flush();
- }
- os.writeBytes("exit\n");
- os.flush();
- Process suProcess = Runtime.getRuntime().exec("su");
- DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
- os.writeBytes("input keyevent KEYCODE_MENU\n");
- os.writeBytes("exit\n");
- os.flush();
- return ((suProcess.waitFor() != 255) ? true : false);
结论
通过此方法可以实现Android自动化测试,不过实现自动化需要载入脚本,常见的脚本包括MonkeyRunner,Robotium,SL4A,Java Instrumentation,Shell等,这些东西都在下载包中。下载
项目下载
推荐文章
Programmatically Injecting Events on Android
TouchUtils
Android自动化测试shell脚本
From: http://blog.csdn.net/banketree/article/details/10503043
0 0
- Android 模拟系统事件(三)
- Android 模拟系统事件(三)
- android远程控制(三)----通过后台服务实现系统点击事件模拟
- Android 模拟系统事件(一)
- Android 模拟系统事件(二)
- Android 模拟系统事件(一)
- Android 模拟系统事件(二)
- Android 事件处理详解(三) —— 响应系统设置的事件[Configuration]
- Android系统上实现类似按键精灵的效果(模拟触屏点击事件)
- Android模拟、实现、触发系统按键事件的方法
- Android事件分发(三)
- android 模拟键盘事件
- Android模拟MotionEvent事件
- Android模拟input事件
- Android模拟产生事件
- Android模拟产生事件
- Android模拟产生事件
- android 模拟滑动事件
- 《程序员的思维修炼》
- MPI基础知识
- 群
- Android ANR异常及解决方法
- golang笔记-注释-标识符
- Android 模拟系统事件(三)
- nyoj 803 A/B Problem 【Java大数】
- 芯片互联设计
- 1.C++异常处理
- 使用jmeter进行性能测试-Jmeter教程及技巧汇总
- 《C/C++/Java/Pascal 程序设计基础》习题集之分支-02. 三角形判断(15)
- Android无法生存R文件解决方案
- 黑马程序员 【】java学习之路——计算字符串中字母出现的次数
- Tomcat自定义classLoader加密解密