06.输入系统:第10课第6节_输入系统_Reader线程_核心类及配置文件_分析

如果大家只想使用输入子系统,而不是深入了解,那么这个小节是可以跳过的,这节主要是对输入子系统,解析配置文件的源码进行追踪和讲解。下面我们开始阅读android源代码,看看在输入子系统里面是使用那些类或者结构体来表示这些文件的。

打开源码文件EventHub.cpp,搜索open,找到EventHub::openDeviceLocked()函数:

EventHub::openDeviceLocked()
	fd = open(devicePath, O_RDWR | O_CLOEXEC);//打开设备
	ioctl(fd, EVIOCGID, &inputId)) { //通过ioctl获取设备信息
	identifier.bus = inputId.bustype; //获得总线类型
    identifier.product = inputId.product;//获得PID
    identifier.vendor = inputId.vendor;//获得VID
    identifier.version = inputId.version;//获得版本好
    device = new Device(fd, deviceId, String8(devicePath), identifier);//创建一个device结构体
    loadConfigurationLocked(device);//读取配置idc文件 	
     keyMapStatus = loadKeyMapLocked(device);
     	keyMap.load(device->identifier, device->configuration);
     		 loadKeyLayout(deviceIdenfifier, keyLayoutName);//加载kl文件
     		 loadKeyCharacterMap(deviceIdenfifier, keyCharacterMapName);//加载kcm文件

其中上述的idc文件一般存放于以下路径:
在这里插入图片描述
系统其中时,会按照上述的路径逐个进行查找,他的格式十分的简单,一个属性对应一个值(property = value),如:

device.internal = 1 //表示这个输入设备是内嵌在安卓产品中。

在上小节贴出的框图:
在这里插入图片描述
成员configurationFile就是idc文件的路径,configuration就是idc的属性,其中的keyMap包括了,从keylayout与kcm文件中解析出来的某些结构体,如下:
在这里插入图片描述
根据上图我们可以看到KeyLayoutMap与KeyCharacterMap,分别如下:

KeyLayoutMap

在这里插入图片描述
上部分int32_t是一个扫描码,如存在对个配置文件,对每个配置文件进行编号,其中key是代表设备(device)上报的相关信息,左边部分的keyCode就是安卓使用的AKEYCODE_xxx,当内核上报一个扫描码之后,根据int32_t(扫描码)取出一个Key,从这个Key中,我们可以知道与驱动上报对应的AKEYCODE是什么。

查看Generic.kl文件看到诸多如下内容:

key 1     ESCAPE
key 2     1
key 3     2
key 4     3
......
key 11    0
key 12    MINUS
key 13    EQUALS

下半部分,假设输入事件为key 2 1,那么在
在这里插入图片描述
中,inint_t为2,key为(AKEYCODE_1,0),其中flag可以存在3个选值:
在这里插入图片描述
其中的VIRTIAL:有时候我们的按键是在电容屏上,用某些区域进行模拟的,对于这些特殊的按键需要加上VIRTIAL,android在对待这些按键的时候,会做一些容错的处理,避免一些误操作,下面我们开始讲解KeyCharacterMap。

KeyCharacterMap

在这里插入图片描述
我们介意注意到,类的成员与KeyLayoutMap十分的类似,他是可以实现kl文件的功能,只是写法不一样,需要在前面加上一个map:
在这里插入图片描述
但是在该文件,不会进行该些操作,
首先需要从配置文件中取得一个类似如下的的信息:

key B {
    label:                    'B' //打印在按键上的文字,仅仅是提示作用
    base:                     'b' //如果没有其他的按键(shift,ctrl等)同时按下,这对应'b' 
    shift, capslock:          'B'//如果按下capslock再加B键,这对应为'B'
}

使用
在这里插入图片描述
进行描述,其中Key保存相关信息,具体成员分部如下:
在这里插入图片描述
在上图的Key中存在三个成员,label,number,firstBehavior。三个之中除了label,其余都会生成一个Behavior的类,用来区分是否按下了其他的按键,如shift等等。
在这里插入图片描述
看图中,我们可以知道 shift, capslock共会构造两个Behavior, base: 构造一个Behavior,最后firstBehavior会把所有的Behavior连接起来。

小节回顾

讲解到这里Reader线程涉及的类,基本已经讲解完毕,在EventHub.cpp中,EventHub表示对个输入设备,那么肯定需要一个成员来表示这些类,这个成员就是
KeyedVector<int32_t, Device*> mDevices,存在一个编号和Device,Device中存在fd,表示打开的设备获得的文件句柄,打开之后通过ioctrl获取其设备相关信息,然后根据这些信息去读取idc,kl或者kcm文件。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南才尽,年少无知!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值