Какой лучший способ перезагрузить Android через командную строку (удаленно)?

29

Я ищу лучший / самый дружественный способ перезагрузить мое рутированное устройство Android 4.1.1. Я нашел эти решения до сих пор:

  • su -c "reboot" - Вызывает проблемы с Wi-Fi после перезагрузки на моем устройстве ... Я прочитал, что это может вызвать прерывание файловой системы в некоторых случаях ... Не работает через ssh для меня.
  • toolbox reboot - То же самое касается и здесь, но работает через ssh.
  • reboot -d 8 -f - вызывает проблемы после перезапуска, например, некоторые приложения не запускаются
  • busybox killall system_server - «Горячая перезагрузка» (на самом деле не перезагрузка системы)
  • start|stop - Запускает / останавливает Android Runtime (на самом деле не перезагрузка системы)

Что именно делает устройство, когда я нажимаю (аппаратную) кнопку питания? Я думаю, это самый дружелюбный способ.

НКД
источник
su -c "reboot"запускает rebootкоманду, которая определена в reboot.c. reboot.cне сильно изменился за эти годы. Он всегда вызывал sync () и затем перезагружал устройство. Кроме того, благодаря этой фиксации , современные версии reboot.cтакже размонтируют все файловые системы. Android 4.1.1 включает в себя коммит, о котором я упоминал, и поэтому я не понимаю, как su -c "reboot"на Android 4.1.1 может вызвать повреждение файловой системы.
незабываемый
Уважаемый ACY: поздний ответ Firelord ( su -c 'am start -a android.intent.action.REBOOT') работает для меня на Android 4.1.2, и мне кажется, что это лучший из существующих ответов. Если это работает для вас на Android 4.1.1, или если вы слишком заняты, чтобы попробовать его, пожалуйста, нажмите зеленую галочку, чтобы она всплыла в верхней части раздела ответов.
незабываемый

Ответы:

13

Просто, правда:

  • Android безопасно закрывает жизненно важные части среды выполнения.
  • ОС также вещает, чтобы изящно закрыть приложения и сервисы. Они, в свою очередь, сбрасывают свои кэши всех данных и общих настроек, сохраняют что-то в базу данных sqlite и так далее.

Другими словами, приложениям и сервисам предоставляется возможность систематически выполнять их очистку.

Команды, которые вы пробовали, жестче. Они фактически обходят механизмы безопасности для постепенного отключения.

Android - это не Linux как таковой, в смысле обычной настольной версии Linux, где эти команды могут быть выполнены для отключения среды Linux.

Может быть возможно создать скрипт-обертку, такой как этот:

#!/system/bin/sh
am broadcast android.intent.action.ACTION_SHUTDOWN
sleep 5
reboot

Вы можете сохранить это как safe_shutdown.sh, с разрешениями 0755. Ваш пробег может варьироваться, в зависимости от телефонов и ПЗУ - так что никаких гарантий там нет.

t0mm13b
источник
спасибо за это объяснение! Можно ли сделать это удаленно, например, через SSH (не ADB)?
Acy
4
Я думаю, он хочет знать, как он может имитировать отключение кнопки командой.
поток
если это самый дружественный / самый безопасный / лучший способ выключить устройство, тогда да :)
acy
@ Поток adb reboot? Я не уверен, что это безопасно!?! Может быть, сценарий обертки вокруг него, чтобы отправить трансляцию, а ACTION_SHUTDOWNзатем позвонить adb reboot?
t0mm13b
Не уверен, что вещание ACTION_SHUTDOWNбудет делать то, что вы хотите: «Приложения обычно не должны обрабатывать это, так как активность на переднем плане также будет приостановлена». Похоже, что большинство приложений, поэтому не будут справляться с этим. Достаточно ли приостановить деятельность?
Мэтью Прочитано
12

Что именно делает устройство, когда я нажимаю (аппаратную) кнопку питания? Я думаю, это самый дружелюбный способ.

Вы увидите диалоговое окно с возможностью выключить устройство (в Android нет перезагрузки). Похоже, что ShutdownActivity вызывается при длительном нажатии кнопки питания.

В любом случае, это то, что вы можете попробовать удаленно или локально, но только с правами root:

su -c 'am start -a android.intent.action.REBOOT'

Это сделает постепенное выключение с последующей перезагрузкой. Я искал намерение, когда заметил это здесь .

Метод испытания на Android 4.2.1, 5.0.2 и 6.0.1 , и должны работать на Android 4.1.1 , а также

Обновить

Протестировано на складе Android 5.0 и 6.0.1:

su -c 'svc power reboot'

За исходный код здесь , KitKat строит также должны поддерживать команду.

Повелитель огня
источник
1
Именно то, что мне было нужно. Я все еще нахожу странным, что он говорит «Выключение ...», когда есть значения для текста перезагрузки.
Сирены
10
killall zygote

Это уничтожит корневой zygoteпроцесс и приведет к обновлению системы Android.

Это не перезагружает аппаратное обеспечение вашего телефона, только процессы Android.

По умолчанию (в Linux) команды kill/ killallдают процессам изящный способ завершить работу, хотя это зависит от реализации zygote , из-за чего это, в свою очередь, корректно завершает работу ваших приложений Android.

Примечание: вы должны запустить это как root, независимо от того, используете ли вы su -c, подключаться через SSH или ADB, или другим способом.

Другие названия для этого действия:

  • мягкая перезагрузка
  • горячая перезагрузка
palswim
источник
Я заметил, что на некоторых устройствах Wi-Fi не будет правильно подключаться после этой команды (поэтому я должен отключить Wi-Fi, подождать минуту, а затем снова включить Wi-Fi).
Palswim
2
Для читателей: в Lollipop стандартным способом перезапуска платформы Android является am restart. Это требует корневого доступа, хотя.
Повелитель огня
Дает ли killall zygoteпроцессы изящный способ завершить работу? Интересный вопрос. Кто-то должен будет взглянуть на zygoteисходный код, чтобы узнать.
незабываемый