使用 adb 指令來執行 app 並發送 Keyevent

YH Lin
7 min readFeb 5, 2020

--

有的時候在測試某些特定 app 的時候

我們會希望透過 adb 指令來執行,並且發送 Keyevent 模擬 touch 或是 click 等動作

其實有點像寫一個自己的 monkey test

具體的方法如下:

Step 1: 取得 apk 資訊

假設我們現在想要執行手機的 google maps app

首先要取得這個 apk ,一般來說手機的 app 會儲存在 /data/app 的資料夾底下

我們先利用以下的指令來觀看所有安裝在手機上的 app

$ adb shell ls /data/app
...
com.google.android.apps.maps-1.apk
com.google.android.apps.plus-1.apk
com.google.android.gm-1.apk
com.google.android.gms-2.apk
com.google.android.googlequicksearchbox-1.apk
com.google.android.music-2.apk
com.google.android.tts-1.apk
com.google.android.youtube-1.apk
...

然後把 apk 檔案複製出來

$ adb pull /data/app/com.google.android.apps.maps-1.apk
# adb pull <path-in-device> <path-in-computer>

接著使用 aapt 取得 apk 資訊,沒有 aapt 的話可以在這裡下載

我們可以看到這邊列出了 app 的重要資訊,基本上就是 AndroidManifest.xml 所包含的資訊

這裡把 package name = ‘com.google.android.apps.maps’

以及 launchable-activity = ‘com.google.android.maps.MapsActivity’ 先記下來

$ aapt dump badging com.google.android.apps.maps-1.apk      # aapt dump badging <path-to-apk>package: name='com.google.android.apps.maps' versionCode='704001112' versionName='7.4.0'
sdkVersion:'17'
targetSdkVersion:'17'
uses-permission:'android.permission.INTERNET'
uses-permission:'com.google.android.providers.gsf.permission.READ_GSERVICES'
...
launchable-activity: name='com.google.android.maps.MapsActivity' label='Maps' icon=''
...

Step 2: 執行 app

把剛剛的 package name 還有 launchable-activity 搭配以下指令

就可以成功在 device 上執行該 app,簡直完美!!

$ adb shell am start -n com.google.android.apps.maps/com.google.android.maps.MapsActivity# adb shell am start -n <com.package.name>/<com.package.name.ActivityName>

Step 3: 模擬 Keyevent

最後就是根據自己的需求下 Keyevent

基本的使用如下

此為模擬按 Home 鍵

$ adb shell input 3     # adb shell input <keycode>

keycode 的對應如下表

0 -> "KEYCODE_UNKNOWN"
1 -> "KEYCODE_MENU"
2 -> "KEYCODE_SOFT_RIGHT"
3 -> "KEYCODE_HOME"
4 -> "KEYCODE_BACK"
5 -> "KEYCODE_CALL"
6 -> "KEYCODE_ENDCALL"
7 -> "KEYCODE_0"
8 -> "KEYCODE_1"
9 -> "KEYCODE_2"
10 -> "KEYCODE_3"
11 -> "KEYCODE_4"
12 -> "KEYCODE_5"
13 -> "KEYCODE_6"
14 -> "KEYCODE_7"
15 -> "KEYCODE_8"
16 -> "KEYCODE_9"
17 -> "KEYCODE_STAR"
18 -> "KEYCODE_POUND"
19 -> "KEYCODE_DPAD_UP"
20 -> "KEYCODE_DPAD_DOWN"
21 -> "KEYCODE_DPAD_LEFT"
22 -> "KEYCODE_DPAD_RIGHT"
23 -> "KEYCODE_DPAD_CENTER"
24 -> "KEYCODE_VOLUME_UP"
25 -> "KEYCODE_VOLUME_DOWN"
26 -> "KEYCODE_POWER"
27 -> "KEYCODE_CAMERA"
28 -> "KEYCODE_CLEAR"
29 -> "KEYCODE_A"
30 -> "KEYCODE_B"
31 -> "KEYCODE_C"
32 -> "KEYCODE_D"
33 -> "KEYCODE_E"
34 -> "KEYCODE_F"
35 -> "KEYCODE_G"
36 -> "KEYCODE_H"
37 -> "KEYCODE_I"
38 -> "KEYCODE_J"
39 -> "KEYCODE_K"
40 -> "KEYCODE_L"
41 -> "KEYCODE_M"
42 -> "KEYCODE_N"
43 -> "KEYCODE_O"
44 -> "KEYCODE_P"
45 -> "KEYCODE_Q"
46 -> "KEYCODE_R"
47 -> "KEYCODE_S"
48 -> "KEYCODE_T"
49 -> "KEYCODE_U"
50 -> "KEYCODE_V"
51 -> "KEYCODE_W"
52 -> "KEYCODE_X"
53 -> "KEYCODE_Y"
54 -> "KEYCODE_Z"
55 -> "KEYCODE_COMMA"
56 -> "KEYCODE_PERIOD"
57 -> "KEYCODE_ALT_LEFT"
58 -> "KEYCODE_ALT_RIGHT"
59 -> "KEYCODE_SHIFT_LEFT"
60 -> "KEYCODE_SHIFT_RIGHT"
61 -> "KEYCODE_TAB"
62 -> "KEYCODE_SPACE"
63 -> "KEYCODE_SYM"
64 -> "KEYCODE_EXPLORER"
65 -> "KEYCODE_ENVELOPE"
66 -> "KEYCODE_ENTER"
67 -> "KEYCODE_DEL"
68 -> "KEYCODE_GRAVE"
69 -> "KEYCODE_MINUS"
70 -> "KEYCODE_EQUALS"
71 -> "KEYCODE_LEFT_BRACKET"
72 -> "KEYCODE_RIGHT_BRACKET"
73 -> "KEYCODE_BACKSLASH"
74 -> "KEYCODE_SEMICOLON"
75 -> "KEYCODE_APOSTROPHE"
76 -> "KEYCODE_SLASH"
77 -> "KEYCODE_AT"
78 -> "KEYCODE_NUM"
79 -> "KEYCODE_HEADSETHOOK"
80 -> "KEYCODE_FOCUS"
81 -> "KEYCODE_PLUS"
82 -> "KEYCODE_MENU"
83 -> "KEYCODE_NOTIFICATION"
84 -> "KEYCODE_SEARCH"
85 -> "TAG_LAST_KEYCODE"

如果想要模擬 click 或是 swipe 的手勢

可以使用以下的指令

$ adb shell input tap <x> <y>       # 模擬 click$ adb shell input swipe <x1> <y1> <x2> <y2>     # 模擬 swipe

--

--

No responses yet