怎样可以跨进程测试

在Android系统下模拟鼠标键盘等输入设备,网络上资料非常多。但不少是人云亦云,甚至测试都不愿测试一下就抄上来了。这次写一点体会,当作抛砖引玉。

0. 背景知识
众所周知,Android是将Framework架在Linux之上的系统。Linux层和硬件打交道,Framework通过JNI等途径得到底层信息。
消息的传递是:Linux -> Framework -> Application
因为此架构的特性,我们很容易知道可以在哪些环节,以何种途径加入鼠标和键盘消息。

1. 添加鼠标键盘消息的方法
我们知道消息传递的路径,就很清楚可以在哪些环节把我们需要的键盘鼠标消息添加进去了。
1.1: Linux Driver 层面添加:
可以写一个Linux Driver,注册一个字符设备驱动程序,建立一个虚拟的字符设备,主设备号13。利用Ioctl()和应用程序沟通。
之前在Linux 2.4时代,Sam曾在S3C2440A上写过这样一个Driver,个人起名叫VInput。可以实现以上功能。
优点:很少。
缺点
1.编程较为复杂。Linux Kernel从2.4到2.6,再到3.0。Kernel变动不小,仅字符设备驱动程序的注册方法和Device的建立方法都有不小的变化,devfs也不支持了。
2. 需要有对应目标平台的Kernel Source Code。
3.需要有root权限,才能够insmod ko文件。

总结:这个方法并不好用。除了专业写Driver的朋友外,估计没有人会这么干。有一次曾想把Linux Kernel 2.4时代的VInput移植到Linux Kernel3.0来。但内核符号改变太大。没能实现。


1.2:  Linux 用户层面添加
在Linux Kernel 2.6的某个版本中,添加了UInput。即Input User level driver.  这个Driver允许应用程序通过和 /dev/uinput交互来创建一个新的Linux Input Device。 这个Device可以是Keyboard, Mouse,绝对位置设备等等。既然Linux 层面都模拟出具体设备了。则Framework更会认为这是个实实在在的输入设备。则我们模拟出的消息会一路上传,一直传递到App层面。
具体方法:
http://blog.sina.com.cn/s/blog_602f87700100llew.html

优点
程序简单易行,不需要Kernel Source Code。可以模拟几乎一切常见的输入设备。
缺点
这个程序最好是使用NativeC程序写成一个可执行程序。只在Linux层运行。 
但如果才用JNI把它做成一个库,供上层Android程序调用。则有可能会遇到一个问题:权限不足
我们在Android系统下常看到/dev/input设备的拥有者是system.  同组的其它用户的权限常常是不可读写。而一般的APK的拥有者并不是system, 所以无法读写这个设备(/dev/uinput). 所以此方法在JNI方式下有可能会失败。
除非/dev/uinput的权限是666. 则没有问题。
(当然也有两个办法突破,但那是另一个话题了, 可以看看以下文档系统签名部分:
http://blog.sina.com.cn/s/blog_602f87700101jm9b.html)

总结:这个方法Sam一直在实际使用。效果很不错。



1.3: Framework 层面修改
这个办法只是理论上可行,可以在Framework 读取/dev/eventX 的JNI部分去下手。但实际上没有人会为了这个功能去破坏Framework的稳定。所以只是理论上可行。以前一个同事曾研究过这一块。但没有最终动手做。

总结:除非有特殊需求,否则不要这么做。


1.4: 利用Instrumentation发送键盘鼠标消息
Instrumentation可以监听系统和应用程序之间的通讯。可以利用它给应用程序发送鼠标键盘消息。有点像Windows下的Hook。

具体方法:
如果仅想向本应用程序发送键盘鼠标消息。
Instrumentation inst=new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_A);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 100, 200, 0));
SystemClock.sleep(1000);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 200, 200, 0));
SystemClock.sleep(1000);
inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 200, 200, 0));


发送键盘和鼠标消息给当前有焦点的窗口。
可以采用:
sendKeyDownUpSync()
sendKeySync()
sendCharacterSync()等方式发送键盘消息。

可以使用sendPointerSync()发送鼠标消息。


但如果想向其它App的窗口发送键盘鼠标消息。仅仅这样做就会出错,程序会Crash。
java.lang.SecurityException: Injecting to another application requires INJECT_EVENT permission.

好的,我们加上这个权限。
在AndroidManifest.xml 的Permissions选单中,添加Uses Permission.选中INJECT_EVENT.

此时 uses-permission android:name="android.permission.INJECT_EVENT" 被加入。
但编译时会报错,这个权限仅有System APP才能拥有。
呵呵,那只好再加系统权限了。

android:sharedUserId="android.uid.system">
加入。
生成未签名的APK。 再使用apktools加上系统签名文件。这样,就可以向其它APP发送鼠标键盘消息了。


优点:简单易行。
缺点:如果向其它程序发送鼠标键盘,则需要系统签名文件。且一些程序估计从更底层拿消息,所以会产生在这类程序中无响应的情况。

总结:想向其它APP Window 发送消息。则一定需要系统签名。



总的看来,在Android系统中模拟鼠标键盘。采用UInput方案且在Linux层做NativeC可执行程序最为稳妥。在Linux层面就直接创建了输入设备。
如果采用Instrumentation方式,一方面一些APP可能不吃,另一方面,如果想向其它APP发送消息。则需要系统签名文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio 导入新工程项目

1 导入之前先修改工程下相关文件 1.1 只需修改如下三个地方1.2 修改build.gradle文件 1.3 修改gradle/wrapper/gradle-wrapper.properties 1.4 修改app/build.gradle 2 导入修改后的工程 2.1 选择File|New|Import Project 2.2 选择修改后的工程 如果工程没有变成AS符号&#xf…

