简介

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脚本

Android 模拟系统事件(三)的更多相关文章

  1. wemall app商城源码中android按钮的三种响应事件

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码中android按 ...

  2. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  3. Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)

      ViewGroup View  Activity dispatchTouchEvent 有 有 有 onInterceptTouchEvent 有 无 无 onTouchEvent 有 有 有 例 ...

  4. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  5. Android View 事件分发机制 源码解析 (上)

    一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...

  6. Android Touch事件传递机制详解

    Android开发的朋友经常处理各种触摸事件,然而在触摸事件的传递过程中主要用到三个方法:dispatchTouchEvent().onInterceptTouchEvent()和onTouchEve ...

  7. Android touch 事件传递机制

    前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...

  8. Android onTouch事件传递机制

    Android onTouch事件介绍: Android的触摸事件:onClick, onScroll, onFling等等,都是由许多个Touch组成的.其中Touch的第一个状态肯定是ACTION ...

  9. Android MotionEvent事件响应机制

    在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action ...

随机推荐

  1. python语言

    python语言 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个人能力有限,其他语言涉及甚少,欢迎各路人士加入,丰富月刊的内容. 当然,如果您有更好的建议或者意见,欢迎发邮件 ...

  2. 启用 ASP.NET MVC 项目的 Edit and Continue

    VS 的 Edit and Continue 功能允许你在 Debug 的过程中,修改代码并且编译运行修改后的代码.对于编程阶段非常的好用,不需要你停止正在进行的 Debug,修改代码然后运行代码. ...

  3. [Django 1.5] Django 开发学习资源链接

    jQuery : jQuery API introduction:http://api.jquery.com/ jQuery plugins: http://benalman.com/projects ...

  4. jdk7和8的一些新特性介绍

    jdk7和8的一些新特性介绍 本文是我学习了解了jdk7和jdk8的一些新特性的一些资料,有兴趣的大家可以浏览下下面的内容. 官方文档:http://www.oracle.com/technetwor ...

  5. css案例学习之div与span的区别

    代码: <html> <head> <title>div 标记范例</title> <style type="text/css" ...

  6. 利用 Windows Azure 实现“云优先”

    根据 IDC 的调查,云计算无疑为我们的合作伙伴提供了巨大的机会,预计到 2016 年,全球企业将在公共云服务上耗资 980 亿美元.在今天的休斯敦全球合作伙伴大会上,我们非常高兴能与合作伙伴共同寻求 ...

  7. DLL中传递STL参数,vector对象作为dll参数传递等问题(转)

    STL跨平台调用会出现很多异常,你可以试试. STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下 ...

  8. 【HDU】4923 Room and Moor(2014多校第六场1003)

    Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  9. Linux学习之第十九、条件判断

    原文地址:http://vbird.dic.ksu.edu.tw/linux_basic/0340bashshell-scripts_4.php 条件判断式 只要讲到『程序』的话,那么条件判断式,亦即 ...

  10. HTTP的头部

    if($this->GetHead("http-edition")=="HTTP/1.1") $httpv = "HTTP/1.1"; ...