一种基于中断穿透的跨运行环境低延迟输入方法转让专利

申请号 : CN202211438890.5

文献号 : CN115495192B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 温研

申请人 : 北京麟卓信息科技有限公司(CN)

摘要 :

本发明公开了一种基于中断穿透的跨运行环境低延迟输入方法,依据键盘事件中断机制通过键盘驱动、安卓应用显示单元及安卓应用兼容服务间的配合,实现从桌面系统内核直接将键盘输入事件发送至安卓兼容环境,不再需要窗口管理器转发和安卓应用显示单元转换事件,从而有效降低了安卓应用相关键盘事件的响应延迟,提高了键盘事件的处理效率。

权利要求 :

1.一种基于中断穿透的跨运行环境低延迟输入方法,其特征在于,具体包括以下步骤:

当安卓应用桌面窗口被激活时,安卓应用显示单元向安卓应用兼容服务发送获取输入焦点视图ID消息;当安卓应用显示单元接收到焦点视图消息时,若焦点视图消息中的视图ID不为NULL则向键盘驱动发送包含视图ID的焦点编辑视图消息,否则向键盘驱动发送视图消息;当安卓应用桌面窗口失去焦点时,向键盘驱动发送视图消息;当安卓应用显示单元接收到安卓事件处理完成消息时,将安卓事件处理完成消息转发至键盘驱动;当安卓应用显示单元接收到安卓事件处理异常消息时,将安卓事件处理异常消息转发至键盘驱动;

键盘驱动在初始化过程中将按键处理标识值、按键识别标识值以及视图标识值分别设置为FALSE、TRUE和NULL,并在创建系统设备文件的同时创建安卓兼容环境可读取的安卓兼容设备文件;当接收到焦点编辑视图消息时,键盘驱动将视图标识值设置为消息中的视图ID;当接收到视图消息时,键盘驱动将视图标识值设置为NULL;当接收到安卓事件处理完成消息时,将按键处理标识值及按键识别标识值均设置为TRUE;当接收到安卓事件处理异常消息时,将按键处理标识值及按键识别标识值分别设置为TRUE 和FALSE;

当产生键盘中断且此时视图标识值不为NULL时提取键盘按键信息,如果键盘按键信息中包含非可见字符按键则将按键处理标识值及按键识别标识值分别设置为FALSE和TRUE,并将包含处理标记1及键盘按键信息的数据写入安卓兼容设备文件,若在设定时间内按键处理标识值及按键识别标识值均为TRUE则键盘驱动不执行其他操作,若在设定时间内按键处理标识值为TRUE且按键识别标识值为FALSE则执行桌面系统的标准键盘输入事件处理流程,若在设定时间内按键处理标识值为FALSE则执行桌面系统的标准键盘输入事件处理流程;当产生键盘中断且此时视图标识值不为NULL时提取键盘按键信息,如果键盘按键信息中不包含非可见字符按键则将包含处理标记2、视图ID及键盘按键信息的数据写入安卓兼容设备文件;其中,所述非可见字符按键为非数字与字符按键的键盘按键;当产生键盘中断且此时视图标识值为NULL时提取键盘按键信息,执行桌面系统的标准键盘输入事件处理流程;

在安卓兼容环境启动时导入安卓兼容设备文件,当安卓应用兼容服务接收到获取输入焦点视图ID消息后,判断当前被激活的安卓应用内是否存在具有输入焦点的视图,若存在且视图的属性为可编辑则获取视图的视图ID构建包含实际取值视图ID的焦点视图消息,否则构建包含取值为NULL的视图ID的焦点视图消息,并将焦点视图消息发送至安卓应用显示单元;当安卓兼容环境从安卓兼容设备文件中读取到键盘按键信息时,如果键盘按键信息中包含处理标记1,则执行安卓兼容环境的标准键盘输入事件处理流程,若执行过程正常完成则向安卓应用显示单元发送安卓事件处理完成消息否则发送安卓事件处理异常消息;如果键盘按键信息中包含处理标记2,则根据键盘按键信息构造标准安卓系统键盘事件,将键盘事件发送至当前具有输入焦点的编辑框,执行安卓兼容环境的标准键盘输入事件处理流程。

