一种跨运行环境的低延迟鼠标驱动优化方法与流程

文档序号:32134301发布日期:2022-11-09 12:00阅读:101来源:国知局

1.本发明属于桌面操作系统上运行移动应用的开发技术领域,具体涉及一种跨运行环境的低延迟鼠标驱动优化方法。


背景技术:

2.linux操作系统安卓兼容环境(下文简称安卓兼容环境)是一种在linux操作系统上运行安卓应用的技术,对丰富linux操作系统应用生态有着重要的意义。通常情况下,典型的安卓兼容环境主要包括安卓应用显示单元和安卓应用兼容服务,安卓应用显示单元用于在桌面操作系统上实现安卓应用的用户界面,安卓应用兼容服务用于提供运行于桌面操作系统上的安卓兼容环境,通过安卓应用显示单元与安卓应用兼容服务的相互配合实现安卓应用在桌面操作系统上的有效运行,例如,现有安卓兼容环境的实现方案有xdroid,它包括xdroidui和xdroidserver,xdroidui为安卓应用显示单元,xdroidserver为安卓应用兼容服务,通过xdroid与xdroidui的配合即可实现安卓应用与linux操作系统的兼容。
3.现有安卓兼容环境中当用户使用鼠标操作时,linux系统内核的鼠标驱动将接收到鼠标硬件的输入事件,然后创建鼠标设备文件,同时将鼠标设备文件传递到用户态,并将输入事件中的信息写入鼠标设备文件中;处于用户态的窗口管理器(如x11或wayland)持续监听鼠标设备文件内的数据,当读取到鼠标设备文件存在数据时,通过计算鼠标坐标获取当前鼠标操作对应的应用后再将鼠标输入信息传递至对应的应用;当运行在linux系统内的安卓应用所对应的linux窗口应用(如xdroidui)收到鼠标输入信息时,linux窗口应用完成坐标的偏移处理后将其转换为安卓系统内的touch事件,再通过rpc或pipe等方式将touch事件传递至安卓兼容环境内;安卓兼容环境内inputflinger服务再将接收到的touch事件向上传递至安卓兼容环境的框架中,安卓兼容环境的框架再通过坐标计算、window/view的遍历等一系列操作将touch事件传递至目标视图;最后由目标视图完成对touch事件的处理。
4.由此可见,在linux系统中使用鼠标操作安卓应用时,linux系统内核无法直接将鼠标事件发送至安卓兼容环境内,而是需要经过较长的转发处理链条才能实现,转发过程涉及的相关进程较多,因此会在一定程度上影响linux系统及安卓应用的运行性能,降低用户在linux系统上使用安卓应用的体验。


技术实现要素:

