adbコマンドは、ホスト上で常駐するadbサーバーを経由して端末と通信する。start-server・kill-server・reconnectは、adbサーバーの起動・停止や端末との再接続をするサブコマンドである。端末が認識されない場合などのトラブル対応で使う。
internal debugging:
start-server ensure that there is a server running
kill-server kill the server if it is running
reconnect kick connection from host side to force reconnect
reconnect device kick connection from device side to force reconnect
reconnect offline reset offline/unauthorized devices to force reconnect
adbサーバーの仕組み
adbコマンド(クライアント)は、ホストのTCPポート5037で待ち受けるadbサーバーへ接続する。adbサーバーはUSBやTCP/IPで端末上のadbdと通信する。
graph LR A[adbクライアント] -->|tcp:5037| B[adbサーバー] B -->|USB / TCP/IP| C[端末のadbd]
adbサーバーは、サーバーを必要とするadbコマンド(adb devicesなど)の実行時に自動で起動する。
$ adb devices
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
[実機のシリアル] device
adbサーバーのプロセスはpgrepで確認できる。
$ pgrep -fl fork-server
43449 adb -L tcp:5037 fork-server server --reply-fd 4
kill-serverでサーバーを停止する
kill-serverはadbサーバーを停止する。
$ adb kill-server
adbサーバーが起動していない状態で実行すると、接続できない旨のメッセージを出力する。ただし、終了コードは0になる。
$ adb kill-server
cannot connect to daemon at tcp:5037: Connection refused
$ echo $?
0
start-serverでサーバーを起動する
start-serverはadbサーバーを起動する。すでに起動している場合は何も出力せずに終了する。
$ adb start-server
* daemon not running; starting now at tcp:5037
* daemon started successfully
$ adb start-server
adb devicesなどの実行時にも自動で起動するため、通常は明示的に実行する必要はない。起動メッセージは標準エラー出力に出る。後続コマンドの出力に起動メッセージを混ぜたくない場合に、スクリプトの最初で実行する。
サーバーを再起動して端末を認識し直す
端末をUSBで接続しているのにadb devicesに表示されない場合は、adbサーバーを再起動すると認識し直せる場合がある。
$ adb kill-server
$ adb start-server
reconnectで端末と再接続する
reconnectは、adbサーバーを再起動せずにホスト側から端末との接続を切断する。切断後はadbサーバーが端末を再検出して接続し直す。複数の端末が接続されている場合は-sなどで対象を指定する。
$ adb -s emulator-5554 reconnect
reconnecting emulator-5554 [device]
複数の端末を接続した状態で対象を指定しないと、more than one device/emulatorを出力する。ただし、終了コードは0になる。
reconnect deviceは、端末側(adbd)から接続を切断させる。エミュレータで実行すると、一時的にofflineになった後、deviceに戻った。
$ adb -s emulator-5554 reconnect device
$ adb devices
List of devices attached
emulator-5554 offline
$ adb devices
List of devices attached
emulator-5554 device
reconnect offlineは、offlineやunauthorizedなどオンラインでない状態の端末をまとめてリセットする。リセット対象の端末ごとにreconnecting [シリアル]を出力する。
$ adb reconnect offline
USB接続の実機でreconnectした場合
USB接続の端末にreconnectを実行すると、adbサーバーは端末をUSBレベルでリセットし、管理対象から外す。USB接続の端末はOSからの再検出を待って接続し直す。macOSでUSB接続の実機にreconnectを実行したところ、再検出されずadb devicesに表示されなくなった。20秒以上待っても戻らず、adb kill-server・adb start-serverでadbサーバーを再起動すると再び認識した。同じ実機にreconnect deviceを実行した場合は、deviceのまま使い続けられた。
USB接続の実機を再接続させたい場合は、reconnect deviceを使う。reconnect offlineもUSB接続の端末には同じリセット処理をする。認識されなくなった場合はadbサーバーを再起動する。
別のポートでサーバーを起動する
-Pでポート番号を指定すると、5037以外のポートでadbサーバーを起動できる。
$ adb -P 5038 start-server
* daemon not running; starting now at tcp:5038
* daemon started successfully
$ adb -P 5038 devices
List of devices attached
emulator-5554 device
$ adb -P 5038 kill-server
環境変数ANDROID_ADB_SERVER_PORTでも指定できる。
$ ANDROID_ADB_SERVER_PORT=5039 adb start-server
* daemon not running; starting now at tcp:5039
* daemon started successfully
USB接続の端末は、先に接続したadbサーバーがUSBインターフェースを確保する。上記の例では、5037番ポートのadbサーバーが確保済みのUSB接続の実機は、5038番ポートのadbサーバーには表示されない。TCP/IPで接続するエミュレータは両方に表示される。