2.根据权利要求1所述的跨运行环境低延迟输入方法,其特征在于,所述安卓应用显示单元采用xDroidUI,所述安卓应用兼容服务采用xDroidServer。

3.根据权利要求1所述的跨运行环境低延迟输入方法,其特征在于,所述当安卓应用显示单元接收到安卓事件处理完成消息时,将安卓事件处理完成消息转发至键盘驱动;当安卓应用显示单元接收到安卓事件处理异常消息时,将安卓事件处理异常消息转发至键盘驱动中,所述安卓应用显示单元通过ioctl接口向键盘驱动发送安卓事件处理完成消息及安卓事件处理异常消息。

4.根据权利要求1所述的跨运行环境低延迟输入方法,其特征在于,所述处理标记1及处理标记2均占用四个字节。

5.根据权利要求1所述的跨运行环境低延迟输入方法,其特征在于,所述设定时间为3秒钟。

说明书 :

一种基于中断穿透的跨运行环境低延迟输入方法

技术领域

[0001] 本发明属于在桌面操作系统上运行移动应用的开发技术领域,具体涉及一种基于中断穿透的跨运行环境低延迟输入方法。

背景技术

[0002] Linux系统安卓兼容环境(下文简称安卓兼容环境)是一种在Linux系统上运行安卓应用(App)的技术,对丰富Linux系统应用生态有着重要的意义。目前典型的安卓兼容环境主要包括安卓应用显示单元和安卓应用兼容服务,安卓应用显示单元用于在Linux系统上实现安卓应用的用户界面,安卓应用兼容服务用于提供运行于Linux系统上的安卓兼容环境,通过安卓应用显示单元与安卓应用兼容服务的相互配合实现安卓应用在Linux系统上的有效运行,例如,现有安卓兼容环境的实现xDroid,它包括xDroidUI和xDroidServer,xDroidUI为安卓应用显示单元,xDroidServer为安卓应用兼容服务。
[0003] 现有安卓兼容环境对桌面系统的键盘输入事件的通常处理过程是:桌面系统的键盘驱动接收到硬件的键盘输入中断后,对键盘输入中断进行处理并通过设备文件传递至用户态;用户态的窗口管理器,在监测到设备文件数据发生变化时对数据进行处理,即通过计算获取当前具有输入焦点的窗口,再将键盘输入事件传递至具有焦点的窗口的应用;若具有焦点的窗口为安卓应用桌面窗口,安卓应用桌面窗口为安卓应用在桌面系统中由安卓应用显示单元生成的应用窗口,则安卓应用显示单元将键盘输入事件转换为安卓系统对应的键盘输入事件,再通过RPC等方式将键盘输入事件传递到安卓兼容环境中;安卓兼容环境的InputManager创建用于持续监视设备文件的线程,InputManager将读取的键盘输入事件传递至安卓兼容环境的WindowManager,WindowManager最终将键盘输入事件传递至当前具有输入焦点的View,最终由View处理键盘输入事件,并将响应的数据输出到桌面系统。
[0004] 然而由上述键盘输入事件的处理过程可见,键盘输入事件的处理过程复杂,消息传递环节较多,因此一定程度上增加了键盘输入事件的响应时间,降低了响应效率,同时占用了较多的系统资源。

发明内容

