一种安卓系统窗口对象获取方法和装置制造方法

文档序号:6639060阅读:231来源:国知局
一种安卓系统窗口对象获取方法和装置制造方法
【专利摘要】本发明公开了一种安卓系统窗口对象获取方法和装置,涉及智能移动终端【技术领域】。所述方法包括:在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用;将所述拦截的初始窗口对象获取函数替换为第一窗口对象获取函数;在触发窗口服务以获取窗口对象时,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程;所述指定进程从所述窗口对象中提取各子窗口对象。本发明解决了不能够同时满足获取窗口对象速度快并且适用所有android版本的问题,取得了在兼顾各种android版本的情况下可以快速的获取到窗口对象有益效果。
【专利说明】_种安卓系统窗口对象获取方法和装置

【技术领域】
[0001]本发明涉及智能移动终端【技术领域】,具体涉及一种安卓系统窗口对象获取方法和
目.0

【背景技术】
[0002]随着智能手机的发展,出现了多种支持智能手机的系统。比如android(安卓)系统。Android是一种以Linux为基础的开放源码操作系统,主要使用于手机等移动终端。Android平台由操作系统、中间件、用户界面和应用软件组成。
[0003]随着Android系统的市场占有率的增加,越来越多的开发者基于Android系统开发app (applicat1n,应用),使用户使用android手机更方便。但是,每款app在开发完毕后,并不能马上上线,因为该app在实际系统上使用时,可能会出现一些bug,比如在app的各个UI界面(窗口对象)在用户点击时无法响应,UI跳转时跳转失败或者逻辑错误等。因此对于APP —般在开发完成后,需要先进行UI测试,当所有APP在android系统中的UI界面运行正常后才会正式发布。而在UI测试过程中,则采用某些工具获取APP的窗口对象,进行测试。
[0004]在传统的获取UI的工具中,存在以下几种,通过viewserver (窗口服务)获取窗口对象,该种方案适合所有的android版本,但是速度慢;还有一种是通过AccessibilityService (辅助功能服务)获取窗口对象,虽然该种方式获取窗口对象的速度快,但是只适用于android4.1版本之上,并且其获取的窗口对象并不全面,对于父窗口对象的子窗口对象可能会遗失;还有一种是通过uiAutomator (UI自动化测试工具)获取窗口对象,但是该测试工具只适合android4.2版本之上。
[0005]在上述传统的方法中,都不能够同时满足获取窗口对象速度快并且适用所有android版本的。


【发明内容】

