Monkey Runner

Android Monkey tool Monkey — narzędzie android-a do generowania zdarzeń na urządzeniu przez co może symulować operacje użytkownika na urządzeniu:

  • W najprostszej wersji wywołania służy do generowania losowych zdarzeń (naciśnięcie klawiszy telefonu, wywołanie powiadomienia o niskim stanie baterii itd.)
  • Może jednak przyjmować jako argument napisany przez nas skrypt ze zdarzeniami.

Uruchomienie monkey:
Monkey jest aplikacją zainstalowaną domyślnie na platformie android:

adb shell monkey

Wyświetli krótką instrukcję użytkowania monkey
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] …] [-c MAIN_CATEGORY [-c MAIN_CATEGORY] …] [ — ignore-crashes] [ — ignore-timeouts] [ — ignore-security-exceptions] [ — monitor-native-crashes] [ — kill-process-after-error] [ — hprof] [ — pct-touch PERCENT] [ — pct-motion PERCENT] [ — pct-trackball PERCENT] [ — pct-syskeys PERCENT] [ — pct-nav PERCENT] [ — pct-majornav PERCENT] [ — pct-appswitch PERCENT] [ — pct-flip PERCENT] [ — pct-anyevent PERCENT] [ — wait-dbg] [ — dbg-no-events] [-f scriptfile] [ — port port] [-s SEED] [-v [-v] …] [ — throttle MILLISEC] COUNT

Przykład uruchomienia
wykonaj 100 zdarzeń losowych na aplikacji (wcześniej uruchom aplikacje)

adb shell monkey -p eu.saramak.contactManager.android2 -v 100

Monkey może również przyjmować skrypt napisany przez nas. Skrypt może być przyjęty na 2 sposoby:

  1. Przez telnet (przez sieć) [zalecany — ostatnia wersja androida]
  2. Przez plik tekstowy (dwa trypy pliku) [większa kontrola nad zdarzeniami]
  3. trype= user
  4. trype= raw events

Ostatecznie wszystkie skrypty możemy zapisać do plików i uruchamiać je z plików — więc czym różnić się będą te 3 skrypty: odpowiedź brzmi: prawie wszystkim:
Np: naciśnięcie klawisza ‘a’ w sposobie 1 to:
key down KEYCODE_A
naciśnięcie klawisza ‘a’ w sposobie 2a to:
userDispatchPress(KEYCODE_A)
naciśnięcie klawisza ‘a’ w sposobie 2b to:
runDispatchKey(5113146,5113146,0,29,2,0,0,0) //A down
runDispatchKey(5113147,5113147,1,29,2,0,0,0) //A up

1. Przez sieć, telnet.

Aby uruchomić Monkey i przekazać mu skrypt przez telnet-a musimy w serwerze debagowania adb przekierować port tcp androida, na tcp nasz lokalny. Wywołujemy polecenie:

adb forward tcp:1080 tcp:1080

Następnie uruchamiamy na emulatorze monkey:
adb shell monkey -v -v -p eu.saramak.contactManager.android2 — port 1080
Dwa -v to nie pomyła — uruchamia to dokładniejszy tryb logowania — port na którym porcie będziemy mogli się połączyć do monkey / na którym porcie monkey będzie nasłuchiwał poleceń.
Ważne: jeśli podajemy — port to nie podawajmy -f [plik_skryptu] ponieważ, ważniejszy dla niego będzie parametr -f i będzie się spodziewał poleceń z pliku skryptu.

Dzięki forwardowaniu portów możemy wywołać na naszym lokalnym komputerze:
telnet localhost 1080
I wprowadzać z konsoli polecenia np:
key down KEYCODE_1

lub podać cały plik skryptu:
(sleep 5; cat example_script.txt) | telnett localhost 1080

Przykładowy plik skryptu:

# Touch the android
touch down 160 200
touch up 160 200
sleep 1000
# Hit Next
touch down 300 450
touch up 300 450
sleep 1000

# Hit Next
touch down 300 450
touch up 300 450
sleep 1000

# Hit Next
touch down 300 450
touch up 300 450
sleep 1000

# Go down and select the account username
key down dpad_down
key up dpad_down
key down dpad_down
key up dpad_down
key down dpad_center
key up dpad_center
# account name: bill
key down b
key up b
key down i
key up i
key down l
key up l
key down l
key up l

# Go down to the password field
key down dpad_down
key up dpad_down

# password: bill
key down b
key up b
key down i
key up i
key down l
key up l
key down l
key up l