5.有鉴于此,本发明提供了一种跨运行环境的低延迟鼠标驱动优化方法,能够实现linux系统内核直接将鼠标事件的相关信息传递至安卓兼容环境内。
6.本发明提供的一种跨运行环境的低延迟鼠标驱动优化方法,包括以下步骤:步骤1、在linux系统初始化鼠标驱动时创建标准设备文件及安卓设备文件,并将安卓设备文件导入安卓兼容环境内;新建安卓应用窗口列表,所述安卓应用窗口列表用于记录安卓应用窗口的taskid、窗口矩形信息及安卓内部序列z-ordern,所述窗口矩形信息
包括安卓应用窗口对应视图的左上角坐标和窗口大小;步骤2、新建安卓应用窗口时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,由所有安卓应用窗口的taskid及z-ordern组成z-ordern序列对;将由新建安卓应用窗口的窗口矩形信息、taskid及z-ordern序列对组成的新建窗口消息发送至鼠标驱动;关闭安卓应用窗口时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,将由当前安卓应用窗口的taskid及z-ordern序列对组成的关闭窗口消息发送至鼠标驱动;最小化安卓应用窗口时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,再将由当前安卓应用窗口的taskid及z-ordern序列对组成的最小化窗口消息发送至鼠标驱动;当安卓应用显示单元接收到鼠标按下事件时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,再将由z-ordern序列对组成的鼠标按下消息发送至鼠标驱动;当安卓应用显示单元接收到鼠标按下事件及改变大小事件时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,再将由z-ordern序列对组成的停止写入消息发送至鼠标驱动;当安卓应用显示单元接收到鼠标按下事件及鼠标拖拽事件时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,再将z-ordern序列对组成的停止写入消息发送至鼠标驱动;当安卓应用显示单元接收到鼠标抬起事件时,如果此前已收到改变大小事件或鼠标拖拽事件则获取当前安卓应用窗口的窗口矩形信息,并计算所有安卓应用窗口的z-ordern,再将由当前安卓应用窗口的taskid、窗口矩形信息及z-ordern序列对组成的鼠标抬起消息发送至鼠标驱动;如果此前未收到改变大小事件及鼠标拖拽事件则计算所有安卓应用窗口的z-ordern,再将由当前安卓应用窗口的taskid及z-ordern序列对组成的鼠标抬起消息发送至鼠标驱动;当安卓应用显示单元接收到安卓应用窗口状态变化事件时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,再将z-ordern序列对组成的更新安卓应用窗口列表消息发送至鼠标驱动;步骤3、当鼠标驱动接收到新建窗口消息时,将新建安卓应用窗口的窗口矩形信息及taskid添加到安卓应用窗口列表中,并以z-ordern序列对更新安卓应用窗口列表;当鼠标驱动接收到关闭窗口消息时,将当前安卓应用窗口的taskid的相关信息从安卓应用窗口列表中删除,并以z-ordern序列对更新安卓应用窗口列表;当鼠标驱动接收到最小化窗口消息时,将安卓应用窗口列表中与当前安卓应用窗口taskid相对应的窗口矩形信息的数据均设为零,并以z-ordern序列对更新安卓应用窗口列表;当鼠标驱动接收到鼠标按下消息时,以z-ordern序列对更新安卓应用窗口列表,再提取输入事件中的鼠标坐标及鼠标按键状态,遍历安卓应用窗口列表判断是否存在满足鼠标坐标位于窗口矩形的范围内的安卓应用窗口的记录,若存在则执行步骤4,否则不响应;当鼠标驱动接收到停止写入消息时,以z-ordern序列对更新安卓应用窗口列表,并停止向安卓设备文件中写入数据;
当鼠标驱动接收到鼠标抬起消息时,若鼠标抬起消息中包含窗口矩形信息,则以当前安卓应用窗口的taskid、窗口矩形信息及z-ordern序列对更新安卓应用窗口列表;否则以z-ordern序列对更新安卓应用窗口列表,再提取输入事件中的鼠标坐标及鼠标按键状态,遍历安卓应用窗口列表判断是否存在满足鼠标坐标位于窗口矩形的范围内的安卓应用窗口的记录,若存在则执行步骤4,若不存在则不响应;当鼠标驱动接收到更新安卓应用窗口列表消息时,以z-ordern序列对更新安卓应用窗口列表;步骤4、根据鼠标坐标与记录的窗口矩形的左上角坐标,计算鼠标坐标相对于安卓兼容环境的坐标形成鼠标安卓坐标,再将鼠标安卓坐标、鼠标按键状态及记录的taskid写入安卓设备文件中;步骤5、安卓兼容环境内的输入管理服务读取安卓设备文件中新增的鼠标安卓坐标、鼠标按键状态及记录的taskid,根据taskid查询当前是否存在具有可见activity且taskid也相同的安卓应用窗口:如果存在,则判断安卓坐标是否与其保存的鼠标当前坐标相同,如果相同则将鼠标按键状态转换为安卓内的action_down或action_up后,在以安卓坐标及action_down或action_up构建安卓内的touchevent;如果不相同,则说明当前事件为鼠标移动事件,因此以安卓坐标及action_move构建安卓内的touchevent,并以安卓坐标更新其保存的鼠标当前坐标;然后将touchevent发送至taskid对应的可见activity,执行步骤6;如果不存在,则将该新增信息发送至activitymanagerservice;步骤6、安卓兼容环境内的activity响应接收到的touchevent。
7.进一步地,所述鼠标安卓坐标的计算方式为:具体来说,x
鼠标安卓坐标
=x
鼠标坐标-x
窗口矩形的左上角坐标
,y
鼠标安卓坐标
=y
鼠标坐标-y
窗口矩形的左上角坐标

