Monkey 事件簡介
Monkey 通過注入事件來對手機或者模擬器進行操作柏肪,根據Monkey源碼.
Monkey的事件來源有三種
- MonkeySourceScript
Monkey 腳本文件草戈,通過參數 -f 添加 - MonkeySourceNetwork 统捶, 通過參數--port控制
服務器控制的monkey文件 - MonkeySourceRandom
隨機生成的Monkey 事件哆窿,大多數人常用的那種
Monkey Script腳本
通過參數 -f 配置 Script ,可以配置多個腳本,如果沒有配置--randomize-script 參數,則按照順序執(zhí)行康谆,否則,隨機執(zhí)行腳本嫉到。
如果配置了多個(>1)腳本,那么可以配置--setup 參數月洛,后面緊跟一個腳本何恶。 這個腳本保證是第一個運行的。
Monkey 服務器控制
Monkey 隨機事件
Monkey 隨機事件類型有12種嚼黔。分別為
public static final int FACTOR_TOUCH = 0;
public static final int FACTOR_MOTION = 1;
public static final int FACTOR_PINCHZOOM = 2;
public static final int FACTOR_TRACKBALL = 3;
public static final int FACTOR_ROTATION = 4;
public static final int FACTOR_PERMISSION = 5;
public static final int FACTOR_NAV = 6;
public static final int FACTOR_MAJORNAV = 7;
public static final int FACTOR_SYSOPS = 8;
public static final int FACTOR_APPSWITCH = 9;
public static final int FACTOR_FLIP = 10;
public static final int FACTOR_ANYTHING = 11;
按照種子數生成的Random,生成[0,1]之間的隨機數细层。按照隨機數的大小和各個類型占用的比例進行比較惜辑,生成事件。
if (cls < mFactors[FACTOR_TOUCH]) {
generatePointerEvent(mRandom, GESTURE_TAP);
return;
} else if (cls < mFactors[FACTOR_MOTION]) {
generatePointerEvent(mRandom, GESTURE_DRAG);
return;
} else if (cls < mFactors[FACTOR_PINCHZOOM]) {
generatePointerEvent(mRandom, GESTURE_PINCH_OR_ZOOM);
return;
} else if (cls < mFactors[FACTOR_TRACKBALL]) {
generateTrackballEvent(mRandom);
return;
} else if (cls < mFactors[FACTOR_ROTATION]) {
generateRotationEvent(mRandom);
return;
} else if (cls < mFactors[FACTOR_PERMISSION]) {
mQ.add(mPermissionUtil.generateRandomPermissionEvent(mRandom));
return;
}
// The remaining event categories are injected as key events
for (;;) {
if (cls < mFactors[FACTOR_NAV]) {
lastKey = NAV_KEYS[mRandom.nextInt(NAV_KEYS.length)];
} else if (cls < mFactors[FACTOR_MAJORNAV]) {
lastKey = MAJOR_NAV_KEYS[mRandom.nextInt(MAJOR_NAV_KEYS.length)];
} else if (cls < mFactors[FACTOR_SYSOPS]) {
lastKey = SYS_KEYS[mRandom.nextInt(SYS_KEYS.length)];
} else if (cls < mFactors[FACTOR_APPSWITCH]) {
MonkeyActivityEvent e = new MonkeyActivityEvent(mMainApps.get(
mRandom.nextInt(mMainApps.size())));
mQ.addLast(e);
return;
} else if (cls < mFactors[FACTOR_FLIP]) {
MonkeyFlipEvent e = new MonkeyFlipEvent(mKeyboardOpen);
mKeyboardOpen = !mKeyboardOpen;
mQ.addLast(e);
return;
} else { //FACTOR_ANYTHING
lastKey = 1 + mRandom.nextInt(KeyEvent.getMaxKeyCode() - 1);
}
if (lastKey != KeyEvent.KEYCODE_POWER
&& lastKey != KeyEvent.KEYCODE_ENDCALL
&& lastKey != KeyEvent.KEYCODE_SLEEP
&& lastKey != KeyEvent.KEYCODE_SOFT_SLEEP
&& PHYSICAL_KEY_EXISTS[lastKey]) {
break;
}
}
怎么生成事件
generationPointerEvent(Random random, int gesture)
隨機生成一個點p1疫赎,然后生成一個x,y在[-25,25]范圍類的點盛撑,monkey 隊列中先加入p1 的按下事件。
如果手勢是GESTURE_DRAG(拉動)捧搞,那么會生成[0,10)個數的MotionEvent.ACTION_MOVE事件抵卫。然后生成MotionEvent.ACTION_UP事件。
如果手勢是GESTURE_PINCH_OR_ZOOM(放大或縮小)胎撇, 那么先會生成MotionEvent.ACTION_POINTER_DOWN事件介粘,表示第二根手指按下。然后生成[0,10)個數的MotionEvent.ACTION_MOVE事件晚树,然后再生成MotionEvent.ACTION_POINTER_UP事件姻采,表示第二根手指抬起。最后再生成MotionEvent.ACTION_UP事件爵憎。
如果手勢不屬于以上兩種慨亲,則直接生成MotionEvent.ACTION_UP事件。-
generateTrackballEvent(Random random)
首先宝鼓,什么是TrackBallEvent刑棵,在第一代Android 手機如HTC Dream手機上有一個移動球(如下圖中menu下面的圓球),像ThinkPad 鍵盤上面那個紅色按鈕那樣席函,可以用來移動☆硗現在的手機上已經看不到了這個按鈕了。
generateRotationEvent(Random random)
生成旋轉事件generateRandomPermissionEvent(mRandom)
首先先判斷app需要哪些權限(Android 6.0以后)茂附,然后生成隨機的PermissionEvent, 來取消(revoke)或者授予(grant)app權限正蛙。-
NAV_KEYS
包括KeyEvent.KEYCODE_DPAD_UP, KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_RIGHT,代表鍵盤上的上下左右鍵营曼。
-
MAJOR_NAV_KEYS
包括兩個鍵 KeyEvent.KEYCODE_MENU和KeyEvent.KEYCODE_DPAD_CENTER鍵乒验。KeyEvent.KEYCODE_MENU是指菜單鍵,KeyEvent.KEYCODE_DPAD_CENTER 是指鍵盤上的中鍵蒂阱。 下圖所示锻全,即為中鍵。
-
SYS_KEY
其中包括KeyEvent.KEYCODE_HOME, KeyEvent.KEYCODE_BACK,KeyEvent.KEYCODE_CALL, KeyEvent.KEYCODE_ENDCALL,KeyEvent.KEYCODE_VOLUME_UP,KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_MUTE,KeyEvent.KEYCODE_MUTE录煤。 Monkey會判斷測試機是否有這些KeyEvent. 如果沒有鳄厌,則會再隨機取一個,直到取到了有的鍵值妈踊。- KeyEvent.KEYCODE_HOME 了嚎, HOME鍵
- KeyEvent.KEYCODE_BACK , BACK鍵
- KeyEvent.KEYCODE_CALL , 撥打電話鍵
- KeyEvent.KEYCODE_ENDCALL歪泳, 結束通話
- KeyEvent.KEYCODE_VOLUME_UP 萝勤,增加音量
- KeyEvent.KEYCODE_VOLUME_DOWN, 減少音量
- KeyEvent.KEYCODE_VOLUME_MUTE呐伞, 揚聲器靜音鍵
- KeyEvent.KEYCODE_MUTE敌卓, 話筒靜音鍵
MonkeyActivityEvent
根據輸入參數的選出適合測試的app,輸入的參數中 -p 指定測試的包名。--pkg-whitelist-file指定白名單文件伶氢,--pkg-blacklist-file制定黑名單文件趟径,然后-c 增加category。
獲取Android系統(tǒng)的PackageManger 通過mPm.queryIntentActivities 來判斷是否有APP能夠響應的該intent. 把這些app存成一個list,隨機在其中取鞍历。通過startactivity來生成MonkeyActivityEvent舵抹。
- MonkeyFlipEvent
生成滑動事件。