[0005] 有鉴于此,本发明提供了一种基于中断穿透的跨运行环境低延迟输入方法,能够实现桌面系统输入事件到安卓兼容环境的直接传递。
[0006] 本发明提供的一种基于中断穿透的跨运行环境低延迟输入方法,具体包括以下步骤:
[0007] 当安卓应用桌面窗口被激活时,安卓应用显示单元向安卓应用兼容服务发送获取输入焦点视图ID消息;当安卓应用显示单元接收到焦点视图消息时,若焦点视图消息中的视图ID不为NULL则向键盘驱动发送包含视图ID的焦点编辑视图消息,否则向键盘驱动发送视图消息;当安卓应用桌面窗口失去焦点时,向键盘驱动发送视图消息;当安卓应用显示单元接收到安卓事件处理完成消息时,将安卓事件处理完成消息转发至键盘驱动;当安卓应用显示单元接收到安卓事件处理异常消息时,将安卓事件处理异常消息转发至键盘驱动;
[0008] 键盘驱动在初始化过程中将按键处理标识值、按键识别标识值以及视图标识值分别设置为FALSE、TRUE和NULL,并在创建系统设备文件的同时创建安卓兼容环境可读取的安卓兼容设备文件;当接收到焦点编辑视图消息时,键盘驱动将视图标识值设置为消息中的视图ID;当接收到视图消息时,键盘驱动将视图标识值设置为NULL;当接收到安卓事件处理完成消息时,将按键处理标识值及按键识别标识值均设置为TRUE;当接收到安卓事件处理异常消息时,将按键处理标识值及按键识别标识值分别设置为TRUE 和FALSE;
[0009] 当产生键盘中断且此时视图标识值不为NULL时提取键盘按键信息,如果键盘按键信息中包含非可见字符按键则将按键处理标识值及按键识别标识值分别设置为FALSE和TRUE,并将包含处理标记1及键盘按键信息的数据写入安卓兼容设备文件,若在设定时间内按键处理标识值及按键识别标识值均为TRUE则键盘驱动不执行其他操作,若在设定时间内按键处理标识值为TRUE且按键识别标识值为FALSE则执行桌面系统的标准键盘输入事件处理流程,若在设定时间内按键处理标识值为FALSE则执行桌面系统的标准键盘输入事件处理流程;当产生键盘中断且此时视图标识值不为NULL时提取键盘按键信息,如果键盘按键信息中不包含非可见字符按键则将包含处理标记2、视图ID及键盘按键信息的数据写入安卓兼容设备文件;其中,所述非可见字符按键为非数字与字符按键的键盘按键;当产生键盘中断且此时视图标识值为NULL时提取键盘按键信息,执行桌面系统的标准键盘输入事件处理流程;
[0010] 在安卓兼容环境启动时导入安卓兼容设备文件,当安卓应用兼容服务接收到获取输入焦点视图ID消息后,判断当前被激活的安卓应用内是否存在具有输入焦点的视图,若存在且视图的属性为可编辑则获取视图的视图ID构建包含实际取值视图ID的焦点视图消息,否则构建包含取值为NULL的视图ID的焦点视图消息,并将焦点视图消息发送至安卓应用显示单元;当安卓兼容环境从安卓兼容设备文件中读取到键盘按键信息时,如果键盘按键信息中包含处理标记1,则执行安卓兼容环境的标准键盘输入事件处理流程,若执行过程正常完成则向安卓应用显示单元发送安卓事件处理完成消息否则发送安卓事件处理异常消息;如果键盘按键信息中包含处理标记2,则根据键盘按键信息构造标准安卓系统键盘事件,将键盘事件发送至当前具有输入焦点的编辑框,执行安卓兼容环境的标准键盘输入事件处理流程。
[0011] 进一步地,所述安卓应用显示单元采用xDroidUI,所述安卓应用兼容服务采用xDroidServer。
[0012] 进一步地,所述当安卓应用显示单元接收到安卓事件处理完成消息时,将安卓事件处理完成消息转发至键盘驱动;当安卓应用显示单元接收到安卓事件处理异常消息时,将安卓事件处理异常消息转发至键盘驱动中,所述安卓应用显示单元通过ioctl接口向键盘驱动发送安卓事件处理完成消息及安卓事件处理异常消息。
[0013] 进一步地,所述处理标记1及处理标记2均占用四个字节。
[0014] 进一步地,所述设定时间为3秒钟。
[0015] 有益效果:
[0016] 本发明基于对桌面系统键盘驱动的修改,依据键盘事件中断机制通过键盘驱动、安卓应用显示单元及安卓应用兼容服务间的配合,实现从桌面系统内核直接将键盘输入事件发送至安卓兼容环境,不再需要窗口管理器转发和安卓应用显示单元转换事件,从而有效降低了安卓应用相关键盘事件的响应延迟,提高了键盘事件的处理效率。

