遍历窗口对象的方法及装置的制造方法

文档序号:8223354阅读:352来源:国知局
遍历窗口对象的方法及装置的制造方法
【技术领域】
[0001]本发明涉及应用测试领域,尤其涉及一种遍历窗口对象的方法及装置。
【背景技术】
[0002]随着Android系统市场占有率的增加,越来越多的开发者基于Android系统开发app (applicat1n,应用)。每款app在开发完毕后,并不能马上上线,因为该app在实际系统上使用时,可能会出现一些bug,比如在app的各个UI界面(窗口对象)在用户点击时无法响应,UI跳转时跳转失败或者逻辑错误等。因此对于APP —般在开发完成后,需要先进行UI测试,当所有APP在Android系统中的UI界面运行正常后才会正式发布。而在UI测试过程中,则采用某些工具遍历APP的窗口对象并进行测试。
[0003]传统的遍历窗口对象的方式包括:1、通过viewserver (窗口服务)遍历窗口对象,该种方案适合所有的Android版本,但是速度慢;2、通过Accessibility Service (辅助功能服务)遍历窗口对象,虽然该种方式遍历窗口对象的速度快,但是只适用于Android4.2版本之上,并且其遍历的窗口对象并不全面,对于子窗口对象可能会遗失;3、通过UIAutomator (UI自动化测试工具)遍历窗口对象,但是该测试工具也只适合Android4.2版本之上。因此,目前尚未存在一种既可以兼容各种Android操作系统版本又能够快速遍历窗口对象的实现方式。

【发明内容】

[0004]鉴于上述问题,本发明提供了一种遍历窗口对象的方法及装置,能够针对所有Android操作系统版本快速进行窗口对象的遍历。
[0005]一方面,本发明提供了一种遍历窗口对象的方法,包括:
[0006]将Hook模块中的第一 Hook函数注入到System_server系统进程中;
[0007]通过第一 Hook函数截获系统进程,并在系统底层中通过方法调用获取当前窗口的进程;
[0008]将Hook模块中的第二 Hook函数注入到当前窗口的进程中,以便截获当前窗口的进程,并执行第二 Hook函数遍历当前窗口中的窗口对象。
[0009]进一步的,通过第一 Hook函数截获系统进程,并在系统底层中通过方法调用获取当前窗口的进程,包括:
[0010]在系统底层中调用ActivityManagerService活动管理服务对象;
[0011]在ActivityManagerService 中调用成员 WindowsManagerService 窗口管理服务对象,获得当前窗口的进程。
[0012]进一步的,在ActivityManagerService中调用成员 WindowsManagerService 窗口管理服务对象,获得当前窗口的进程,包括:
[0013]调用WindowsManagerService 中的 GetFocusWindow 函数获得当前窗口的进程。
[0014]进一步的,在将Hook模块中的第二 Hook函数注入到当前窗口的进程中之前,方法进一步包括:
[0015]由mclient代理端通过ibinder通信机制调用服务端Hook模块中的第二 Hook函数。
[0016]进一步的,在将Hook模块中的第二 Hook函数注入到当前窗口的进程中之后,方法进一步包括:
[0017]通过ibinder通信机制在当前窗口的进程与系统进程之间进行通信。
[0018]第二方面,本发明还提供了一种遍历窗口对象的装置,包括:
[0019]第一注入单元,用于将Hook模块中的第一 Hook函数注入到System_server系统进程中;
[0020]获取单元,用于在第一注入单元注入第一 Hook函数后,通过第一 Hook函数截获系统进程,并在系统底层中通过方法调用获取当前窗口的进程;
[0021]第二注入单元,用于将Hook模块中的第二 Hook函数注入到获取单元获取的当前窗口的进程中,以便截获当前窗口的进程;
[0022]执行单元,用于执行第二注入单元注入的第二 Hook函数遍历当前窗口中的窗口对象。
[0023]进一步的,获取单元,包括:
[0024]第一调用模块,用于在系统底层中调用ActivityManagerService活动管理服务对象;
[0025]第二调用模块,用于在第一调用模块调用的ActivityManagerService中调用成员WindowsManagerService窗口管理服务对象,获得当前窗口的进程。
[0026]进一步的,第二调用模块用于调用WindowsManagerService 中的 GetFocusWindow函数获得当前窗口的进程。
[0027]进一步的,该装置进一步包括代理单元,用于在第二注入单元将Hook模块中的第二 Hook函数注入到当前窗口的进程中之前,基于mclient代理端通过ibinder通信机制调用服务端Hook模块中的第二 Hook函数。
[0028]进一步的,该装置进一步包括通信单元,用于在第二注入单元将Hook模块中的第二 Hook函数注入到当前窗口的进程中之后,通过ibinder通信机制在当前窗口的进程与系统进程之间进行通信。
[0029]借由上述技术方案,本发明提供的遍历窗口对象的方法及装置,能够通过第一次Hook 函数注入 System_server,通过 WindowsManagerService 中的 GetFocusWindow 获取当前窗口 ;通过第二次Hook函数注入实现对该当前窗口下窗口对象的遍历。与现有技术相比,本发明能够通过两次函数注入,直接在系统进程中定位当前窗口的进程,并从该当前窗口起始逐级遍历各级窗口中的对象以及各级窗口对象的父子关系。本发明能够在不受Android操作系统版本限制的情况下,实现UI对象的快速遍历。
[0030]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。
【附图说明】
[0031]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0032]图1示出了本发明提供的一种遍历窗口对象的方法流程图;
[0033]图2示出了本发明提供的另一种遍历窗口对象的方法流程图;
[0034]图3示出了本发明提供的一种遍历窗口对象的装置结构示意图;
[0035]图4示出了本发明提供的另一种遍历窗口对象的装置结构示意图。
【具体实施方式】
[0036]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0037]本发明实施例提供了一种遍历窗口对象的方法,该方法能够在系统底层通过Hook机制对窗口对象进行获取和遍历。如图1所示,该方法包括:
[0038]101、将Hook模块中的第一 Hook函数注入到System_server系统进程中。
[0039]在对APK进行UI测试时,首先要对UI中的控件、view等窗口对象进行遍历。而在遍历窗口对象之前,首先要获得APK的首界面(起始遍历的窗口),该第一 Hook函数的功能即在于获取起始遍历的当前窗口。本实施例中,将第一 Hook函数注入到系统进程中并进行执行,即可以通过方法调用的方式获取起始遍历的窗口(的进程)。
[0040]在本实施例的一种实现方式中,Hook模块的名称可以形如IibxHook.so。将IibxHook.so中用于截获系统进程的第一 Hook函数注入到系统进程中,将系统进程挂起。待Hook函数执行完毕后,继续执行系统进程。
[0041]102、通过第一 Hook函数截获系统进程,并在系统底层中通过方法调用获取当前窗口的进程。
[0042]在注入第一 Hook函数后就进入到了系统底层,在系统底层中,第一 Hook函数执行的上下文(Context)环境就是系统进程的上下文环境,亦可以认为在注入第一 Hook函数后,Hook函数就与系统处于统一进程中。
[0043]通常,被测APK所涉及的界面(窗口 )不止一个,本步骤中获得的当前窗口通常是指测试用例规定的测试起始界面(当然,多数情况下测试起始界面就是APK的首界面)。在执行第一 Hook函数获取当前窗口的进程时,可以通过进程标识(名称、ID、句柄标识、文件路径等)对当前窗口的进程识别。
[0044]103、将Hook模块中的第二 Hook函数注入到当前窗口的进程中,以便截获当前窗口的进程。
[0045]在获得当前窗口的进程后,就相
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1