emuはAndroidエミュレータのコンソールコマンドを実行するサブコマンドである。位置情報、バッテリー状態、SMS受信、ネットワーク速度など、実機では再現しにくい状態をコマンドから作り出せる。
使えるコマンドを確認する
adb emu helpで、実行できるコンソールコマンドの一覧を表示する。
$ adb emu help
Android console commands:
help|h|?
help-verbose
ping
automation
event
geo
gsm
cdma
crash
crash-on-exit
kill
restart
network
grpc
power
...
OK
adb emu help [コマンド名]で、各コマンドのサブコマンドを確認できる。
$ adb emu help power
allows to change battery and AC power status
available sub-commands:
power display display battery and charger state
power ac set AC charging state
power status set battery status
power present set battery present state
power health set battery health state
power capacity set battery capacity state
OK
成功したコマンドは末尾にOKを出力する。
位置情報を変更する
geo fixでGPSの位置情報を送る。引数は経度、緯度の順である。
$ adb emu geo fix 139.7671 35.6812
OK
位置情報を受け取るアプリには、送った座標が届く。以下は受信した緯度・経度をログに出力するアプリの例である。
09-25 19:45:30.686 11105 11105 I LocDemo : 35.681198333333334,139.76709833333334
端末側の最新の位置情報はdumpsys locationで確認できる。
$ adb shell dumpsys location | grep -m1 'Location\[gps'
last location=Location[gps 35.681198,139.767098 hAcc=5.0 ...]
GPSの位置情報を要求しているアプリがない状態でgeo fixを実行しても、last locationは更新されない。GPS(gpsプロバイダ)の位置情報を要求するアプリを起動してからgeo fixを実行する。
緯度と経度を逆に指定すると、別の地点になる。緯度が±90度の範囲外になる場合はエラーになる。
$ adb emu geo fix 35.6812 139.7671
KO: invalid latitude value. Should be in [-90,+90] range
バッテリー状態を変更する
powerでバッテリー残量や充電状態を変更できる。低バッテリー時の動作確認に使える。
$ adb emu power capacity 15
OK
$ adb emu power ac off
OK
$ adb emu power status discharging
OK
power displayで現在の設定を確認できる。
$ adb emu power display
AC: offline
status: Discharging
health: Good
present: true
capacity: 15
OK
端末側のdumpsys batteryにも反映される。
$ adb shell dumpsys battery | grep -E 'AC powered|status|level'
AC powered: false
status: 3
level: 15
status: 3は放電中(BATTERY_STATUS_DISCHARGING)を表す。エミュレータの初期値(AC接続・充電中・100%)に戻す場合は以下を実行する。
$ adb emu power ac on
OK
$ adb emu power status charging
OK
$ adb emu power capacity 100
OK
SMSを受信させる
sms send [送信元の電話番号] [本文]で、エミュレータにSMSを受信させる。
$ adb emu sms send 09011112222 "hello from emu"
OK
実機でSMSを受信したときと同様に、メッセージアプリの通知が表示される。

ステータスバーにも通知アイコンが表示される。

受信したSMSは端末のSMSデータベースに保存される。
$ adb shell content query --uri content://sms/inbox --projection address,body --where "address=\'09011112222\'"
Row: 0 address=09011112222, body=hello from emu
ネットワークの速度と遅延を変更する
network speedで通信速度、network delayで遅延をシミュレートする。edgeやgprsなど通信方式の名前で指定できる。各通信方式の値は公式ドキュメントの表と異なる場合がある。実際に設定された値はnetwork statusで確認する。
$ adb emu network speed edge
OK
$ adb emu network delay gprs
OK
$ adb emu network status
Current network status:
download speed: 473600 bits/s (57.8 KB/s)
upload speed: 473600 bits/s (57.8 KB/s)
minimum latency: 35 ms
maximum latency: 200 ms
OK
制限を解除する場合はfullとnoneを指定する。network statusの0 bits/sは速度制限なしを表す。
$ adb emu network speed full
OK
$ adb emu network delay none
OK
$ adb emu network status
Current network status:
download speed: 0 bits/s (0.0 KB/s)
upload speed: 0 bits/s (0.0 KB/s)
minimum latency: 0 ms
maximum latency: 0 ms
OK
AVD名を確認する・エミュレータを終了する
avd nameで、起動中のエミュレータのAVD名を表示する。複数のエミュレータを起動している場合に、emulator-5554などのシリアルとAVDの対応を確認できる。
$ adb -s emulator-5554 emu avd name
til_test
OK
killでエミュレータを終了する。
$ adb emu kill
OK: killing emulator, bye bye
OK
注意点
emuはエミュレータ専用である。adbはシリアルがemulator-[ポート番号]の形式かどうかでエミュレータを判定し、シリアルに含まれるポート番号のエミュレータコンソールへ直接接続する。コンソールの認証トークンはadbが自動で送信するため、telnetで接続する場合と違ってauthコマンドは不要である。
-sで実機のシリアルを指定すると、何も出力せずに終了コード1で終了する。
$ adb -s [実機のシリアル] emu avd name
$ echo $?
1
-sを省略し、エミュレータが1台も起動していない場合はerror: no emulator detectedを出力する。
$ adb emu avd name
error: no emulator detected
存在しないコンソールコマンドを指定するとKO:で始まるエラーを出力する。ただし、終了コードは0になる。スクリプトで成否を判定する場合は、終了コードではなく出力を確認する。
$ adb emu foo
KO: unknown command, try 'help'
$ echo $?
0