# Select next
touch down 300 450
touch up 300 450

# quit
quit

Opis wszystkich poleceń

Polecenie

Opis

Przykład

key [down|up] keycode

Naciśnięcie/zwolnienie klawisza o podanym kodzie np: KEYCODE_MENU, KEYCODE_1 lub jako wartość integer: 29 = a 30 = b itd. Kody klawiszy od 0: “KEYCODE_UNKNOWN”, //0
“KEYCODE_SOFT_LEFT”, //1 “KEYCODE_SOFT_RIGHT”, //2 “KEYCODE_HOME”, //3 “KEYCODE_BACK”, //4 “KEYCODE_CALL”, //5 “KEYCODE_ENDCALL”, //6 … itd “KEYCODE_0”, “KEYCODE_1”, “KEYCODE_2”, “KEYCODE_3”, “KEYCODE_4”, “KEYCODE_5”, “KEYCODE_6”, “KEYCODE_7”, “KEYCODE_8”, “KEYCODE_9”, “KEYCODE_STAR”, “KEYCODE_POUND”, “KEYCODE_DPAD_UP”, “KEYCODE_DPAD_DOWN”, “KEYCODE_DPAD_LEFT”, “KEYCODE_DPAD_RIGHT”, “KEYCODE_DPAD_CENTER”, “KEYCODE_VOLUME_UP”, “KEYCODE_VOLUME_DOWN”, “KEYCODE_POWER”, “KEYCODE_CAMERA”, “KEYCODE_CLEAR”, “KEYCODE_A”, //29 “KEYCODE_B”, “KEYCODE_C”, “KEYCODE_D”, “KEYCODE_E”, “KEYCODE_F”, “KEYCODE_G”, “KEYCODE_H”, “KEYCODE_I”, “KEYCODE_J”, “KEYCODE_K”, “KEYCODE_L”, “KEYCODE_M”, “KEYCODE_N”, “KEYCODE_O”, “KEYCODE_P”, “KEYCODE_Q”, “KEYCODE_R”, “KEYCODE_S”, “KEYCODE_T”, “KEYCODE_U”, “KEYCODE_V”, “KEYCODE_W”, “KEYCODE_X”, “KEYCODE_Y”, “KEYCODE_Z”, “KEYCODE_COMMA”, “KEYCODE_PERIOD”, “KEYCODE_ALT_LEFT”, “KEYCODE_ALT_RIGHT”, “KEYCODE_SHIFT_LEFT”, “KEYCODE_SHIFT_RIGHT”, “KEYCODE_TAB”, “KEYCODE_SPACE”, “KEYCODE_SYM”, “KEYCODE_EXPLORER”, “KEYCODE_ENVELOPE”, “KEYCODE_ENTER”, “KEYCODE_DEL”, “KEYCODE_GRAVE”, “KEYCODE_MINUS”, “KEYCODE_EQUALS”, “KEYCODE_LEFT_BRACKET”, “KEYCODE_RIGHT_BRACKET”, “KEYCODE_BACKSLASH”, “KEYCODE_SEMICOLON”, “KEYCODE_APOSTROPHE”, “KEYCODE_SLASH”, “KEYCODE_AT”, “KEYCODE_NUM”, “KEYCODE_HEADSETHOOK”, “KEYCODE_FOCUS”, “KEYCODE_PLUS”, “KEYCODE_MENU”, “KEYCODE_NOTIFICATION”, “KEYCODE_SEARCH”, “KEYCODE_PLAYPAUSE”, “KEYCODE_STOP”, “KEYCODE_NEXTSONG”, “KEYCODE_PREVIOUSSONG”, “KEYCODE_REWIND”, “KEYCODE_FORWARD”, “KEYCODE_MUTE”, “TAG_LAST_KEYCODE”

touch [down|up|move] x y

Dotknięcie ekranu, tak jak dotknięcie klawisza zaczyna się od naciśnięcia aż do zwolnienia.

touch down 300 450
touch up 300 450

trackball dx dy

Symylacja używania trackball-a przez użytkownika dx ile razy przesunąć trackball w dół (wartość ujemna w górę) dy ile razy przesunąć trackball w prawo (wartość ujemna w lewo)

trackball -2 -2

flip [open|close]

Symulowanie otwarcia klawiatury (takiej jak w G1)

flip open

wake

Pokazanie klawiatury na ekranie

tap x y

Naciśnięcie ekranu/ przycisku na ekranie

tap 70 70

press keycode

Naciśnięcie klawisza. Przyjmuje KEYCODE_* lub wartość int.

