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秒 | device | 1 |
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を実行すると、再起動前の状態を誤って拾わずに済む。
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と同様にコマンドが終了せず、再起動もしなかった。
