Android从触碰屏幕开始的事件采集,解析及分发(1)

    关于Android的事件分发机制,网上的文章快烂大街了, 大多数文章都是在千篇一律的讲activity, viewgroup, view之间的分发机制, 对于事件的源头却没有提及. 比如, 当手指触碰屏幕的一瞬间, 手机是怎么知道手指触碰的哪里, 是触碰的back键, 还是home键, 还是哪个坐标点, 是点击事件, 还是滑动事件等等, 也就是说, Android系统的事件采集是怎样的. 接下来是怎么把这些采集的事件信息进行处理的, 由谁来处理, 处理完成后又是由谁最后分发给到具体的activity的?

    有人可能会说, 作为一个普通的Android应用层开发者, 不需要掌握这些也可以啊, 我不想知道事件是怎么来的, 我只知道事件是怎么分发的, 我能够在程序中控制事件就可以了. 的确, 事实是这样, 不了解这些不影响应用层的开发, 但是如果掌握了这些, 那就太有意思了, 可以做很多有意思的事情, 比如说, 按键精灵类的app为什么能够记忆你的操作, 而且还能够自动模拟你的操作而解放你的双手? 其实, 这类app的原理无非就是通过某个办法来采集到你的所有的操作过程, 即事件采集, 这样他就记忆下来了, 当需要自动模拟事件的时候, 它会把这些采集到的信息经过处理, 转变成可执行信息,这样就能够实现模拟人的双手来进行自动模拟操作了.

    因为要想讲清楚整个事件的采集,处理及分发过程, 篇幅过大, 因此准备用一个系列文章来讲, 本文是系列文章的开篇, 那么先讲采集.

(一) 原始事件信息

打开模拟器, 或者用usb把手机连接上电脑并打开手机上面的开发者模式, (这里为了截图方便用了模拟器)打开cmd, 输入adb shell getevent回车, 然后点击模拟器或者手机后, 就会看到有N多行的/dev/input/event......输出. 其实, 这些信息就是最原始的事件信息.

(注:严格来说最原始的信息肯定是由硬件捕获到的, 这里所说的原始信息是经过硬件处理后返回给framework层的信息)
采集信息.gif

再看一下, 我们能否通过cmd命令来控制手机来模拟操作事件呢? 重新打开cmd, 或者Ctrl + c退出刚才的命令, 重新执行adb shell input keyevent 4 , 发现手机自动执行了返回键

模拟返回键.gif

(二) 信息分析

以上简单的演示了下采集信息和发送信息, 接下来开始解析信息.cmd重新执行adb shell getevent -t -l, 再次点击手机的某个app, 显示出的信息是这样的:


点击app.png

前面[ 13236.364793]显示的是时间, 是手机或模拟器开机后到命令执行时的时间间隔, 后面显示的是具体命令, 其中, /dev/input/event1表示的是屏幕的输入事件, 第一个ABS_MT_TRACKING_ID 表示采集信息开始, 后一个ABS_MT_TRACKING_ID表示采集信息结束, ABS_MT_PRESSURE表示的是屏幕感受到的压力值, SYN_REPORT 表示的是同步数据, 最重要的是ABS_MT_POSITION_X和ABS_MT_POSITION_Y, 毫无疑问, 这个就是表示屏幕感受到的触碰坐标位置. 最右边的一列是16进制的值.

其他的信息我们可以先忽略, 最主要的是要记录时间和坐标点, 接下来就是把采集到的坐标点转换成10进制的坐标点, x坐标采集到的值是00005487,转换10进制是21639, 同理, y坐标转换前是00006b5b, 转换后是27483, 接下来需要根据公式来获取到真正的应用层能识别的坐标系, 具体公式为:

x = (x-xmin) * 手机像素宽 / (xmax-xmin) ;
y = (y-ymin) * 手机像素高 / (ymax-ymin);

手机像素我们可以通过代码获取当前手机的像素, 但是xmin和xmax, 以及ymin和ymax是什么呢?我们还是通过cmd用adb shell getevent -p命令来获取. 执行命令后,拉到最下方, 看到如下图示:


获取参数.png

我们找到0035和0036的行, 即

 0035  : value 0, min 0, max 32767, fuzz 0, flat 0, resolution 0
 0036  : value 0, min 0, max 32767, fuzz 0, flat 0, resolution 0

0035所在的行就是x信息, 0036所在的行就是y信息, 每行的min值和max值对应上面公式的min和max, 所以我这里最终转换成的x, y坐标结果如下: (我的模拟器经过代码获取的宽高分辨率分别是480, 728)

x = (21639 - 0) * 480 / (32767 - 0) = 317
y = (27483 - 0) * 728 / (32767 - 0) = 610

即当点击手机桌面屏幕的(317, 610)坐标, 就打开了这个app, 那么我们接下来验证一下, 通过cmd来发送命令, 来模拟点击事件, 看看模拟器或者手机是不是能打开这个app呢?
重新打开cmd, 执行adb shell input tap 317 610命令, 结果如下:


模拟点击app.gif

我们成功的通过命令来模拟点击桌面应用了. 其实整个过程就是一个采集信息,处理信息,发送信息的过程。

到这里, 其实我们就可以自己开发出来一个类似按键精灵类的简单版app了, 大体思路就是在app中给一个按钮,用来触发信息采集, 之后用户的一切触碰屏幕操作都进行录入, 再给一个结束采集的按钮, 触发按钮就结束信息录入, 并开始处理信息, 包括每个动作的属性(是点击, 还是滑动, 还是长按等等), 相邻动作的时间间隔, 等等, 然后保存起来, 最后再给一个自动模拟事件的按钮, 当触发时, 程序开始自动读取保存的事件信息并执行模拟事件了.

以上, 是我们人为的进行事件采集, 处理, 发送. 那么Android系统内部是怎么做的呢? 是谁负责把这个事件信息处理后转换成为各种KeyEvent或者MotionEvent的, 以及最终是怎么传递到的activity中的, 请关注系列文章之后的文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容

  • 跨进程模拟触屏事件的作用## 有很多在一个Activity中实现虚拟触摸的方法,但是无法做到跨进程虚拟触摸。无论是...
    babybus_hentai阅读 8,371评论 1 3
  • Android 调试桥 Android 调试桥 (adb) 是一个通用命令行工具,其允许您与模拟器实例或连接的 A...
    guanjm阅读 1,438评论 0 1
  • 女儿从香港回来,给下一辈的几个小朋友带了珍妮小熊曲奇饼干,顺便也有我的一盒。 瞧,上图那方型的饼干盒上,一身消防员...
    星韵r阅读 735评论 1 5
  • GET: request.GET.get("your key",none)#字典形式,也是js对象; requst...
    zhu733756阅读 2,805评论 0 0
  • 今年目标:健康管理(早睡11点之前、饮食、体重) 黑色280 找到一位合作伙伴 今日青蛙:1.听音频。2.投资交易...
    镇星Aquarius阅读 76评论 0 0