Android Monkeyテストシールド特殊ボタン
3962 ワード
Monkeyスクリプトのボタンの一部を遮断する必要がある場合があります.まず、Monkeyのkeyイベント生成コードを見てみましょう.
外部取得MonkeyEventはdevelopment/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java
のgetNextEvent()を取得します.
ここではまずキューMQが空であるか否かを判断し,空であればイベントを生成する.キューヘッダのイベントを取得し、戻ります.
このgenerateEvents()はランダムイベントを生成するために用いられ,floatタイプの乱数clsにより,区間に応じてタッチ/ドラッグ/スケールなどの動作イベントを生成する.cls>=mFactors[FACTOR_PERMISSION])の場合、keyイベントが生成されます.keyイベントもいくつかの種類に分けられ、生成されたlastKeyが次の条件を満たすか、clsがreturn可能ないくつかのブランチを満たすと中止され、そうでなければ適切なkeyイベントが生成されるまでループが継続される.
特殊なキーをブロックする場合は、上のif()条件にlastKeyを直接追加します!=xxxは遮断したいボタンを遮断することができます.
外部取得MonkeyEventはdevelopment/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java
のgetNextEvent()を取得します.
/**
* if the queue is empty, we generate events first
* @return the first event in the queue
*/
public MonkeyEvent getNextEvent() {
if (mQ.isEmpty()) {
generateEvents();
}
mEventCount++;
MonkeyEvent e = mQ.getFirst();
mQ.removeFirst();
return e;
}
ここではまずキューMQが空であるか否かを判断し,空であればイベントを生成する.キューヘッダのイベントを取得し、戻ります.
* generate a random event based on mFactor
*/
private void generateEvents() {
float cls = mRandom.nextFloat();
int lastKey = 0;
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 {
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;
}
}
MonkeyKeyEvent e = new MonkeyKeyEvent(KeyEvent.ACTION_DOWN, lastKey);
mQ.addLast(e);
e = new MonkeyKeyEvent(KeyEvent.ACTION_UP, lastKey);
mQ.addLast(e);
}
このgenerateEvents()はランダムイベントを生成するために用いられ,floatタイプの乱数clsにより,区間に応じてタッチ/ドラッグ/スケールなどの動作イベントを生成する.cls>=mFactors[FACTOR_PERMISSION])の場合、keyイベントが生成されます.keyイベントもいくつかの種類に分けられ、生成されたlastKeyが次の条件を満たすか、clsがreturn可能ないくつかのブランチを満たすと中止され、そうでなければ適切なkeyイベントが生成されるまでループが継続される.
if (lastKey != KeyEvent.KEYCODE_POWER
&& lastKey != KeyEvent.KEYCODE_ENDCALL
&& lastKey != KeyEvent.KEYCODE_SLEEP
&& lastKey != KeyEvent.KEYCODE_SOFT_SLEEP
&& PHYSICAL_KEY_EXISTS[lastKey]) {
break;
}
特殊なキーをブロックする場合は、上のif()条件にlastKeyを直接追加します!=xxxは遮断したいボタンを遮断することができます.