Android 模拟系统事件(三)

来源:互联网 发布:北京php培训公司排名 编辑:程序博客网 时间:2024/05/17 21:58
简介

Android系统是基于Linux内核的,而Linux内核继承和兼容了丰富的Unix系统进程间通信(IPC)机制。Binder其实也不是Android提出来的一套新的进程间通信机制,它是基于OpenBinder来实现的。Binder是一种进程间通信机制,它是一种类似于COM和CORBA分布式组件架构,通俗一点,其实是提供远程过程调用(RPC)功能。

功能

向其它进程注入事件,比如触屏、单击、按键等人为事件。

我们已经知道了Android系统进程交互是采用什么机制了。那么如何实现进程交互?他的原理是什么?

原理是通过app操作手机超级终端命令来向系统驱动写命令实现。

[java] view plaincopy
  1. 模拟原理是对驱动发送消息,就是linux里面的input子系统。  
  2. 命令格式: sendevent /dev/input/eventX [type] [key] [value]  
  3. 其中/dev/input/eventX 对应的是设备,可以用getevent查看可用设备。  

实现

1、获取真机设备事件信息,这可以参考获取小米设备信息的文章。

2、通过程序向手机超级终端写入命令。(注意:需要获取root权限)


代码

关键代码如下:

[java] view plaincopy
  1. String[] commands = new String[5];  
  2. Log.d(PBConstants.TAG, "z=" + z);  
  3. z = 0;  
  4. commands[0] = "sendevent /dev/input/event" + z + " 1 116 1";  
  5. commands[1] = "sendevent /dev/input/event" + z + " 0 0 0";  
  6. commands[2] = "sleep 1";  
  7. commands[3] = "sendevent /dev/input/event" + z + " 1 116 0";  
  8. commands[4] = "sendevent /dev/input/event" + z + " 0 0 0";  
  9. Process suProcess = Runtime.getRuntime().exec("su");  
  10. DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());  
  11. // Execute commands that require root access  
  12. for (int i = 0; i < 5; i++) {  
  13.     os.writeBytes(commands[i] + "\n");  
  14.     os.flush();  
  15. }  
  16.   
  17. os.writeBytes("exit\n");  
  18. os.flush();  
[java] view plaincopy
  1. String[] commands = new String[9];  
  2.   
  3. event_id++;  
  4. commands[0] = "sendevent /dev/input/event" + 1 + " 3 57 " + event_id;  
  5. commands[1] = "sendevent /dev/input/event" + 1 + " 3 57 0";  
  6. commands[2] = "Sleep 1";  
  7. commands[3] = "sendevent /dev/input/event" + 1 + " 3 53 " + x;  
  8. commands[4] = "sendevent /dev/input/event" + 1 + " 3 54 " + y;  
  9. commands[5] = "sendevent /dev/input/event" + 1 + " 0 0 0";  
  10. commands[6] = "Sleep 1";  
  11. commands[7] = "sendevent /dev/input/event" + 1 + " 3 57 4294967295";  
  12. commands[8] = "sendevent /dev/input/event" + 1 + " 0 0 0";  
  13. Process suProcess = Runtime.getRuntime().exec("su");  
  14.   
  15. DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());  
  16. // Execute commands that require root access  
  17. for (int i = 0; i < 9; i++) {  
  18.     os.writeBytes(commands[i] + "\n");  
  19.     os.flush();  
  20. }  
  21.   
  22. os.writeBytes("exit\n");  
  23. os.flush();  
[java] view plaincopy
  1. Process suProcess = Runtime.getRuntime().exec("su");  
  2. DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());  
  3. os.writeBytes("input keyevent KEYCODE_MENU\n");  
  4. os.writeBytes("exit\n");  
  5. os.flush();  
  6.   
  7. 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