简介

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

功能

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

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

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

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

实现

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

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


代码

关键代码如下:

[java] view plain copy
  1. String[]commands=newString[5];
  2. Log.d(PBConstants.TAG,"z="+z);
  3. z=0;
  4. commands[0]="sendevent/dev/input/event"+z+"11161";
  5. commands[1]="sendevent/dev/input/event"+z+"000";
  6. commands[2]="sleep1";
  7. commands[3]="sendevent/dev/input/event"+z+"11160";
  8. commands[4]="sendevent/dev/input/event"+z+"000";
  9. ProcesssuProcess=Runtime.getRuntime().exec("su");
  10. DataOutputStreamos=newDataOutputStream(suProcess.getOutputStream());
  11. //Executecommandsthatrequirerootaccess
  12. for(inti=0;i<5;i++){
  13. os.writeBytes(commands[i]+"\n");
  14. os.flush();
  15. }
  16. os.writeBytes("exit\n");
  17. os.flush();
[java] view plain copy
  1. String[]commands=newString[9];
  2. event_id++;
  3. commands[0]="sendevent/dev/input/event"+1+"357"+event_id;
  4. commands[1]="sendevent/dev/input/event"+1+"3570";
  5. commands[2]="Sleep1";
  6. commands[3]="sendevent/dev/input/event"+1+"353"+x;
  7. commands[4]="sendevent/dev/input/event"+1+"354"+y;
  8. commands[5]="sendevent/dev/input/event"+1+"000";
  9. commands[6]="Sleep1";
  10. commands[7]="sendevent/dev/input/event"+1+"3574294967295";
  11. commands[8]="sendevent/dev/input/event"+1+"000";
  12. ProcesssuProcess=Runtime.getRuntime().exec("su");
  13. DataOutputStreamos=newDataOutputStream(suProcess.getOutputStream());
  14. //Executecommandsthatrequirerootaccess
  15. for(inti=0;i<9;i++){
  16. os.writeBytes(commands[i]+"\n");
  17. os.flush();
  18. }
  19. os.writeBytes("exit\n");
  20. os.flush();
[java] view plain copy
  1. ProcesssuProcess=Runtime.getRuntime().exec("su");
  2. DataOutputStreamos=newDataOutputStream(suProcess.getOutputStream());
  3. os.writeBytes("inputkeyeventKEYCODE_MENU\n");
  4. os.writeBytes("exit\n");
  5. os.flush();
  6. 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


更多相关文章

  1. Android---44---使用AIDL Service 实现跨进程调用Service
  2. java反射机制 调用android得隐藏api
  3. Android(安卓)7.0 ActivityManagerService(5) 广播(Broadcast)相
  4. Android通信方式篇(四)-Binder机制(开篇)
  5. [转】:Android生命周期
  6. Android的UI主线程是ActivityThread吗?
  7. apk重签名之re-sign.jar重签名
  8. Android(安卓)7.1 APP 启动流程分析
  9. Android---Handler消息处理机制

随机推荐

  1. HBase应用 | 云HBase Spark分析引擎对接
  2. 技术分享:Python如何进行内存管理?
  3. 什么是整型类型?Python整型详细介绍
  4. HBase分享 | HBase生态实践
  5. 对象池 GenericObjectPool 配置参数详解
  6. Phoenix实战 | Phoenix ODPSBulkLoadTool
  7. dns查询3:Test
  8. 前端开发零基础好学吗?
  9. 技术分享:Java多线程学习处理高并发问题
  10. Phoenix实践 | Phoenix数据迁移