具体实施方式

[0017] 下面列举实施例,对本发明进行详细描述。
[0018] 本发明提供的一种基于中断穿透的跨运行环境低延迟输入方法,其基本思想是:通过修改桌面系统的键盘驱动实现从桌面系统的内核直接将键盘输入事件发送到安卓兼容环境中,而不再需要通过桌面系统窗口管理器的转发和安卓应用显示单元对事件的转换。
[0019] 本发明提供的一种基于中断穿透的跨运行环境低延迟输入方法,包括以下步骤:
[0020] 在桌面系统内,当安卓应用桌面窗口被激活时,安卓应用显示单元向安卓应用兼容服务发送获取输入焦点视图ID消息;当安卓应用显示单元接收到焦点视图消息时,若焦点视图消息中的视图ID不为NULL则向键盘驱动发送包含视图ID的焦点编辑视图消息,否则向键盘驱动发送视图消息;当安卓应用桌面窗口失去焦点时,向键盘驱动发送视图消息;当安卓应用显示单元接收到安卓事件处理完成消息时,将安卓事件处理完成消息转发至键盘驱动;当安卓应用显示单元接收到安卓事件处理异常消息时,将安卓事件处理异常消息转发至键盘驱动。
[0021] 在桌面系统内,键盘驱动在初始化过程中将按键处理标识值、按键识别标识值以及视图标识值分别设置为FALSE、TRUE和NULL,并在创建系统设备文件的同时创建安卓兼容环境可读取的安卓兼容设备文件;当接收到焦点编辑视图消息时,键盘驱动将视图标识值设置为消息中的视图ID;当接收到视图消息时,键盘驱动将视图标识值设置为NULL;当接收到安卓事件处理完成消息时,将按键处理标识值及按键识别标识值均设置为TRUE;当接收到安卓事件处理异常消息时,将按键处理标识值及按键识别标识值分别设置为TRUE 和FALSE;
[0022] 当产生键盘中断且此时视图标识值不为NULL时提取键盘按键信息,如果键盘按键信息中包含非可见字符按键则将按键处理标识值及按键识别标识值分别设置为FALSE和TRUE,并将包含处理标记1及键盘按键信息的数据写入安卓兼容设备文件,若在设定时间内按键处理标识值变为TRUE且按键识别标识值也为TRUE则说明安卓应用兼容服务已完成键盘输入事件的处理键盘驱动不执行其他操作,若在设定时间内按键处理标识值变为TRUE且按键识别标识值为FALSE则说明安卓应用兼容服务无法识别键盘输入事件将执行桌面系统的标准键盘输入事件处理流程,若在设定时间内按键处理标识值仍为FALSE则执行桌面系统的标准键盘输入事件处理流程;当产生键盘中断且此时视图标识值不为NULL时提取键盘按键信息,如果键盘按键信息中不包含非可见字符按键则将包含处理标记2、视图ID及键盘按键信息的数据写入安卓兼容设备文件;其中,非可见字符按键为Ctrl、Alt、F1等非数字与字符的按键;
[0023] 当产生键盘中断且此时视图标识值为NULL时提取键盘按键信息,执行桌面系统的标准键盘输入事件处理流程。
[0024] 在安卓兼容环境启动时导入安卓兼容设备文件,当安卓应用兼容服务接收到获取输入焦点视图ID消息后,判断当前被激活的安卓应用内是否存在具有输入焦点的视图,若存在且视图的属性为可编辑则获取视图的视图ID构建包含具有实际取值的视图ID的焦点视图消息,否则构建包含取值为NULL的视图ID的焦点视图消息,并将焦点视图消息发送至安卓应用显示单元;当安卓兼容环境从安卓兼容设备文件中读取到键盘按键信息时,如果键盘按键信息中包含处理标记1,则执行安卓兼容环境的标准键盘输入事件处理流程,若执行过程正常完成则向安卓应用显示单元发送安卓事件处理完成消息,否则向安卓应用显示单元发送安卓事件处理异常消息;当安卓兼容环境从安卓兼容设备文件中读取到键盘按键信息时,如果键盘按键信息中包含处理标记2,则根据键盘按键信息构造标准安卓系统键盘事件,将键盘事件发送至当前具有输入焦点的编辑框,执行安卓兼容环境的标准键盘输入事件处理流程。
[0025] 实施例:
[0026] 本实施例在Linux系统上基于xDroid采用本发明提供的一种基于中断穿透的跨运行环境低延迟输入方法实现了Linux系统安卓应用相关键盘事件的安卓兼容环境直接响应,本实施例中xDroidUI为安卓应用显示单元、xDroidServer为安卓应用兼容服务、xDroidKeyboardDriver为本实例修改后的Linux系统键盘驱动,具体包括以下步骤:
[0027] S1、在Linux系统中xDroidUI监测安卓应用桌面窗口的焦点及输入焦点变化,并根据变化情况进行响应,具体为:
[0028] S1.1、在xDroidUI中采用变量androidInputFocus的取值表示安卓应用桌面窗口的输入焦点情况,androidInputFocus的取值为NULL说明安卓应用桌面窗口未获取输入焦点,androidInputFocus的取值为安卓应用桌面窗口的窗口ID则说明安卓应用桌面窗口已获取输入焦点。
[0029] S1.2、当xDroidUI监测到存在安卓应用桌面窗口被激活时,则通过RPC与安卓应用兼容服务通信,向安卓应用兼容服务发送获取输入焦点视图ID消息;当接收到安卓应用兼容服务返回的焦点视图消息时,若焦点视图消息的视图ID为viewID则将androidInputFocus设置为viewID,并通过ioctl接口向xDroidKeyboardDriver发送包含视图ID的焦点编辑视图消息,以通知xDroidKeyboardDriver将视图标识值focusedEditView设置为viewID;若焦点视图消息的视图ID为空则将androidInputFocus设置为NULL,并通过ioctl接口向xDroidKeyboardDriver发送视图消息,以通知xDroidKeyboardDriver将focusedEditView设置为NULL;
[0030] S1.3、当xDroidUI监测到存在安卓应用桌面窗口失去焦点时,则将androidInputFocus设置为NULL,并通过ioctl接口向xDroidKeyboardDriver发送视图消息,以通知xDroidKeyboardDriver将focusedEditView设置为NULL。
[0031] S1.4、当xDroidUI接收到安卓事件处理完成消息或安卓事件处理异常消息时,则通过ioctl接口将安卓事件处理完成消息或安卓事件处理异常消息转发至xDroidKeyboardDriver。
[0032] S2、在Linux系统实现键盘驱动xDroidKeyboardDriver,包括以下步骤:
[0033] S2.1、在xDroidKeyboardDriver初始化时,将focusedEditView、按键处理标识值ctrlKeyHandled及按键识别标识值ctrlKeyRecognized分别设置为NULL、FALSE和TRUE,并在创建系统设备文件(/dev/input/xxxx)的同时创建安卓兼容设备文件(/dev/input/xdroid‑keyboard),且在安卓兼容环境启动时将安卓兼容设备文件导入兼容环境所在的容器,如:导入后设备路径为/dev/input/event0。由此安卓兼容环境可直接访问安卓兼容设备文件,如:InputManager创建的InputReader线程能够在安卓兼容环境内的文件系统上通过读取/dev/input/event0获取键盘事件信息。
[0034] S2.2、当接收到焦点编辑视图消息时,键盘驱动将视图标识值设置为消息中的视图ID;当接收到视图消息时,键盘驱动将视图标识值设置为NULL;当接收到安卓事件处理完成消息时,将按键处理标识值及按键识别标识值均设置为TRUE;当接收到安卓事件处理异常消息时,将按键处理标识值及按键识别标识值分别设置为TRUE 和FALSE。
[0035] S2.3、当系统设备文件中产生键盘中断时,若此时focusedEditView不为NULL则从系统设备文件中提取键盘按键信息,当键盘按键信息中包含Ctrl、Alt等非可见字符按键时执行S2.4,当键盘按键信息中不包含Ctrl、Alt等非可见字符按键时执行S2.5;若此时focusedEditView为NULL则执行后续Linux系统的标准处理流程。
[0036] S2.4、将ctrlKeyHandled及ctrlKeyRecognized分别设置为FALSE和TRUE;构造新的键盘输入数据,该数据为二进制数组,包括处理标记1记为xDroidMagicNumber1及原始的键盘按键信息,并将数据写入/dev/input/xdroid‑keyboard文件中;设置等待超时为3秒钟,若等待超时内ctrlKeyHandled变为TRUE且ctrlKeyRecognized为FALSE,则执行后续Linux系统的标准处理流程;若等待超时内ctrlKeyHandled变为TRUE且ctrlKeyRecognized为TRUE则说明安卓应用兼容服务已完成键盘输入事件的处理,键盘驱动则不再需要执行其他操作;若等待超时内ctrlKeyHandled变为FALSE,则执行后续Linux系统的标准处理流程。
[0037] S2.5、构造新的键盘输入数据,该数据为二进制数组,包括处理标记2记为xDroidMagicNumber2、focusedEditView及原始的键盘按键信息,并将数据写入/dev/input/xdroid‑keyboard文件中。
[0038] 其中,xDroidMagicNumber1及xDroidMagicNumber2可占用四个字节。
[0039] 为了进一步提高处理效率,本实施例中还可采用由xDroidKeyboardDriver创建独立设备对象,并将该独立设备对象导入安卓兼容环境内,实现由安卓兼容环境内的InputManager通过ioctl接口直接通知xDroidKeyboardDriver修改ctrlKeyHandled和ctrlKeyRecognized。
[0040] S3、安卓兼容环境内,当安卓应用兼容服务接收到获取输入焦点视图ID消息后,获取当前被激活的安卓应用桌面窗口所对应的安卓应用的最上层Window及最上层Window的DecorView,通过调用DecorView的findFocus方法获取具有输入焦点的View,如:View editView = getWindow().getDecorView().findFocus();若editView不为空且属性为可编辑,即为Editable,则获取editView的viewID构建包含viewID的焦点视图消息,否则构建包含取值为NULL的视图ID的焦点视图消息,将焦点视图消息发送至安卓应用显示单元;
[0041] 当安卓兼容环境从/dev/input/xdroid‑keyboard文件中读取到键盘按键信息时,若最前面的四个字节为xDroidMagicNumber1则执行S4,xDroidMagicNumber2则执行S5。
[0042] S4、执行安卓兼容环境的标准键盘输入事件处理流程,若安卓兼容环境已完成此键盘事件的处理,则通过RPC向xDroidUI发送安卓事件处理完成消息;否则通过RPC向xDroidUI发送安卓事件处理异常消息。
[0043] S5、根据键盘按键信息构造标准安卓系统键盘事件,将键盘事件发送至当前具有输入焦点的编辑框,执行安卓兼容环境的标准键盘输入事件处理流程。
[0044] 具体来说,按照标准流程解析键盘按键信息,根据键盘按键信息构造KeyEvent,通过WindowManagerService服务获取当前最顶Window,通过Window获取DecorView,调用DecorView的findViewById方法获取ID为viewID的Edit,再将KeyEvent发送至该Edit。其中,将KeyEvent发送至该Edit所采用的发送方式,既可以是发送事件的方式,也可以是调用Edit的dispatchKeyEvent方法进行发送的方式。
[0045] 综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。