遍歷窗口對象的方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及應(yīng)用測試領(lǐng)域,尤其涉及一種遍歷窗口對象的方法及裝置。
【背景技術(shù)】
[0002]隨著Android系統(tǒng)市場占有率的增加,越來越多的開發(fā)者基于Android系統(tǒng)開發(fā)app (applicat1n,應(yīng)用)。每款app在開發(fā)完畢后,并不能馬上上線,因?yàn)樵揳pp在實(shí)際系統(tǒng)上使用時(shí),可能會(huì)出現(xiàn)一些bug,比如在app的各個(gè)UI界面(窗口對象)在用戶點(diǎn)擊時(shí)無法響應(yīng),UI跳轉(zhuǎn)時(shí)跳轉(zhuǎn)失敗或者邏輯錯(cuò)誤等。因此對于APP —般在開發(fā)完成后,需要先進(jìn)行UI測試,當(dāng)所有APP在Android系統(tǒng)中的UI界面運(yùn)行正常后才會(huì)正式發(fā)布。而在UI測試過程中,則采用某些工具遍歷APP的窗口對象并進(jìn)行測試。
[0003]傳統(tǒng)的遍歷窗口對象的方式包括:1、通過viewserver (窗口服務(wù))遍歷窗口對象,該種方案適合所有的Android版本,但是速度慢;2、通過Accessibility Service (輔助功能服務(wù))遍歷窗口對象,雖然該種方式遍歷窗口對象的速度快,但是只適用于Android4.2版本之上,并且其遍歷的窗口對象并不全面,對于子窗口對象可能會(huì)遺失;3、通過UIAutomator (UI自動(dòng)化測試工具)遍歷窗口對象,但是該測試工具也只適合Android4.2版本之上。因此,目前尚未存在一種既可以兼容各種Android操作系統(tǒng)版本又能夠快速遍歷窗口對象的實(shí)現(xiàn)方式。
【發(fā)明內(nèi)容】
[0004]鑒于上述問題,本發(fā)明提供了一種遍歷窗口對象的方法及裝置,能夠針對所有Android操作系統(tǒng)版本快速進(jìn)行窗口對象的遍歷。
[0005]一方面,本發(fā)明提供了一種遍歷窗口對象的方法,包括:
[0006]將Hook模塊中的第一 Hook函數(shù)注入到System_server系統(tǒng)進(jìn)程中;
[0007]通過第一 Hook函數(shù)截獲系統(tǒng)進(jìn)程,并在系統(tǒng)底層中通過方法調(diào)用獲取當(dāng)前窗口的進(jìn)程;
[0008]將Hook模塊中的第二 Hook函數(shù)注入到當(dāng)前窗口的進(jìn)程中,以便截獲當(dāng)前窗口的進(jìn)程,并執(zhí)行第二 Hook函數(shù)遍歷當(dāng)前窗口中的窗口對象。
[0009]進(jìn)一步的,通過第一 Hook函數(shù)截獲系統(tǒng)進(jìn)程,并在系統(tǒng)底層中通過方法調(diào)用獲取當(dāng)前窗口的進(jìn)程,包括:
[0010]在系統(tǒng)底層中調(diào)用ActivityManagerService活動(dòng)管理服務(wù)對象;
[0011]在ActivityManagerService 中調(diào)用成員 WindowsManagerService 窗口管理服務(wù)對象,獲得當(dāng)前窗口的進(jìn)程。
[0012]進(jìn)一步的,在ActivityManagerService中調(diào)用成員 WindowsManagerService 窗口管理服務(wù)對象,獲得當(dāng)前窗口的進(jìn)程,包括:
[0013]調(diào)用WindowsManagerService 中的 GetFocusWindow 函數(shù)獲得當(dāng)前窗口的進(jìn)程。
[0014]進(jìn)一步的,在將Hook模塊中的第二 Hook函數(shù)注入到當(dāng)前窗口的進(jìn)程中之前,方法進(jìn)一步包括:
[0015]由mclient代理端通過ibinder通信機(jī)制調(diào)用服務(wù)端Hook模塊中的第二 Hook函數(shù)。
[0016]進(jìn)一步的,在將Hook模塊中的第二 Hook函數(shù)注入到當(dāng)前窗口的進(jìn)程中之后,方法進(jìn)一步包括:
[0017]通過ibinder通信機(jī)制在當(dāng)前窗口的進(jìn)程與系統(tǒng)進(jìn)程之間進(jìn)行通信。
[0018]第二方面,本發(fā)明還提供了一種遍歷窗口對象的裝置,包括:
[0019]第一注入單元,用于將Hook模塊中的第一 Hook函數(shù)注入到System_server系統(tǒng)進(jìn)程中;
[0020]獲取單元,用于在第一注入單元注入第一 Hook函數(shù)后,通過第一 Hook函數(shù)截獲系統(tǒng)進(jìn)程,并在系統(tǒng)底層中通過方法調(diào)用獲取當(dāng)前窗口的進(jìn)程;
[0021]第二注入單元,用于將Hook模塊中的第二 Hook函數(shù)注入到獲取單元獲取的當(dāng)前窗口的進(jìn)程中,以便截獲當(dāng)前窗口的進(jìn)程;
[0022]執(zhí)行單元,用于執(zhí)行第二注入單元注入的第二 Hook函數(shù)遍歷當(dāng)前窗口中的窗口對象。
[0023]進(jìn)一步的,獲取單元,包括:
[0024]第一調(diào)用模塊,用于在系統(tǒng)底層中調(diào)用ActivityManagerService活動(dòng)管理服務(wù)對象;
[0025]第二調(diào)用模塊,用于在第一調(diào)用模塊調(diào)用的ActivityManagerService中調(diào)用成員WindowsManagerService窗口管理服務(wù)對象,獲得當(dāng)前窗口的進(jìn)程。
[0026]進(jìn)一步的,第二調(diào)用模塊用于調(diào)用WindowsManagerService 中的 GetFocusWindow函數(shù)獲得當(dāng)前窗口的進(jìn)程。
[0027]進(jìn)一步的,該裝置進(jìn)一步包括代理單元,用于在第二注入單元將Hook模塊中的第二 Hook函數(shù)注入到當(dāng)前窗口的進(jìn)程中之前,基于mclient代理端通過ibinder通信機(jī)制調(diào)用服務(wù)端Hook模塊中的第二 Hook函數(shù)。
[0028]進(jìn)一步的,該裝置進(jìn)一步包括通信單元,用于在第二注入單元將Hook模塊中的第二 Hook函數(shù)注入到當(dāng)前窗口的進(jìn)程中之后,通過ibinder通信機(jī)制在當(dāng)前窗口的進(jìn)程與系統(tǒng)進(jìn)程之間進(jìn)行通信。
[0029]借由上述技術(shù)方案,本發(fā)明提供的遍歷窗口對象的方法及裝置,能夠通過第一次Hook 函數(shù)注入 System_server,通過 WindowsManagerService 中的 GetFocusWindow 獲取當(dāng)前窗口 ;通過第二次Hook函數(shù)注入實(shí)現(xiàn)對該當(dāng)前窗口下窗口對象的遍歷。與現(xiàn)有技術(shù)相比,本發(fā)明能夠通過兩次函數(shù)注入,直接在系統(tǒng)進(jìn)程中定位當(dāng)前窗口的進(jìn)程,并從該當(dāng)前窗口起始逐級遍歷各級窗口中的對象以及各級窗口對象的父子關(guān)系。本發(fā)明能夠在不受Android操作系統(tǒng)版本限制的情況下,實(shí)現(xiàn)UI對象的快速遍歷。
[0030]上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的【具體實(shí)施方式】。
【附圖說明】
[0031]通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號表示相同的部件。在附圖中:
[0032]圖1示出了本發(fā)明提供的一種遍歷窗口對象的方法流程圖;
[0033]圖2示出了本發(fā)明提供的另一種遍歷窗口對象的方法流程圖;
[0034]圖3示出了本發(fā)明提供的一種遍歷窗口對象的裝置結(jié)構(gòu)示意圖;
[0035]圖4示出了本發(fā)明提供的另一種遍歷窗口對象的裝置結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0036]下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
[0037]本發(fā)明實(shí)施例提供了一種遍歷窗口對象的方法,該方法能夠在系統(tǒng)底層通過Hook機(jī)制對窗口對象進(jìn)行獲取和遍歷。如圖1所示,該方法包括:
[0038]101、將Hook模塊中的第一 Hook函數(shù)注入到System_server系統(tǒng)進(jìn)程中。
[0039]在對APK進(jìn)行UI測試時(shí),首先要對UI中的控件、view等窗口對象進(jìn)行遍歷。而在遍歷窗口對象之前,首先要獲得APK的首界面(起始遍歷的窗口),該第一 Hook函數(shù)的功能即在于獲取起始遍歷的當(dāng)前窗口。本實(shí)施例中,將第一 Hook函數(shù)注入到系統(tǒng)進(jìn)程中并進(jìn)行執(zhí)行,即可以通過方法調(diào)用的方式獲取起始遍歷的窗口(的進(jìn)程)。
[0040]在本實(shí)施例的一種實(shí)現(xiàn)方式中,Hook模塊的名稱可以形如IibxHook.so。將IibxHook.so中用于截獲系統(tǒng)進(jìn)程的第一 Hook函數(shù)注入到系統(tǒng)進(jìn)程中,將系統(tǒng)進(jìn)程掛起。待Hook函數(shù)執(zhí)行完畢后,繼續(xù)執(zhí)行系統(tǒng)進(jìn)程。
[0041]102、通過第一 Hook函數(shù)截獲系統(tǒng)進(jìn)程,并在系統(tǒng)底層中通過方法調(diào)用獲取當(dāng)前窗口的進(jìn)程。
[0042]在注入第一 Hook函數(shù)后就進(jìn)入到了系統(tǒng)底層,在系統(tǒng)底層中,第一 Hook函數(shù)執(zhí)行的上下文(Context)環(huán)境就是系統(tǒng)進(jìn)程的上下文環(huán)境,亦可以認(rèn)為在注入第一 Hook函數(shù)后,Hook函數(shù)就與系統(tǒng)處于統(tǒng)一進(jìn)程中。
[0043]通常,被測APK所涉及的界面(窗口 )不止一個(gè),本步驟中獲得的當(dāng)前窗口通常是指測試用例規(guī)定的測試起始界面(當(dāng)然,多數(shù)情況下測試起始界面就是APK的首界面)。在執(zhí)行第一 Hook函數(shù)獲取當(dāng)前窗口的進(jìn)程時(shí),可以通過進(jìn)程標(biāo)識(名稱、ID、句柄標(biāo)識、文件路徑等)對當(dāng)前窗口的進(jìn)程識別。
[0044]103、將Hook模塊中的第二 Hook函數(shù)注入到當(dāng)前窗口的進(jìn)程中,以便截獲當(dāng)前窗口的進(jìn)程。
[0045]在獲得當(dāng)前窗口的進(jìn)程后,就相