Android 真机和模拟器的差异问题,是永恒的话题,问不完的为什么,解不完的迷。模拟器的存在,有它的作用,但不要什么都相信模拟器。除非你是Android纯上层应用开发人员或者爱好者,否则我建议你扔掉模拟器。它理想化的引导给我们添了不少麻烦。当然,这也是件好事。最起码,让我有兴趣去寻求答案,让我收获了更多。
问题的缘由是有个自动化测试的需求,我需要写脚本模拟点击触摸屏的一系列操作,以代替手工测试(话说~遇上连续启动1000次camera并且拍照后退出这种变态测试,你们都是怎么做的?)。以此来证明:头儿,此bug真的解了!
Linux上可以通过sendEvent来模拟键盘或者鼠标点击事件,而Android是基于Linux2.6的,所以也可以模拟点击事件。网络文章很多都给出这样一段数据信息,告诉你怎么去实现模拟点击:
adb shell sendevent /dev/input/event0 3 0 110 //x坐标
adb shell sendevent /dev/input/event0 3 1 70 //y坐标
adb shell sendevent /dev/input/event0 1 330 1 //按下状态,准确的说是有压力值
adb shell sendevent /dev/input/event0 0 0 0 //必要的一行数据
adb shell sendevent /dev/input/event0 1 330 0 //抬起状态,无压力值
adb shell sendevent /dev/input/event0 0 0 0 //必要的一行,相当于终止一段完整数据的标致
用上面的方法可以点击模拟器的(110,70)点,但是,在真机上,却不可以,原因有两点。
✿ 1. /dev/input/event0 ×
模拟器上只有一个/dev/input/event0,但是真机上不是(如果还真是,那你这设备还是别出厂了-_-||)。
用cat获得的设备对应event信息:
# cat /proc/bus/input/devices
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="qtouch-touchscreen"
P: Phys=
S: Sysfs=/devices/virtual/input/input5
U: Uniq=
H: Handlers=event5
B: EV=b
B: KEY=400 0 4 0 0 0 0 0 0 0 0
B: ABS=2750000 11030003
"qtouch-touchscreen"不是规定死的event几,话说1234567都有可能,看你设备了。
✿2. 数据类型 ×
探究原因的时候,通过:
#adb shell getevent /dev/input/event5 > getvalue
可以得到:
0003 0035 000007c8
0003 0036 00000771
0003 0038 00000001
0000 0002 00000000
0003 0037 00000010
0000 0000 00000000
这和我之前所想象的坐标信息不一样,看到c,就知道是16进制数喽,第一反应就是做个10进制的转换。具体怎么转换?
int main (int argc, char *argv[]) 点点点... (这个.c 还不会写?不会写还不会搜吗?)
可以得到:
3 53 1992
3 54 1905
3 56 1
0 2 0
3 55 16
0 0 0
先不管为什么,做个测试验证下结果:
adb shell sendevent /dev/input/event5 3 53 1992
adb shell sendevent /dev/input/event5 3 54 1905
adb shell sendevent /dev/input/event5 3 56 1
adb shell sendevent /dev/input/event5 0 2 0
adb shell sendevent /dev/input/event5 3 55 16
adb shell sendevent /dev/input/event5 0 0 0
这里提一下,倘若操作的数据特别大,那我们可以利用vi的强大,在脚本中实现批量数据的转换,例如:
vim '+%normal gg' '+.,$g/^/s//adb shell sendevent //dev//input//event5 /g' '+wq' value
结果可以实现点击
既然测试的结果证明那乱七八糟的数是对的,那就必究其缘由!其实问题的根本原因,是因为手里的真机设备已经支持了多点触摸。
在Android中,多点触摸功能依赖于RawInputEvent.java 中定义的以下几个主要的软件位:
在 KeyInputQueue.java 中,系统创建了一个线程,把所有的 Input 事件放入一个队列,在 KeyInputQueue.java 的最后,将多点事件类型转化为单点事件类型,返回一个新的 InputDevice。
1点多了,先睡觉去了……
分享到:
相关推荐
android真机和模拟器调试问题借鉴.pdf
–这一切看起来似乎很正常的样子,但是在android studio的布局文件的布局情况只能与模拟器运行效果、真机界面运行效果这两种效果中的一个相匹配。说白了布局文件在模拟器上运行出满意的效果,但运行到真机界面上的...
主要介绍了 Android 判断真机和模拟器的方法的相关资料,需要的朋友可以参考下
雷电模拟器改真机(包含雷电模拟器特定版本(亲测这个版本可以过root检测,其他版本安装了会卡在94%)+面具优化版+LSPSED模块+加几个机型模块)
用于android手机应用开发时候,调试程序用真机代替模拟器,而ubuntu系统有点纠结了,不能实现直接在手机运行程序。
Xcode12.3最新真机/模拟器包,好用 便宜 Xcode12.3最新真机/模拟器包
之前一直在雷电模拟器,费了好大劲,现在放出来方便大家使用
本文主要介绍 Android 区别真机和模拟器,这里整理了几种方式来辨别 真机和模拟器.希望能对有需要的小伙伴有所帮助
xcode12.2最新真机/模拟器包。
面具magisk开启root,雷电模拟器上模拟真机环境。该压缩包,包括了模拟器(雷电模拟器9.exe),面具,RE管理器(Root_Explorer-v4.10.3-by_Alphaeva.apk),机型模组(iPhone12机型模块_magisk,LSPosed-v1.8.6-6909...
面具magisk开启root,雷电模拟器上模拟真机环境。该压缩包,包括了模拟器(雷电模拟器9.exe),面具,RE管理器(Root_Explorer-v4.10.3-by_Alphaeva.apk),机型模组(iPhone12机型模块_magisk,LSPosed-v1.8.6-6909...
面具magisk开启root,雷电模拟器上模拟真机环境。该压缩包,包括了模拟器(雷电模拟器9.exe),面具,RE管理器(Root_Explorer-v4.10.3-by_Alphaeva.apk),机型模组(iPhone12机型模块_magisk,LSPosed-v1.8.6-6909...
雷电模拟器,将模拟移动端真机操作,模拟手机环境,支持多开
这个是我本人用到的ijkPlayer的库,已经合并了真机和模拟器版本
ijkplayer编译出的真机和模拟器合并后的IJKMediaFramework
很多android开发者都是在模拟器上运行、调试程序,突然接触到真机反而不知道怎么使用真机调试,也许知道可以用USB连接进行调试,但不知道具体如何设置,也有的开发者完全不知道可以利用真机进行USB调试,这里指新手...
1.0 python-appium-client 连接真机、模拟器.pdf
Xcode真机模拟器各版本调试(持续更新),目前版本8.0~13.2 Xcode真机模拟器各版本调试(持续更新),目前版本8.0~13.2
IJKMediaFramework.framework,IJKMediaFramework.frameworkIJKMediaFramework.frameworkIJKMediaFramework.frameworkIJKMediaFramework.frameworkIJKMediaFramework.frameworkIJKMediaFramework....
Android模拟器躲避的检测与应对,介绍模拟器检测的主要方法