天天看點

Android Monkey原理探讨

monkey的主要作用是,發送一些随機互動事件模拟人的随機操作。它是如何觸發各種事件的呢?

觸摸事件包括螢幕以及實體鍵的觸摸,滑動,點選事件。我們可以通過發送一些adb指令模拟這些事件。不過monkey實作時,直接調用hiden api實作。

構造需要的事件,然後調用該接口就能觸發了。

activity事件是指我們調用android系統元件的事件。一般測試中,我們也是通過adb shell am指令來實作的。monkey在實作是,是直接通過iactivitymanager執行個體:

window事件是指操作window的事件,例如轉屏。這裡直接用iwindowmanager實作。

此外還會調用其他的一些hiden api擷取崩潰資訊,anr資訊等等。這些直接從底層hiden接口拿,比我們上層擷取更加友善,準确。

上一節分析到monkey的功能主要分成兩塊:

産生事件;

觸發事件。

是以它的架構設計非常簡潔,核心類是monkey.java, monkeyeventsource.java, monkeyevent.java。

核心類

說明

monkey

程式的入口,同時也是排程中心,根據參數選擇合适的monkeyeventsource,并适時觸發monkeyevent。

monkeyeventsource

monkeyevent的工廠,是一個接口。它有各種實作,例如随機生成monkeyevent,根據配置檔案生成monkeyevent,根據網絡資料生成monkeyevent等等。

monkeyevent

各種事件的具體實作,是一個抽象類,不同僚件有不同實作。在monkey中各種活動都是事件,除了基本的觸摸事件,activity事件外,事件之間的停頓也是通過一個monkeythrottleevent來實作。這樣概念的擴充,将各種活動一視同仁的對待,使設計變得簡單。

Android Monkey原理探讨
Android Monkey原理探讨

如果我們需要擴充monkey的功能,隻需要增加自己實作的monkeyeventsource和monkeyevent即可。

我們在terminal中執行adb shell monkey,實際上是執行手機中/system/bin/monkey這個腳本(在源碼中也能看到),該腳本具體内容是

是以他是通過/system/bin/app_process運作/system/framework/monkey.jar。

這裡需要注意,jvm中的jar檔案是一對class檔案的zip包。而在android中,可執行檔案是dex,是以android裡面的jar本質上裡面也是dex,直接把eclipse導出的jar包放進去是無法執行的。

這裡也有一個小例子(可以在附件中下載下傳完整代碼):

我可以看到它成功運作了:

Android Monkey原理探讨

進一步分析該程序,通過ps指令,我們看到該程序是屬于shell使用者組的,是以它沒有root,system那樣高的權限,但是比一般的使用者程序權限也要高很多,可以多做很多事情,例如靜默地安裝,解除安裝。

Android Monkey原理探讨
Android Monkey原理探讨

上述monkey的分析同樣适用于uiautomator等android内部的測試工具,更重要的是,我們可以基于這些原理實作我們自己的功能強大,且穩定可靠的測試工具。

<a href="http://blog.csdn.net/edsam49/article/details/11486943">解析android framework下利用app_process來調用java寫的指令及示例</a>

<a href="http://blog.csdn.net/luoshengyang/article/details/6768304">android系統程序zygote啟動過程的源代碼分析</a>

<a href="http://www.cnblogs.com/ruskee/p/5293290.html">有關monkey指令的兩個隐藏選項</a>

繼續閱讀