Android 模拟系统事件(三)
简介
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
Android 模拟系统事件(三)的更多相关文章
- wemall app商城源码中android按钮的三种响应事件
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码中android按 ...
- Android Touch事件传递机制 二:单纯的(伪生命周期)
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)
ViewGroup View Activity dispatchTouchEvent 有 有 有 onInterceptTouchEvent 有 无 无 onTouchEvent 有 有 有 例 ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- Android View 事件分发机制 源码解析 (上)
一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...
- Android Touch事件传递机制详解
Android开发的朋友经常处理各种触摸事件,然而在触摸事件的传递过程中主要用到三个方法:dispatchTouchEvent().onInterceptTouchEvent()和onTouchEve ...
- Android touch 事件传递机制
前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...
- Android onTouch事件传递机制
Android onTouch事件介绍: Android的触摸事件:onClick, onScroll, onFling等等,都是由许多个Touch组成的.其中Touch的第一个状态肯定是ACTION ...
- Android MotionEvent事件响应机制
在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action ...
随机推荐
- 转:一个跨WINDOWS LINUX平台的线程类
来源:http://blog.csdn.net/dengxu11/article/details/7232681 继Windows下实现一个CThread封装类之后,这里我再实现一个跨WINDOWS ...
- 进程序名得到进程ID和句柄与进程的公司名(使用快照和GetPeFileCompany和VerQueryValueW等函数)
WORD GetProcessIdByName(WCHAR *processName){ DWORD processId = 0;HANDLE hProcessSnap=CreateToolhelp ...
- 基于Schema的AOP 配置使用详解
原文地址:http://jinnianshilongnian.iteye.com/blog/1418598 基于Schema的AOP从Spring2.0之后通过"aop"命名空间来 ...
- iOS7.0中UILabel高度调整注意事项(转)
注释:原文链接丢失. 我的“记词助手”在升级到iOS7之后,一直出现UILabel错位的问题: 我的label是用- (CGSize)sizeWithFont:(UIFont *)font const ...
- C#复制数据库,将数据库数据转到还有一个数据库
本文章以一个表为例,要转多个表则可将DataSet关联多个表.以下给出完整代码.包含引用以及main函数与复制函数. 要说明的是,必须先用Sql语句复制表结构,才干顺利的使用下面代码复制数据. usi ...
- C#编程建言笔记
方法: 1.方法(静态或实例)JIT编译后,在内存中的代码段上都是一个全局函数,且只存在一份拷贝. 2.方法修饰符:保护级别,静态,虚函数:方法签名:返回值,函数名,参数. 构造器: 1.一个方法只能 ...
- 为SharePoint 2010中的FBA创建自定义登录页面
SharePoint 2010中默认的FBA登录页面非常简单,只提供了一个Asp.Net的Login控件,让用户输入用户名和密码.在大多数情况下,我们需要定制这个页面以满足一些安全需求,比如为登录页面 ...
- SqlServer2008 数据库可疑
今天遇到数据库可疑,以前都是直接删了还原,这次没有最新的备份文件,一起看看脚本怎么解决 --最好一句句执行,方便看到错误 USE MASTER GO --开启数据库选项"允许更新" ...
- Oracle EBS DBA常用SQL - 安装/补丁【Z】
Oracle EBS DBA常用SQL - 安装/补丁 检查应用补丁有没有安装:select bug_number,last_update_date from ad_bugs where bug_nu ...
- ios文本常见属性
文本属性Attributes 1.NSKernAttributeName: @10 调整字距 kerning 字距调整 2.NSFontAttributeName : [UIFont systemFo ...