[0006]鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的一种安卓系统窗口对象获取装置和相应的一种安卓系统窗口对象获取方法。
[0007]依据本发明的一个方面,提供了了一种安卓系统窗口对象获取方法,包括:
[0008]在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用;
[0009]将所述拦截的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0010]在触发窗口服务以获取窗口对象时,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程;
[0011]所述指定进程从所述窗口对象中提取各子窗口对象。
[0012]优选地,所述在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用包括:
[0013]监听是否开始创建窗口服务;
[0014]如果监听到开始创建窗口服务,则拦截对所述窗口服务的创建,从而拦截窗口服务对其需要调用的安卓系统中初始窗口对象获取函数的加载。
[0015]优选地,将所述拦截窗口对象获取函数替换为第一窗口对象获取函数包括:
[0016]在拦截对所述窗口服务的创建后,将窗口服务需要加载的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0017]创建所述窗口服务,并加载所述第一窗口对象获取函数。
[0018]优选地,还包括:将安卓系统初始的进程孵化器替换为特定的第一进程孵化器;通过所述第一进程孵化器监听是否开始创建窗口服务。
[0019]优选地,所述通过所述第一进程孵化器监听是否开始创建窗口服务包括:
[0020]通过所述第一进程孵化器创建java虚拟机;
[0021]通过所述java虚拟机注册用于监听窗口服务的套接字,通过所述套接字监听是否开始创建窗口服务。
[0022]优选地,所述通过所述套接字监听是否开始创建窗口服务包括:
[0023]监听所述套接字中是否接收到创建窗口服务的第一消息;如果所述套接字接收到创建窗口服务的第一消息,则确定开始创建窗口服务。
[0024]优选地,所述将窗口服务需要加载的初始窗口对象获取函数替换为第一窗口对象获取函数包括:
[0025]将窗口服务需要加载的初始getfocuswindow函数,替换为第一 getfocuswindow函数;所述第一 getfocuswindow函数的返回时序为返回指定进程。
[0026]优选地,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象包括:
[0027]通过第一 getfocuswindow函数,查找窗口对象堆栈顶部的windowstata窗口对象。
[0028]优选地,还包括:在窗口对象堆栈顶部的窗口对象发生变化时,判断所述窗口对象是否已经获取;
[0029]如果所述窗口对象未获取,则继续将所述窗口对象返回指定进程。
[0030]依据本发明的另外一个方面,本发明还公开了一种安卓系统窗口对象获取装置,包括:
[0031]拦截模块,适于在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用;
[0032]函数替换模块,适于将所述拦截的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0033]窗口对象获取模块,适于在触发窗口服务以获取窗口对象时,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程;
[0034]窗口获取模块,适于所述指定进程从所述窗口对象中提取各子窗口对象。
[0035]优选地,所述拦截模块包括:
[0036]窗口服务创建监听模块,适于监听是否开始创建窗口服务;
[0037]第一拦截模块,适于如果监听到开始创建窗口服务,则拦截对所述窗口服务的创建,从而拦截窗口服务对其需要调用的安卓系统中初始窗口对象获取函数的加载。
[0038]优选地,所述函数替换模块包括:
[0039]第一函数替换模块,适于在拦截对所述窗口服务的创建后,将窗口服务需要加载的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0040]窗口服务创建模块,适于创建所述窗口服务,并加载所述第一窗口对象获取函数。
[0041]优选地,还包括:
[0042]进程孵化器替换模块,适于将安卓系统初始的进程孵化器替换为特定的第一进程孵化器;通过所述第一进程孵化器监听是否开始创建窗口服务。
[0043]优选地,所述窗口服务创建监听模块包括:
[0044]虚拟机创建模块,适于通过所述第一进程孵化器创建java虚拟机;
[0045]第一窗口服务创建监听模块,适于通过所述java虚拟机注册用于监听窗口服务的套接字,通过所述套接字监听是否开始创建窗口服务。
[0046]优选地,所述第一窗口服务创建监听模块包括:
[0047]创建消息监听模块,适于监听所述套接字中是否接收到创建窗口服务的第一消息;如果所述套接字接收到创建窗口服务的第一消息,则确定开始创建窗口服务。
[0048]优选地,所述第一函数替换模块包括:
[0049]第二函数替换模块,适于将窗口服务需要加载的初始getfocuswindow函数,替换为第一 getfocuswindow函数;所述第一 getfocuswindow函数的返回时序为返回指定进程。
[0050]优选地,所述窗口对象获取模块包括:
[0051]第一窗口对象获取模块,适于通过第一 getfocuswindow函数,查找窗口对象堆栈顶部的windowstata窗口对象。
[0052]优选地,还包括:窗口对象判断模块,适于在窗口对象堆栈顶部的窗口对象发生变化时,判断所述窗口对象是否已经获取;如果所述窗口对象未获取,则继续将所述窗口对象返回指定进程。
[0053]根据本发明的一种安卓系统窗口对象获取方法可以通过在viewserver调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用,将其获取的窗口对象不再通过view server传输方式,而是直接返回系统内部的指定进程,由指定进程可以直接从所述窗口对象中获取父窗口以及各个子窗口的信息。此解决了不能够同时满足获取窗口对象速度快并且适用所有android版本的问题,取得了在兼顾各种android版本的情况下可以快速的获取到窗口对象有益效果。
[0054]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。

【专利附图】

【附图说明】
[0055]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0056]图1示出了根据本发明一个实施例的一种安卓系统窗口对象获取方法的流程示意图;
[0057]图2示出了根据本发明一个实施例的一种安卓系统窗口对象获取方法的流程示意图;
[0058]图3示出了根据本发明一个实施例的一种安卓系统窗口对象获取方法的流程示意图;
[0059]图4示出了根据本发明一个实施例的一种安卓系统窗口对象获取装置的结构示意图;
[0060]图5示出了根据本发明一个实施例的一种安卓系统窗口对象获取装置的结构示意图;以及
[0061]图6示出了根据本发明一个实施例的一种安卓系统窗口对象获取装置的结构示意图。