press KEYCODE_1
press 29

type string

Gdy nie chcemy symulować naciśnięcia każdej literki po literce. Zasymuluje wciśnięcie kolejno podanych klawiszy

type mama

listvar

Z urządzenia możemy dostać różne zdefinowane stałe.
żeby zobaczyć listę stałych piszemy listvar, oto lista z mojego emulatora:
am.current.action am.current.categories am.current.comp.class am.current.comp.package am.current.data am.current.package build.board build.brand build.cpu_abi build.device build.display build.fingerprint build.host build.id build.manufacturer build.model build.product build.tags build.type build.user build.version.codename build.version.incremental build.version.release build.version.sdk clock.millis clock.realtime clock.uptime display.density display.height display.width

listvar

getvar varname

wartość stałych zdefiniowanych powyżej

getvar display.height display.width

quit

Kończy działanie monkey

done

Rozpoczyna nową sesje monkey. Kończy połączenie z telnetem

sleep milisecund

Usypia monkey na podaną ilość milisekund

sleep 2000

2 — Plik skryptowy Co daje nam użycie plików zamiast połączenia przez telnet z monkey ?:

Mało:
-większą kontrolę nad generowanymi zdarzeniami.
-szybsze mniej skomplikowane uruchomienie

Pliki skryptowe monkey są mniej intuicyjne i trudniejsze do napisania. Można powiedzieć, że polecenia ze sposobu 1 jest nakładką na polecenia ze sposobu 2.

Zanim użyjemy pliku skryptowego typu raw events lub user, musimy ten plik odpowiednio sformatować.
Oba tryby różnią się poleceniami, które rozumieją.
Monkey na początku, pobiera nagłówek pliku i sprawdza którego trybu używamy:

count= 6 // ile zdarzeń będzie skonsumowanych przez monkey.
speed= 1.0 // z jaką szybkością monkey ma konsumować zdarzenia
start data >> // ważna linijka po niej będą czytane zdarzenia
2a — Tryb raw events
Nagłówek:

type= raw events
count= 6
speed= 1.0
start data >>

Obsługiwane zdarzenia:
DispatchPointer
DispatchTrackball
DispatchKey
DispatchFlip

Opis funkcji i parametrów:

xxxDispatchPointer

Parametry:
downTime:long
eventTime:long
action:int
x:float
y:float
pressure:float
size:float
metaState:int
xPrecision:float
yPrecision:float
device:int
edgeFlags:int

xxxDispatchTrackball

xxxDispatchKey

Parametry:
downTime:long
eventTime:long
action:int
code:int
repeat:int
metaState:int
device:int
scancode:int

xxxDispatchFlip

keyboardOpen:Boolean

Przykład pliku skryptowego:
example_script.txt

type= raw events
count= 6
speed= 1.0
start data >>
runDispatchKey(5113146,5113146,0,29,2,0,0,0) //A down
runDispatchKey(5113147,5113147,1,29,2,0,0,0) //A up
runDispatchKey(5113146,5113146,0,30,0,0,0,0) //B down
runDispatchKey(5113147,5113147,1,30,0,0,0,0) //B up
runDispatchKey(5113146,5113146,0,31,0,0,0,0) //C down
runDispatchKey(5113147,5113147,1,31,0,0,0,0) //C up
runDispatchKey(5113146,5113146,0,32,0,0,0,0) //D down
runDispatchKey(5113147,5113147,1,32,0,0,0,0) //D up

2b — Tryb user
Nagłówek:

type= user
count= 6
speed= 1.0
start data >>

DispatchPress
LaunchActivity
UserWait
LongPress

Opis funkcji i parametrów:

xxxDispatchPress

key_name:String

xxxLaunchActivity

pkg_name:String

cl_name:String

xxxUserWait

sleeptime:long

xxxLongPress

brak

Przykład pliku skryptowego:
example_script.txt

type= user
count= 6
speed= 1.0
start data >>
userDispatchPress(KEYCODE_A)
userDispatchPress(KEYCODE_B)
userDispatchPress(KEYCODE_C)
userDispatchPress(KEYCODE_D)
userDispatchPress(KEYCODE_E)
userDispatchPress(KEYCODE_F)
userDispatchPress(KEYCODE_G)
userDispatchPress(KEYCODE_H)
userDispatchPress(KEYCODE_I)
userDispatchPress(KEYCODE_J)
userDispatchPress(KEYCODE_K)
userDispatchPress(KEYCODE_L)

Close Print

Like what you read? Give Mariusz Saramak a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.