rebootは端末を再起動するサブコマンドである。引数なしで通常の再起動をするほか、bootloader・recovery・sideloadを指定して特別なモードで起動できる。

reboot [bootloader|recovery|sideload|sideload-auto-reboot]

通常の再起動

引数なしで実行すると、端末を通常どおり再起動する。

$ adb reboot

adb rebootは再起動の完了を待たずにすぐ終了する。再起動中の状態はadb devicesで確認できる。エミュレータで確認すると、以下の順に状態が変わった。

adb rebootからの経過時間adb devicesの状態sys.boot_completed
約3秒offline(取得不可)
約9秒device(空)
約25秒device1

adb devicesがdeviceに戻った時点では、まだ端末の起動処理が完了していない。アプリのインストールなどを続けて実行したい場合は、sys.boot_completedが1になるまで待つ。

$ adb reboot && adb wait-for-disconnect && adb wait-for-device shell 'while [ "$(getprop sys.boot_completed)" != 1 ]; do sleep 1; done'

adb rebootの直後は、ホスト側に接続がdeviceとして残っている場合がある。wait-for-disconnectで切断を待ってからwait-for-deviceを実行すると、再起動前の状態を誤って拾わずに済む。

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

bootloaderで起動する

bootloaderを指定すると、ブートローダーで起動する。多くの端末ではfastbootモードになる。fastbootモードの端末はadb devicesには表示されず、fastboot devicesに表示される。

$ adb reboot bootloader
$ fastboot devices

fastbootモードから通常起動に戻すにはfastboot rebootを実行する。

$ fastboot reboot

ただし、fastbootモードに入れるかどうかは端末による。手元のAndroid 9実機(キャリア版)とエミュレータでは、adb reboot bootloaderを実行してもfastbootモードにならず、そのまま通常起動した。実機では起動理由を表すro.boot.bootreasonにbootloaderが記録されていた。

$ adb shell getprop ro.boot.bootreason
bootloader

recoveryで起動する

recoveryを指定すると、リカバリーモードで起動する。

$ adb reboot recovery

手元のAndroid 9実機では、倒れたドロイド君と「コマンドがありません」の画面が表示された。リカバリーモードの端末はadb devicesに表示されなくなった。

AOSP標準のリカバリーでは、電源ボタンを押したまま音量アップボタンを一度押すとメニューが表示される。通常起動に戻すには、音量ボタンで「Reboot system now」を選び、電源ボタンで決定する。メニューには「Wipe data/factory reset」など端末のデータを消去する項目もあるため、選ぶ項目を確認してから決定する。

エミュレータではadb reboot recoveryのコマンドが終了せず、エミュレータも再起動しなかった。

sideloadで起動する

sideloadを指定すると、リカバリーモードで起動し、OTAパッケージを受け付けるsideloadモードに入る。sideload-auto-rebootはsideloadの完了後に自動で再起動する。

$ adb reboot sideload
'adb root' is required for 'adb reboot sideload'.

Android 9以前のadbdは、sideload指定時にroot権限を要求する。そのためuserビルドの端末では上記のメッセージが表示され、再起動しない。終了コードは0になる。Android 10以降のadbdには、sideload指定時のroot権限チェックがない。

Android 9以前の端末でsideloadモードに入る場合は、adb reboot recoveryでリカバリーモードに入り、メニューから「Apply update from ADB」を選ぶ。

エミュレータではadb reboot sideload・adb reboot sideload-auto-rebootとも、recoveryと同様にコマンドが終了せず、再起動もしなかった。

参考