概要
スマホアプリ開発を行っていると、実機やエミュレータ上で同じ操作を繰り返し行ったりする必要があり、自動化したいと思うことがよくあります。
自動テストの用途で本格的に行うのであれば、以下のAppiumなどを検討するべきですが、単純に動作確認など開発時に利用したいだけであれば、やや過剰です。
ADB (Android Debug Bridge)と呼ばれるツールを使えば、Android上の各種操作をターミナルから実行でき、スクリプトとして定義しておけば、再現性のある一連の操作として動作させることが可能です。
今回は、ADBの各コマンドの中でも、画面操作や入力を行う adb shell input について調べたので、備忘的にここに残しておきます。
adb shell input について
ターミナルからAndroidデバイスに対して各種イベントを発行するためのコマンドです。
ヘルプを表示させると以下のようになっており、基本的に入力ソース(sources)、コマンド(command)とその引数を指定して実行する形になります。
Usage: input [<source>] [-d DISPLAY_ID] <command> [<arg>...]
The sources are:
touchnavigation
touchscreen
joystick
stylus
touchpad
gamepad
dpad
mouse
keyboard
trackball
-d: specify the display ID.
(Default: -1 for key event, 0 for motion event if not specified.)
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress|--doubletap] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
draganddrop <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
motionevent <DOWN|UP|MOVE|CANCEL> <x> <y> (Default: touchscreen)
keycombination [-t duration(ms)] <key code 1> <key code 2> ... (Default: keyboard, the key order is important here.)
デバイスの指定
単純にadb shell inputを実行してエラーになる場合、以下のオプションを指定して実行対象のデバイスを確定させる必要があります。
-d use USB device (error if multiple devices connected)
-e use TCP/IP device (error if multiple TCP/IP devices available)
-s SERIAL use device with given serial (overrides $ANDROID_SERIAL)
基本的に上記の説明の通りですが、USBで接続した実機は-d、エミュレータは-eと覚えておけばOKです。
-sで指定するSERIALは adb devices の実行結果で得られる以下のような文字列になります。
emulator-5554はエミュレータのSERIALになるので、-eオプションを使わずに、adb -s emulator-5554 ...のように書くこともできます。
List of devices attached
emulator-5554 device
以降では基本的にデバイスの指定部分については省略するので、利用する場合は適宜追加して下さい。
入力ソースについて
基本的に入力ソースは省略可能です。
例えば、キーボードでtextコマンドを実行する場合、入力ソースとして keyboard を指定することになりますが、省略しても動作します。
adb shell input keyboard text "OK"
# keyboardを省略しても実行可能
adb shell input text "OK"
以降では入力ソースについては省略して記述してきます。
テキスト入力
テキスト入力を行うには、textを利用します。
以下のコマンドを実行すると「ok」が入力されます。
adb shell input text "ok"
以下の2つのコマンドは微妙に意味が異なります。
上は「ok」という文字を入力しますが、下はキーボードでokを入力します。
日本語入力状態になっている場合「おk」のような文字が入力されます。
英字入力担っている場合は同一です。
adb shell input text "ok"
adb shell input text ok
キー入力
特定のキーを入力するには、keyeventを利用します。
利用可能なキーイベントの一覧は、以下のマニュアルを参照して下さい。
以下のコマンドを実行すると"f"を入力します。
adb shell input keyevent KEYCODE_F
連続して入力することも可能です。
adb shell input keyevent KEYCODE_F KEYCODE_F
オプションとして長押し(--longpress)とダブルタップ(--doubletap)が用意されています
adb shell input keyevent --longpress KEYCODE_F
adb shell input keyevent --doubletap KEYCODE_F
キーイベントの指定は数値で行うことも可能です。
# 34 = f
adb shell input keyevent 34
数値で指定する場合は、以下のファイルを参照して下さい。
タップ
以下のコマンドで特定の位置をタップすることができます。
x, yには数値を指定してください。
adb shell input tap x y
実際に画面のサイズがどのくらいかわからないと大体の位置も推測できないので、
まずは、以下のコマンド画面サイズを取得することをオススメします。
adb shell wm size
もっと簡単に画面上の位置を知りたい場合は、開発者向けオプションの「ポインタの位置」を有効にすると良いです。
画面上部に、タップした位置などの情報が表示されます。
スワイプ
以下のコマンドで位置を指定してスワイプを実行できます。
(x1, y1)から(x2, y2)までをdurationミリ秒でスワイプします。
durationは省略可能で、300ぐらい?の値が設定されるようです。
adb shell input swipe x1 y1 x2 y2 [duration]
ドラッグ&ドロップ
以下のコマンドで位置を指定してドラッグ&ドロップを実行できます。
(x1, y1)から(x2, y2)までをdurationミリ秒でスワイプします。
adb shell input draganddrop x1 y1 x2 y2 [duration]
トラックボール
Nexus Oneなどについていたものらしいです。
おそらく最新のスマホで搭載しているものは、ないとおもわれます。
プレス(押下)は以下のコマンドで行うようなのですが、使ってみてもよくわかリませんでした。。。
adb shell input press
ロール(回転)は以下コマンドで行います。
dx, dyにそれぞれX,Y方向の移動量を指定します。
こちらのコマンドが利用可能であるならば、上述のswipeよりも楽に指定できます。
adb shell input roll dx dy
モーションイベント
低レベルのモーションイベントを行います。
基本的に、大まかな操作に関しては、このコマンドを利用せずとも実現可能です。
より細かい動作を行わせるためのコマンドになります。
あんまり情報がないのですが、以下のスレッドや生成AIに質問してみると4種類のイベントを実行できるようです。
イベント
-
DOWN: タッチダウン(画面に触れる) -
UP: タッチアップ(画面から離す) -
MOVE: タッチムーブ(画面上で移動) -
CANCEL: タッチキャンセル
以下のコマンドで実行できます。
「イベント」には上記の4種類のイベント、x, yにはイベントを発火させる画面上の位置を指定して下さい。
adb shell input motionevent イベント x y
キーの組み合わせ
複数のキーを組み合わせて入力したい場合は、以下のコマンドを利用する。
adb shell input keycombination [-t duration] key1 key2 ...
用途としては画面キャプチャ(Power + Volume Down)などがある。
# KEYCODE_POWER : 26
# KEYCODE_VOLUME_DOWN : 25
adb shell input keycombination KEYCODE_POWER KEYCODE_VOLUME_DOWN
まとめ
とりあえずヘルプで表示されるコマンドについて、一通りまとめてみました。
一連の処理として利用するためには、上述のコマンドを複数組み合わる必要があるので、シェルスクリプトなどに記述して実行することになると思います。
1から意図した処理を作成するのは大変なので、以下の記事にあるようなレコーディングを実装すると良さそうです。