8.进一步地,所述z-ordern的计算方法为:通过窗口管理器接口获取所有安卓应用窗口在linux系统内窗口排序z-order值,再将获取的值从小到大排序,最后按照小到大的顺序将z-order赋值为0到n得到z-ordern。
9.进一步地,所述安卓应用显示单元通过ioctl接口将所述新建窗口消息、关闭窗口消息、最小化窗口消息、鼠标按下消息、停止写入消息、鼠标抬起消息或更新安卓应用窗口列表消息发送至鼠标驱动。
10.有益效果:本发明通过令linux系统的鼠标驱动同时维护标准设备文件及安卓设备文件,并仅将与安卓应用相关的能够操作安卓视图的鼠标事件写入安卓设备文件,同时安卓兼容环境内的输入管理服务根据安卓设备文件的信息构造安卓系统鼠标事件再将其发送至对应的安卓应用,实现了安卓兼容环境对鼠标事件的快速处理,减少了linux侧与安卓侧的鼠标事件处理流程,降低了安卓应用对鼠标移动、单击等操作的响应延迟,改善了用户的使用体验。
具体实施方式
11.下面列举实施例,对本发明进行详细描述。
12.本发明提供了一种跨运行环境的低延迟鼠标驱动优化方法,通过linux系统中的
安卓应用显示单元、linux系统的鼠标驱动、安卓兼容环境内的输入管理服务及安卓应用窗口之间的交互实现鼠标对安卓应用的控制,具体包括以下步骤:步骤1、在linux系统初始化鼠标驱动时,为鼠标驱动同时创建标准设备文件及安卓设备文件,并将安卓设备文件导入安卓兼容环境内,以便安卓兼容环境内的输入管理服务能够读取安卓设备文件;同时,新建由鼠标驱动维护的安卓应用窗口列表,安卓应用窗口列表中记录了安卓应用窗口的taskid、窗口矩形信息及安卓内部序列z-ordern,窗口矩形信息包括安卓应用窗口的左上角坐标和窗口大小。
13.其中,安卓内部序列z-ordern是指安卓应用窗口在所有安卓应用窗口中的排序。安卓应用窗口的左上角坐标和窗口大小是指安卓应用窗口内视图的左上角坐标和大小,也就是linux窗口除去标题栏和边框的窗口。
14.步骤2、新建安卓应用窗口时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,由所有安卓应用窗口的taskid及z-ordern组成z-ordern序列对;将由新建安卓应用窗口的窗口矩形信息、taskid及z-ordern序列对组成的新建窗口消息发送至鼠标驱动;关闭安卓应用窗口时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,将由当前安卓应用窗口的taskid及z-ordern序列对组成的关闭窗口消息发送至鼠标驱动;最小化安卓应用窗口时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,再将由当前安卓应用窗口的taskid及z-ordern序列对组成的最小化窗口消息发送至鼠标驱动;当安卓应用显示单元接收到鼠标按下事件时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,再将由z-ordern序列对组成的鼠标按下消息发送至鼠标驱动;当安卓应用显示单元接收到鼠标按下事件及改变大小事件时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,再将由z-ordern序列对组成的停止写入消息发送至鼠标驱动;当安卓应用显示单元接收到鼠标按下事件及鼠标拖拽事件时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,再将z-ordern序列对组成的停止写入消息发送至鼠标驱动;当安卓应用显示单元接收到鼠标抬起事件时,如果此前已收到改变大小事件或鼠标拖拽事件则获取当前安卓应用窗口的窗口矩形信息,并计算所有安卓应用窗口的z-ordern,再将由当前安卓应用窗口的taskid、窗口矩形信息及z-ordern序列对组成的鼠标抬起消息发送至鼠标驱动;如果此前未收到改变大小事件及鼠标拖拽事件则计算所有安卓应用窗口的z-ordern,再将由当前安卓应用窗口的taskid及z-ordern序列对组成的鼠标抬起消息发送至鼠标驱动;当安卓应用显示单元接收到安卓应用窗口状态变化事件时,安卓应用显示单元计算所有安卓应用窗口的z-ordern,再将z-ordern序列对组成的更新安卓应用窗口列表消息发送至鼠标驱动。
15.步骤3、当鼠标驱动接收到新建窗口消息时,将新建安卓应用窗口的窗口矩形信息及taskid添加到安卓应用窗口列表中,并以z-ordern序列对更新安卓应用窗口列表;当鼠标驱动接收到关闭窗口消息时,将当前安卓应用窗口的taskid的相关信息从安卓应用窗口列表中删除,并以z-ordern序列对更新安卓应用窗口列表;
当鼠标驱动接收到最小化窗口消息时,将安卓应用窗口列表中与当前安卓应用窗口taskid相对应的窗口矩形信息的数据均设为零,并以z-ordern序列对更新安卓应用窗口列表;当鼠标驱动接收到鼠标按下消息时,以z-ordern序列对更新安卓应用窗口列表,再提取输入事件中的鼠标坐标及鼠标按键状态,遍历安卓应用窗口列表判断是否存在满足鼠标坐标位于窗口矩形的范围内的安卓应用窗口的记录,若存在则执行步骤4,否则不响应;当鼠标驱动接收到停止写入消息时,以z-ordern序列对更新安卓应用窗口列表,并停止向安卓设备文件中写入数据;当鼠标驱动接收到鼠标抬起消息时,若鼠标抬起消息中包含窗口矩形信息,则以当前安卓应用窗口的taskid、窗口矩形信息及z-ordern序列对更新安卓应用窗口列表;否则以z-ordern序列对更新安卓应用窗口列表,再提取输入事件中的鼠标坐标及鼠标按键状态,遍历安卓应用窗口列表判断是否存在满足鼠标坐标位于窗口矩形的范围内的安卓应用窗口的记录,若存在则执行步骤4,若不存在则不响应;当鼠标驱动接收到更新安卓应用窗口列表消息时,以z-ordern序列对更新安卓应用窗口列表。
16.步骤4、根据鼠标坐标与记录的窗口矩形的左上角坐标,计算鼠标坐标相对于安卓兼容环境的坐标形成鼠标安卓坐标,再将鼠标安卓坐标、鼠标按键状态及记录的taskid写入安卓设备文件中。
17.具体来说,鼠标安卓坐标=鼠标坐标-窗口矩形的左上角坐标,即x
安卓
=x
linux
‑ꢀ
x
矩形
,y
安卓
=y
linux
‑ꢀy矩形。
18.步骤5、安卓兼容环境内的输入管理服务读取安卓设备文件中新增的鼠标安卓坐标、鼠标按键状态及记录的taskid,根据taskid查询当前是否存在具有可见activity且taskid也相同的安卓应用窗口:如果存在,则判断安卓坐标是否与其保存的鼠标当前坐标相同,如果相同则将鼠标按键状态转换为安卓内的action_down或action_up后,在以安卓坐标及action_down或action_up构建安卓内的touchevent;如果不相同,则说明当前事件为鼠标移动事件,因此以安卓坐标及action_move构建安卓内的touchevent,并以安卓坐标更新其保存的鼠标当前坐标;然后将touchevent发送至taskid对应的可见activity,执行步骤6;如果不存在,则将该新增信息发送至activitymanagerservice。
19.步骤6、安卓兼容环境内的activity响应接收到的touchevent。
20.实施例:本实例以xdroid为例通过修改linux系统的鼠标驱动实现了本发明提供的一种跨运行环境的低延迟鼠标驱动优化方法。本实例中将修改后的鼠标驱动记为xdroidmousedriver,xdroidmousedriver创建并维护[taskid, rect,z-ordern]的三元组,其中,taskid为安卓应用窗口所对应的taskid,rect为安卓应用窗口所对应窗口矩形信息,z-ordern为安卓应用窗口所对应安卓内部序列z-ordern,并将此三元组加入安卓应用窗口列表androidwindowrectlist中, androidwindowrectlist中的三元组是按照z-ordern从小到大排序的。
[0021]
具体包括以下步骤:s1、在linux的鼠标驱动初始化时,会创建设备文件/dev/input/xxxx,本发明同时还创建了安卓设备文件/dev/input/xdroid-mouse,并在启动安卓兼容环境时导入安卓兼容环境所在容器,这样运行在安卓兼容环境内部的inputflinger(inputmanagerservice)也就能够在安卓系统内的文件系统上直接读取/dev/input/xdroid-mouse以获取鼠标事件信息。
[0022]
s2、xdroidui跟踪和记录安卓兼容环境的所有应用窗口的所有矩形。
[0023]
当新建安卓应用窗口时:xdroidui记录新建窗口的左上角坐标和大小,计算所有安卓应用窗口的z-ordern,由所有安卓应用窗口的taskid及z-ordern组成z-ordern序列对,将由新建安卓应用窗口的窗口矩形信息、taskid及z-ordern序列对组成的新建窗口消息通过ioctl接口传递至xdroidmousedriver;xdroidmousedriver将该记录增加到androidwindowrectlist中,并以z-ordern序列对更新androidwindowrectlist;当关闭安卓应用窗口时:xdroidui计算所有安卓应用窗口的z-ordern,将由当前安卓应用窗口的taskid及z-ordern序列对组成的关闭窗口消息通过ioctl接口传递至xdroidmousedriver,xdroidmousedriver从androidwindowrectlist中删除该taskid对应的记录,并以z-ordern序列对更新androidwindowrectlist;当xdroidui检测到鼠标按下事件时并开始被resize时,计算所有安卓应用窗口的z-ordern,并通过ioctl接口通知xdroidmousedriver停止向安卓设备文件中写入数据,并更新androidwindowrectlist;当xdroidui检测到鼠标释放时,若同时检测到resize事件,则记录resize后窗口的窗口矩形信息,计算所有安卓应用窗口的z-ordern,并通过ioctl接口将窗口信息、此窗口的taskid及z-ordern序列对传递给xdroidmousedriver,xdroidmousedriver根据taskid更新对应的项;如果此前未收到resize事件及鼠标拖拽事件则计算所有安卓应用窗口的z-ordern,再将由当前安卓应用窗口的taskid及z-ordern序列对通过ioctl接口发送至xdroidmousedriver,执行s3;当xdroidui检测到鼠标按下事件及鼠标拖拽事件时,计算所有安卓应用窗口的z-ordern,通过ioctl接口通知xdroidmousedriver停止向安卓设备文件中写入数据并更新androidwindowrectlist;当检测到鼠标释放时,记录拖动后的窗口的新左上角坐标和大小,并通过ioctl接口将窗口信息和此窗口的taskid传递给xdroidmousedriver,xdroidmousedriver根据taskid更新对应的项,同时,执行s3;当xdroidui检测到安卓应用窗口的activate和deactivate事件时,计算所有安卓应用窗口的z-ordern,并通过ioctl接口传递给xdroidmousedriver,xdroidmousedriver更新androidwindowrectlist。
[0024]
其中,z-ordern的计算方法为:通过窗口管理器接口获取xdroidui的所有安卓应用窗口在linux系统内窗口排序z-order值,将获取的值从小到大排序,依次将z-order赋值为0到n得到z-ordern。
[0025]
s3、xdroidmousedriver在向/dev/input/xxxx写入数据时,提取数据中的鼠标坐标mousepos和鼠标按键状态mousekeystatus,然后遍历androidwindowrectlist,对于其中每个三元组appgeometryinfo:[taskid, rect,z-order],执行以下步骤:
如果mousepos位于appgeometryinfo中的rect内,则计算坐标x=xmousepos-xrect,y=ymousepos-yrect,再将x、y、mousekeystatus和appgeometryinfo.taskid组合成鼠标数据写入/dev/input/xdroid-mouse。
[0026]
s4、通过安卓系统的inputflinger(inputmanagerservice),实现阻塞读取/dev/input/xdroid-mouse,读取到数据后提取x、y、mousekeystatus和taskid,通过taskid查询对应的task,如存在该task且task同时存在一个可见activity,则:根据mousekeystatus设置正确的action状态如action_down、action_up;比较x、y和currentmousex和currentmousey,若不同则设置action状态为action_move,并设置currentmousex为x、currentmousey为y,再构建touchevent,并将直接touchevent通过binder接口发送给目标activity。
[0027]
s5、通过修改安卓的activity的ontransact接口,实现当接收到来自修改后的inputmanagerservice的touchevent后,调用dispatchtouchevent,执行安卓系统的标准流程,完成对鼠标事件的响应。
[0028]
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1