马蜂窝张矗:绩效考核是为了激发工作潜力,而不是逃避问题

3 月 23 日,由高端技术领导者社交平台 TGO 鲲鹏会主办的 GTLC 全球技术领导峰会分站首站在北京举行。会上马蜂窝技术副总裁 \u0026amp; TGO 鲲鹏会会员张矗发表了主题为“我在马蜂窝的技术管理实践”的演讲。本文根据其演讲整理而成。大家好,我是来自马蜂…

vue domo网站_DOMO与Tableau-逐轮

vue domo网站Let me be your BI consultant. Best yet, let me be your free consultant on the following question:让我成为您的BI顾问。 最好的是,让我成为您的免费顾问 ,解决以下问题: DOMO vs. Tableau — What should I use?DOMO vs.…

fiddler抓包1-抓小程序https包

抓小程序包和抓app包是一样的操作方法;安卓用fiddler,ios用charles; 一、环境准备 1.电脑已装最新版fiddler 2.手机和电脑在同一局域网 二、fiddler设置 1.fiddler>Tools>Options>HTTPS 勾选Capture HTTPS CONNECTs 及下边的子项&am…

多态使用的前提

1:必须是继承(extends),实现(implements) 才行2:必须要重写(覆盖)父类的方法。转载于:https://www.cnblogs.com/liyunchuan/p/10663788.html

Linux下的 FTP

1.安装vsftpd yum install vsftpd 2.启动/重启/关闭vsftpd服务器 [rootlocalhost ftp]# /sbin/service vsftpd restart Shutting down vsftpd: [ OK ] Starting vsftpd for vsftpd: [ OK ] OK表示重启成功了. 启动和关闭分别把restart改为start/stop即可. 如果是源码安装的,到…

python入门23 pymssql模块(python连接sql server增删改数据 )

增删改数据必须connect.commit()才会生效 回滚函数 connect.rollback() 连接数据库 dinghanhua sql server增删改 import pymssqlserver 192.168.1.1 user user password 111111 database testdbconnect pymssql.connect(server server,user user,passwordpassword,da…

每个人都应该使用的Python 3中被忽略的3个功能

重点 (Top highlight)Python 3 has been around for a while now, and most developers — especially those picking up programming for the first time — are already using it. But while plenty of new features came out with Python 3, it seems like a lot of them ar…

iframe自适应高度

为什么需要使用iframe自适应高度呢?其实就是为了美观,要不然iframe和窗口长短大小不一,看起来总是不那么舒服,特别是对于我们这些编程的来说,如鲠在喉的感觉。 首先设置样式 body{margin:0; padding:0;} 如果不设置bod…

.Net转Java自学之路—SpringMVC框架篇八(RESTful支持)

RESTful架构,REST即Representational State Transfer。表现层状态转换,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以得到越来越多网站的采用。 RESTful其实就是一个开发理念,是对http的很…

冲刺第七天

今天任务进行情况:今天我们将我们的游戏导到界面形成可用的应用程序,并且进行调试与运行,让同学试玩,发现了困难并加以改正。 遇到的困难及解决方法: 运行时发现游戏界面中UI的button和image的位置会随分辨率的不同而发…

数据探查_数据科学家,开始使用探查器

数据探查Data scientists often need to write a lot of complex, slow, CPU- and I/O-heavy code — whether you’re working with large matrices, millions of rows of data, reading in data files, or web-scraping.数据科学家经常需要编写许多复杂,缓慢&…

Node.js Streams:你需要知道的一切

Node.js Streams:你需要知道的一切 图像来源 Node.js流以难以使用而闻名,甚至更难理解。好吧,我有个好消息 - 不再是这样了。 多年来,开发人员在那里创建了许多软件包,其唯一目的是简化流程。但在本文中,我…

oracle表分区

1.表空间:是一个或多个数据文件的集合,主要存放的是表,所有的数据对象都存放在指定的表空间中;一个数据文件只能属于一个表空间,一个数据库空间由若干个表空间组成,其中包括:a.系统表空间:10g以前,默认系统表空间是System,10g包括10g以后,默认系统表空间是User,存放数据字典和视…

oracle异机恢复 open resetlogs 报:ORA-00392

参考文档:ALTER DATABASE OPEN RESETLOGS fails with ORA-00392 (Doc ID 1352133.1) 打开一个克隆数据库报以下错误: SQL> alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-00392: log 1 of thread 1 is being…

从ncbi下载数据_如何从NCBI下载所有细菌组件

从ncbi下载数据One of the most important steps in genome analysis is gathering the data required for downstream research. This sometimes requires us to have the assembled reference genomes (mostly bacterial) so we can verify the classifiers trained or bins …

shell之引号嵌套引号大全

万恶的引号 这个能看懂你就出师了! 转载于:https://www.cnblogs.com/theodoric008/p/10000480.html

oracle表分区详解

oracle表分区详解 从以下几个方面来整理关于分区表的概念及操作: 表空间及分区表的概念表分区的具体作用表分区的优缺点表分区的几种类型及操作方法对表分区的维护性操作 1.表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存…

线性插值插值_揭秘插值搜索

线性插值插值搜索算法指南 (Searching Algorithm Guide) Prior to this article, I have written about Binary Search. Check it out if you haven’t seen it. In this article, we will be discussing Interpolation Search, which is an improvement of Binary Search when…

其他命令

keys *这个可以全部的值del name 这个可以删除某个127.0.0.1:6379> del s_set(integer) 1127.0.0.1:6379> keys z*(匹配)1) "z_set2"2) "z_set"127.0.0.1:6379> exists sex(integer) 0 127.0.0.1:6379> get a"3232…