【具体实施方式】
[0062]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0063]本发明的核心思想之一是:通过在viewserver调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用,将其获取的窗口对象不再通过viewserver传输方式,而是直接返回系统内部的指定进程,由指定进程可以直接从所述窗口对象中获取父窗口以及各个子窗口的信息。以至能够同时满足获取窗口对象速度快的情况下适用于所有android版本。
[0064]实施例一
[0065]参照图1,其示出了本发明一种安卓系统窗口对象获取方法的流程示意图,包括:
[0066]步骤110,在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用;
[0067]在传统的viewserver执行过程中,要通过viewserver去获取窗口对象时,需要调用窗口对象获取函数,在viewserver调用完所述窗口对象获取函数去窗口管理服务windows manager servive维持的窗口 list堆栈中获取窗口对象windostata后,会返回viewserver,然后再由viewserver通过外部套接字传输所述获取到窗口对象的所有数据。
[0068]其中,Viewserver是一种服务,可以理解为一个进程。
[0069]而本发明实施例,则viewserver调用所述窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用,然后进入步骤120。
[0070]在本发明实施例中,可以通过将安卓系统初始的进程孵化器替换为特定的第一进程孵化器,然后通过第一进程孵化器实现在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用。
[0071]步骤120,将所述拦截的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0072]本发明实施例将拦截的初始窗口对象获取函数,替换为自己的窗口对象获取函数,即前述第一窗口对象获取函数;本发明实施例中自己的窗口对象获取函数去windowsmanager servive维持的窗口 list堆栈中获取windowstata的功能和接口与初始的窗口对象获取函数一致,只是在获取到windowstata后返回的对象变更为本发明实施例指定的指定进程。
[0073]步骤130,在触发窗口服务以获取窗口对象时,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程;
[0074]在将拦截的初始的窗口对象获取函数替换为本发明自己的第一窗口对象获取函数之后,继续执行viewserver的调用,那么其调用的即为本发明的第一窗口对象获取函数,该第一窗口对象获取函数获取到windowstata后返回的对象变更为本发明实施例指定的指定进程。
[0075]在本发明实施例中,在返回时,可以通过viewserver和指定进程之间的pipe管道返回所述数据,不用经过外部socket的传输,提高了传输效率。
[0076]步骤140,所述指定进程从所述窗口对象中提取各子窗口对象。
[0077]由于windows manager servive 维持的窗口 list 堆栈中,每个 windowstata 对象均是一个主窗口下的所有窗口数据,比如对于一个启动的APP,该windowstata以APP的主窗口记录主窗口的信息,基于主窗口的子窗口信息,则在该主窗口之下继续记录,即通过一个windowstata可以获取任意激活的主窗口其本身的信息以及该窗口包含的所有子窗口的信息。因此本发明实施例指定进程获取到所述windowstata后,即可从中获取主窗口其本身的信息以及该窗口包含的所有子窗口的信息。
[0078]在本发明实施例中,viewserver调用的窗口对象获取函数为getfocuswindow,该函数是从windows manager servive维持的窗口 list堆栈的栈顶获取windowstata,栈顶的windowstata表示一个活动的Activity,即窗口对象,一个打开并且显示的APP可以理解为一个活动的APP,该APP的所有子窗口,也属于所述活动的Activity,那么此时获取栈顶的windowstata,即相当于获取了包括所述APP的所有窗口的数据结构,那么本发明的指定进程即可从windowstata这个数据结构中即可按窗口类以及父子关系获取所有的窗口消息。
[0079]在本发明实施例中,只有android系统中出现一个活动的Activity,即可通过上述过程获取其对应的窗口对象,从而获取该窗口对象中所有的窗口消息。
[0080]本发明实施例利用viewserver的读取窗口对象的机制,将其调用的窗口对象获取函数替换为返回对象为指定进程的第一窗口对象获取函数,然后继续执行viewserver的函数调用过程,其就会调用本发明的第一窗口对象获取函数,从而获取到窗口对象,并返回本发明的指定进程。上述过程,可以快速的将窗口对象返回指定进程,实现了能够同时满足获取窗口对象速度快的情况下适用于所有android版本的优点。
[0081]实施例二
[0082]参照图2,其示出了本发明一种安卓系统窗口对象获取方法的流程示意图,包括:
[0083]步骤210,监听是否开始创建窗口服务;
[0084]在本发明实施例中,可以在创建viewserver之前即开始进行拦截,即通过对viewserver创建过程的拦截,从而拦截viewserver对窗口对象获取函数的调用。
[0085]那么首先,监听android系统中是否开始创建viewserver。
[0086]优选的,还包括:
[0087]子步骤A212,将安卓系统初始的进程孵化器替换为特定的第一进程孵化器;通过所述第一进程孵化器监听是否开始创建窗口服务。
[0088]在本发明中,为了实现创建viewserver过程的监听,需要首先对android系统初始的进程孵化器即zygote进程进行替换,替换为指定的第一进程孵化器,即第一 zygote进程,该第一 zygote进程可以监听是否开始创建viewserver。
[0089]在Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由zygote进程孕育(fork)出来的,因此,本发明可通过android系统初始的zygote进程替换为第一 zygote进程实现监听和拦截过程。
[0090]当然,在替换安卓系统初始的zygote进程为第一 zygote进程后,需要重启android系统。替换后的第一 zygote进程的功能除了包括初始的zygote进程的功能之外,还添加了监听是否开始创建窗口服务以及监听之后的处理逻辑。
[0091]在本发明实施例中,在替换android系统初始的zygote进程为本发明的第一zygote进程,会将初始的zygotelnit类替换为本发明修改后的zygotelnit类,在该改后的zygotelnit类中除了包括zygote进程的功能之外,还添加了监听是否开始创建窗口服务以及监听之后的处理逻辑。当加载后,第一 zygote进程即可使android系统正常启动,也可以实现本发明的拦截功能。
[0092]当然,对于安卓系统,上述替换过程可预先获取系统的root权限,然后再进行替换。
[0093]优选的,所述通过所述第一进程孵化器监听是否开始创建窗口服务包括:
[0094]子步骤A213,通过所述第一进程孵化器创建java虚拟机;
[0095]子步骤A214,通过所述java虚拟机注册用于监听窗口服务的套接字,通过所述套接字监听是否开始创建窗口服务。
[0096]在android系统的正常启动过程中,大致为:启动系统一〉init进程读取启动init.rc一>init进程创建zygote进程一>zygote进程创建java虚拟机载入zygotelnit类一> 通过所述虚拟机注册需要监听的socket—>等待ActivityManagerService向socket写入创建进程的创建消息一 >zygote进程根据所述创建消息创建对应进程。
[0097]那么本发明在前述步骤将android系统初始的zygote进程替换为本发明指定的第一 zygote进程后,android系统重启后,其init进程即可创建本发明的第一 zygote进程,然后即可第一 zygote进程创建java虚拟机,进而注册用于监听窗口服务的套接字,通过所述套接字监听是否开始创建窗口服务。
[0098]优选的,所述通过所述套接字监听是否开始创建窗口服务包括:
[0099]子步骤A215,监听所述套接字中是否接收到创建窗口服务的第一消息;如果所述套接字接收到创建窗口服务的第一消息,则确定开始创建窗口服务。
[0100]上述注册的套接字,本发明实施例中是监听套接字中的接收到的消息。在android系统需要创建进程时,系统需要向套接字发送创建viewserver的第一消息,那么监听所述套接字中是否接收到创建窗口服务的第一消息,即可判断系统是否开始创建Vi ewserver。如果所述套接字接收到创建窗口服务的第一消息,则确定开始创建窗口服务。如果所述套接字没接收到创建窗口服务的第一消息,则系统没有创建窗口服务。
[0101]步骤220,如果监听到开始创建窗口服务,则拦截对所述窗口服务的创建,从而拦截窗口服务对其需要调用的安卓系统中初始窗口对象获取函数的加载;
[0102]那么本发明实施例在监听到开始创建viewserver后,则拦截对viewserver的创建。在本发明实施例中拦截对viewserver的创建的过程为拦截viewserver对其需要调用的函数的加载,比如拦截viewserver对其需要调用的窗口对象获取函数的加载。
[0103]步骤230,在拦截对所述窗口服务的创建后,将窗口服务需要加载的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0104]在本发明实施例中,在前述替换android系统初始的zygote进程为本发明的第一zygote进程时,将初始的zygotelnit类替换为本发明修改后的zygotelnit类的过程中,在修改后的zygotelnit类中,会将本发明需要的第一窗口对象获取函数也加进去,该第一窗口对象获取函数在获取到windowstata之前的过程与android系统原始的窗口对象获取函数一致,只是第一窗口对象获取函数获取到windowstata后的返回时序更改为直接返回指定进程。
[0105]步骤240,创建所述窗口服务,并加载所述第一窗口对象获取函数;
[0106]那么在将android系统初始的窗口对象获取函数替换为本发明的第一窗口对象获取函数之后,则可继续执行创建所述viewserver的过程,仓ll建之后则会加载其所需的函数,其所需的函数包括所述第一窗口对象获取函数。
[0107]步骤250,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程;
[0108]那么此时,当所述viewserver调用所述第一窗口对象获取函数去windowsmanager servive维持的窗口 list堆栈中获取到windowstata后,S卩可直接将所述windowstata通过viewserver和指定进程间的pipe管道返回android系统的指定进程,该指定进程可以为UI测试进程。
[0109]步骤260,所述指定进程从所述窗口对象中提取各子窗口对象。
[0110]然后即可从所述windowstata中获取其涉及的主窗口以及其中的各子窗口的信息。所述窗口的信息比如窗口中的内容,各窗口中的控件,各控件对应的子窗口等等各种信息。
[0111]本发明实施例利用viewserver的读取窗口对象的机制,对viewserver创建过程进行拦截,拦截后将其调用的初始窗口对象获取函数替换为返回对象为指定进程的第一窗口对象获取函数,然后继续创建viewserver,之后viewserver获取窗口对象时则会调用本发明的第一窗口对象获取函数,从而获取窗口对象,并返回本发明的指定进程,指定进程通过该窗口对象,可以获取其中的父窗口和所有子窗口的信息。上述过程,可以快速的将窗口对象返回指定进程,实现了能够同时满足获取窗口对象速度快的情况下适用于所有andro i d版本的优点。
[0112]实施例三
[0113]参照图3,其示出了本发明一种安卓系统窗口对象获取方法的流程示意图,包括:
[0114]步骤310,将安卓系统初始的进程孵化器替换为特定的第一进程孵化器;
[0115]即将android系统初始的zygote进程替换为本发明预置的第一 zygote进程;第一 zygote进程的功能除了包括初始的zygote进程的功能之外,还添加了监听是否开始创建窗口服务以及监听之后的处理逻辑。在替换后,可重启系统,启动系统最开始的init进程。
[0116]步骤320,通过所述第一进程孵化器创建java虚拟机;
[0117]所述init进程启动本发明实施例的第一 zygote进程
[0118]步骤330,通过所述java虚拟机注册用于监听窗口服务的套接字,监听所述套接字中是否接收到创建窗口服务的第一消息;如果所述套接字接收到创建窗口服务的第一消息,则确定开始创建窗口服务,进入步骤340 ;
[0119]如果所述套接字没有接收到创建窗口服务的第一消息,则按照其通常的执行流程执行。
[0120]步骤340,拦截对所述窗口服务的创建,从而拦截窗口服务对其需要调用的getfocuswindow函数的加载;
[0121]即拦截系统中在创建viewserver之前对其创建过程进行拦截,从而即可拦截窗口服务对其需要调用的getfocuswindow函数的加载。
[0122]在本发明实施例中,其目的是为了拦截viewserver对android系统中本身即有的初始getfocuswindow函数的加载。
[0123]步骤350,在拦截对所述窗口服务的创建后,将窗口服务需要加载的初始getfocuswindow 函数,替换为第一 getfocuswindow 函数;所述第一 getfocuswindow 函数的返回时序为返回指定进程;
[0124]本发明的第一 getfocuswindow函数与android系统中本身的初始getfocuswindow函数具有相同的参数设置,只是将系统的初始getfocuswindow函数的返回对象修改为了本发明的指定进程。
[0125]步骤360,创建所述窗口服务,并加载所述第一 getfocuswindow函数;
[0126]在替换了上述函数之后,即可继续执行进程孵化过程,第一 zygote进程可以继续创建viewserver,仓丨j建后加载第一 getfocuswindow函数的相关参数。
[0127]步骤370,窗口服务通过第一 getfocuswindow函数,查找窗口对象堆栈顶部的windowstata窗口对象,并将windowstata窗口对象返回指定进程;
[0128]通过前述步骤之后,在窗口服务执行获取窗口对象时,则可调用所述第一getfocuswindow函数,从存储窗口对象的堆栈,获取栈顶的windowstata,然后即可将windowstata通过viewserver和指定进程之间的pipe管道传返回给指定进程。当然viewserver和指定进程之间的pipe管道可以在使用是构建。
[0129]步骤380,所述指定进程从所述窗口对象中提取各子窗口对象。
[0130]优选的,还包括:
[0131]步骤382,在窗口对象堆栈顶部的窗口对象发生变化时,判断所述窗口对象是否已经获取;
[0132]步骤384,如果所述窗口对象未获取,则继续将所述窗口对象返回指定进程。
[0133]在本发明实施例中,因为第一 getfocuswindow函数是获取的栈顶的windowstata,而栈顶的windowstata表示当前展示的或者说激活应用的窗口对象,其他处于后台的窗口对象则会在栈顶之下的某个位置。本发明实施例只要栈顶的windowstata变化,即android系统当前展示的app变化,即可获取该变化后的windowstata。
[0134]那么本发明可不断获取栈顶的windowstata,并且对已经获取的windowstata进行记录,在下次获取windowstata之时,根据前述记录,如果栈顶的windowstata没有变化,则不用获取,如果栈顶的windowstata变化了,则继续将所述窗口对象返回指定进程。
[0135]本发明实施例利用viewserver的读取窗口对象的机制,对viewserver创建过程进行拦截,拦截后将其调用的初始窗口对象获取函数替换为返回对象为指定进程的第一窗口对象获取函数,然后继续创建viewserver,之后viewserver获取窗口对象时则会调用本发明的第一窗口对象获取函数,从而获取栈顶窗口对象,并返回本发明的指定进程,指定进程通过该窗口对象,可以获取其中的父窗口和所有子窗口的信息。上述过程,可以快速的将窗口对象返回指定进程,实现了能够同时满足获取窗口对象速度快的情况下适用于所有andro i d版本的优点。
[0136]实施例四
[0137]参照图4,其示出了本发明一种安卓系统窗口对象获取装置的结构示意图,包括:
[0138]拦截模块410,适于在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用;
[0139]函数替换模块420,适于将所述拦截的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0140]窗口对象获取模块430,适于在触发窗口服务以获取窗口对象时,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程。
[0141]窗口获取模块440,适于所述指定进程从所述窗口对象中提取各子窗口对象。
[0142]实施例五
[0143]参照图5,其示出了本发明一种安卓系统窗口对象获取装置的结构示意图,包括:
[0144]拦截模块510,包括:
[0145]窗口服务创建监听模块512,适于监听是否开始创建窗口服务;
[0146]第一拦截模块514,适于如果监听到开始创建窗口服务,则拦截对所述窗口服务的创建,从而拦截窗口服务对其需要调用的安卓系统中初始窗口对象获取函数的加载;
[0147]函数替换模块520,包括:
[0148]第一函数替换模块522,适于在拦截对所述窗口服务的创建后,将窗口服务需要加载的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0149]窗口服务创建模块524,适于创建所述窗口服务,并加载所述第一窗口对象获取函数;
[0150]窗口对象获取模块530,适于在触发窗口服务以获取窗口对象时,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程。
[0151]窗口获取模块540,适于所述指定进程从所述窗口对象中提取各子窗口对象。
[0152]优选的,还包括:
[0153]进程孵化器替换模块,适于将安卓系统初始的进程孵化器替换为特定的第一进程孵化器;通过所述第一进程孵化器监听是否开始创建窗口服务。
[0154]优选的,所述窗口服务创建监听模块包括:
[0155]虚拟机创建模块,适于通过所述第一进程孵化器创建java虚拟机;
[0156]第一窗口服务创建监听模块,适于通过所述java虚拟机注册用于监听窗口服务的套接字,通过所述套接字监听是否开始创建窗口服务。
[0157]优选的,所述第一窗口服务创建监听模块包括:
[0158]创建消息监听模块,适于监听所述套接字中是否接收到创建窗口服务的第一消息;如果所述套接字接收到创建窗口服务的第一消息,则确定开始创建窗口服务。
[0159]实施例六
[0160]参照图6,其示出了本发明一种安卓系统窗口对象获取装置的结构示意图,包括:
[0161]进程孵化器替换模块610,适于将安卓系统初始的进程孵化器替换为特定的第一进程孵化器;
[0162]虚拟机创建模块620,适于通过所述第一进程孵化器创建java虚拟机;
[0163]第一窗口服务创建监听模块630,适于通过所述java虚拟机注册用于监听窗口服务的套接字,监听所述套接字中是否接收到创建窗口服务的第一消息;如果所述套接字接收到创建窗口服务的第一消息,则确定开始创建窗口服务,进入第二函数替换模块640。
[0164]第二拦截模块640,拦截对所述窗口服务的创建,从而拦截窗口服务对其需要调用的getfocuswindow函数的加载;
[0165]第二函数替换模块650,适于将窗口服务需要加载的初始getfocuswindow函数,替换为第一 getfocuswindow函数;所述第一 getfocuswindow函数的返回时序为返回指定进程;
[0166]窗口服务创建模块660,适于创建所述窗口服务,并加载所述第一 getfocuswindow函数;
[0167]第一窗口对象获取模块670,适于窗口服务通过第一 getfocuswindow函数,查找窗口对象堆栈顶部的windowstata窗口对象,并将windowstata窗口对象返回指定进程;
[0168]窗口获取模块680,适于所述指定进程从所述窗口对象中提取各子窗口对象。
[0169]优选的,还包括:
[0170]窗口对象判断模块,适于在窗口对象堆栈顶部的窗口对象发生变化时,判断所述窗口对象是否已经获取;如果所述窗口对象未获取,则继续将所述窗口对象返回指定进程
[0171]在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
[0172]在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0173]类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循【具体实施方式】的权利要求书由此明确地并入该【具体实施方式】,其中每个权利要求本身都作为本发明的单独实施例。
[0174]本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0175]此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0176]本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的安卓系统窗口对象获取设备中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0177]应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
[0178]本发明公开了 Al、一种安卓系统窗口对象获取方法,包括:
[0179]在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用;
[0180]将所述拦截的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0181]在触发窗口服务以获取窗口对象时,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程;
[0182]所述指定进程从所述窗口对象中提取各子窗口对象。
[0183]A2、如Al所述的方法,所述在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用包括:
[0184]监听是否开始创建窗口服务;
[0185]如果监听到开始创建窗口服务,则拦截对所述窗口服务的创建,从而拦截窗口服务对其需要调用的安卓系统中初始窗口对象获取函数的加载。
[0186]A3、如A2所述的方法,将所述拦截窗口对象获取函数替换为第一窗口对象获取函数包括:
[0187]在拦截对所述窗口服务的创建后,将窗口服务需要加载的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0188]创建所述窗口服务,并加载所述第一窗口对象获取函数。
[0189]A4、如A2所述的方法,还包括:
[0190]将安卓系统初始的进程孵化器替换为特定的第一进程孵化器;通过所述第一进程孵化器监听是否开始创建窗口服务。
[0191]A5、如A4所述的方法,所述通过所述第一进程孵化器监听是否开始创建窗口服务包括:
[0192]通过所述第一进程孵化器创建java虚拟机;
[0193]通过所述java虚拟机注册用于监听窗口服务的套接字,通过所述套接字监听是否开始创建窗口服务。
[0194]A6、如A5所述的方法,所述通过所述套接字监听是否开始创建窗口服务包括:
[0195]监听所述套接字中是否接收到创建窗口服务的第一消息;如果所述套接字接收到创建窗口服务的第一消息,则确定开始创建窗口服务。
[0196]A7、如A3所述的方法,所述将窗口服务需要加载的初始窗口对象获取函数替换为第一窗口对象获取函数包括:
[0197]将窗口服务需要加载的初始getfocuswindow函数,替换为第一 getfocuswindow函数;所述第一 getfocuswindow函数的返回时序为返回指定进程。
[0198]AS、如A7所述的方法,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象包括:
[0199]通过第一 getfocuswindow函数,查找窗口对象堆栈顶部的windowstata窗口对象。
[0200]A9、如A8所述的方法,还包括:
[0201]在窗口对象堆栈顶部的窗口对象发生变化时,判断所述窗口对象是否已经获取;
[0202]如果所述窗口对象未获取,则继续将所述窗口对象返回指定进程。
[0203]本发明还公开了 B10、一种安卓系统窗口对象获取装置,包括:
[0204]拦截模块,适于在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用;
[0205]函数替换模块,适于将所述拦截的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0206]窗口对象获取模块,适于在触发窗口服务以获取窗口对象时,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程;
[0207]窗口获取模块,适于所述指定进程从所述窗口对象中提取各子窗口对象。
[0208]BllJn BlO所述的装置,所述拦截模块包括:
[0209]窗口服务创建监听模块,适于监听是否开始创建窗口服务;
[0210]第一拦截模块,适于如果监听到开始创建窗口服务,则拦截对所述窗口服务的创建,从而拦截窗口服务对其需要调用的安卓系统中初始窗口对象获取函数的加载。
[0211]B12、如Bll所述的装置,所述函数替换模块包括:
[0212]第一函数替换模块,适于在拦截对所述窗口服务的创建后,将窗口服务需要加载的初始窗口对象获取函数替换为第一窗口对象获取函数;
[0213]窗口服务创建模块,适于创建所述窗口服务,并加载所述第一窗口对象获取函数。
[0214]B13、如Bll所述的装置,还包括:
[0215]进程孵化器替换模块,适于将安卓系统初始的进程孵化器替换为特定的第一进程孵化器;通过所述第一进程孵化器监听是否开始创建窗口服务。
[0216]B14、如B13所述的装置,所述窗口服务创建监听模块包括:
[0217]虚拟机创建模块,适于通过所述第一进程孵化器创建java虚拟机;
[0218]第一窗口服务创建监听模块,适于通过所述java虚拟机注册用于监听窗口服务的套接字,通过所述套接字监听是否开始创建窗口服务。
[0219]B15、如B14所述的装置,所述第一窗口服务创建监听模块包括:
[0220]创建消息监听模块,适于监听所述套接字中是否接收到创建窗口服务的第一消息;如果所述套接字接收到创建窗口服务的第一消息,则确定开始创建窗口服务。
[0221]B16jn B12所述的装置,所述第一函数替换模块包括:
[0222]第二函数替换模块,适于将窗口服务需要加载的初始getfocuswindow函数,替换为第一 getfocuswindow函数;所述第一 getfocuswindow函数的返回时序为返回指定进程。
[0223]B17、如B16所述的装置,所述窗口对象获取模块包括:
[0224]第一窗口对象获取模块,适于通过第一 getfocuswindow函数,查找窗口对象堆栈顶部的windowstata窗口对象。
[0225]B18、如B17所述的装置,还包括:
[0226]窗口对象判断模块,适于在窗口对象堆栈顶部的窗口对象发生变化时,判断所述窗口对象是否已经获取;如果所述窗口对象未获取,则继续将所述窗口对象返回指定进程。
【权利要求】
1.一种安卓系统窗口对象获取方法,包括: 在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用; 将所述拦截的初始窗口对象获取函数替换为第一窗口对象获取函数; 在触发窗口服务以获取窗口对象时,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程; 所述指定进程从所述窗口对象中提取各子窗口对象。
2.如权利要求1所述的方法,其特征在于,所述在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用包括: 监听是否开始创建窗口服务; 如果监听到开始创建窗口服务,则拦截对所述窗口服务的创建,从而拦截窗口服务对其需要调用的安卓系统中初始窗口对象获取函数的加载。
3.如权利要求2所述的方法,其特征在于,将所述拦截窗口对象获取函数替换为第一窗口对象获取函数包括: 在拦截对所述窗口服务的创建后,将窗口服务需要加载的初始窗口对象获取函数替换为第一窗口对象获取函数; 创建所述窗口服务,并加载所述第一窗口对象获取函数。
4.如权利要求2所述的方法,其特征在于,还包括: 将安卓系统初始的进程孵化器替换为特定的第一进程孵化器;通过所述第一进程孵化器监听是否开始创建窗口服务。
5.如权利要求4所述的方法,其特征在于,所述通过所述第一进程孵化器监听是否开始创建窗口服务包括: 通过所述第一进程孵化器创建java虚拟机; 通过所述java虚拟机注册用于监听窗口服务的套接字,通过所述套接字监听是否开始创建窗口服务。
6.如权利要求5所述的方法,其特征在于,所述通过所述套接字监听是否开始创建窗口服务包括: 监听所述套接字中是否接收到创建窗口服务的第一消息;如果所述套接字接收到创建窗口服务的第一消息,则确定开始创建窗口服务。
7.如权利要求3所述的方法,其特征在于,所述将窗口服务需要加载的初始窗口对象获取函数替换为第一窗口对象获取函数包括: 将窗口服务需要加载的初始getfocuswindow函数,替换为第一 getfocuswindow函数;所述第一 getfocuswindow函数的返回时序为返回指定进程。
8.如权利要求7所述的方法,其特征在于,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象包括: 通过第一 getfocuswindow函数,查找窗口对象堆栈顶部的windowstata窗口对象。
9.如权利要求8所述的方法,其特征在于,还包括: 在窗口对象堆栈顶部的窗口对象发生变化时,判断所述窗口对象是否已经获取; 如果所述窗口对象未获取,则继续将所述窗口对象返回指定进程。
10.一种安卓系统窗口对象获取装置,包括: 拦截模块,适于在窗口服务调用的窗口对象获取函数之前,拦截对所述安卓系统中初始窗口对象获取函数的调用; 函数替换模块,适于将所述拦截的初始窗口对象获取函数替换为第一窗口对象获取函数; 窗口对象获取模块,适于在触发窗口服务以获取窗口对象时,所述窗口服务通过调用所述第一窗口对象获取函数获取窗口对象并返回指定进程; 窗口获取模块,适于所述指定进程从所述窗口对象中提取各子窗口对象。
【文档编号】G06F11/36GK104484176SQ201410784202
【公开日】2015年4月1日 申请日期:2014年12月16日 优先权日:2014年12月16日
【发明者】张辉 申请人:北京奇虎科技有限公司, 奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1