get-state・get-serialno・get-devpathは、接続中の端末の状態・シリアル番号・接続先のパスをそれぞれ1行で出力するサブコマンドである。adb devicesと異なり1台分の値だけを出力するため、スクリプトで扱いやすい。
get-state print offline | bootloader | device
get-serialno print <serial-number>
get-devpath print <device-path>
get-stateで状態を取得する
$ adb get-state
device
端末が接続されていればdeviceを出力し、終了コード0で終了する。
ヘルプにはofflineを出力すると書かれているが、offline状態の端末に実行するとofflineは出力されず、エラーになる。unauthorized状態の端末でも同様にエラーになる。終了コードは1である。
$ adb -s emulator-5554 get-state
error: device offline
$ echo $?
1
端末が見つからない場合もエラーになる。
$ adb -s emulator-5556 get-state
error: device 'emulator-5556' not found
$ adb -e get-state
error: no emulators found
device以外に、リカバリーモードのrecoveryやsideloadモードのsideloadを出力する場合もある。
スクリプトでdevice状態かどうかを確認する場合は、出力を比較する。
if [ "$(adb get-state 2>/dev/null)" = device ]; then
echo "connected"
fi
接続されるまで待ちたい場合はwait-for-deviceを使う。
参考: 【adb】wait-forで端末の接続や状態の変化を待つ
get-serialnoでシリアル番号を取得する
get-serialnoは、adb devicesに表示されるシリアル番号を出力する。
$ adb -d get-serialno
[実機のシリアル]
$ adb -e get-serialno
emulator-5554
get-serialnoが出力するのはadbが端末を識別する名前である。USB接続の実機では端末のro.serialnoプロパティと一致する場合が多い。エミュレータやadb connectで接続した端末では、emulator-5554やIPアドレス:ポートのようなadb上の名前を出力する。
$ adb -e shell getprop ro.serialno
EMULATOR36X5X11X0
実機のシリアル番号は、機種によってはIMEIなどの端末固有の番号と一致する。ログやスクリーンショットを共有する場合は注意する。
get-devpathで接続先のパスを取得する
get-devpathは、端末が接続されているパスを出力する。macOS・LinuxのUSB接続では、USBポートの位置を表すusb:で始まる値を出力する。
$ adb -d get-devpath
usb:8-3.3
エミュレータなどTCP/IP経由の端末ではunknownを出力する。WindowsではUSB接続の端末でもunknownになる。
$ adb -e get-devpath
unknown
get-devpathの値は、adb devices -lのusb:の列と同じである。
$ adb devices -l
List of devices attached
[実機のシリアル] device usb:8-3.3 product:SH-02M model:SH_02M device:SH-02M transport_id:38
emulator-5554 device product:sdk_gphone64_arm64 model:sdk_gphone64_arm64 device:emu64a transport_id:51
複数の端末が接続されている場合
3つのサブコマンドとも、複数の端末が接続されている状態で対象を指定しないとエラーになる。
$ adb get-state
error: more than one device/emulator
-sでシリアルを指定するか、USB接続なら-d、エミュレータやadb connectで接続した端末などTCP/IP接続なら-eで対象を絞る。
