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

参考: 【adb】devicesで接続端末の一覧を確認する

複数の端末が接続されている場合

3つのサブコマンドとも、複数の端末が接続されている状態で対象を指定しないとエラーになる。

$ adb get-state
error: more than one device/emulator

-sでシリアルを指定するか、USB接続なら-d、エミュレータやadb connectで接続した端末などTCP/IP接続なら-eで対象を絞る。

参考