Jaki jest najlepszy sposób na ponowne uruchomienie Androida za pomocą wiersza poleceń (zdalnie)?

29

Szukam najlepszego / najbardziej przyjaznego sposobu na ponowne uruchomienie mojego zrootowanego urządzenia z Androidem 4.1.1. Dotychczas znalazłem te rozwiązania:

  • su -c "reboot" - Powoduje problemy z Wi-Fi po ponownym uruchomieniu na moim urządzeniu ... Przeczytałem, że w niektórych przypadkach może to spowodować awarię systemu plików ...
  • toolbox reboot - Te same obawy tutaj, ale działa przez ssh.
  • reboot -d 8 -f - powoduje problemy po ponownym uruchomieniu, np. niektóre aplikacje się nie uruchamiają
  • busybox killall system_server - „Hot Reboot” (tak naprawdę nie restart systemu)
  • start|stop - Uruchamia / zatrzymuje Android Runtime (tak naprawdę nie jest to restart systemu)

Co dokładnie robi urządzenie, kiedy naciskam przycisk (sprzętowy) zasilania? To chyba najbardziej przyjazny sposób.

acy
źródło
su -c "reboot"uruchamia rebootpolecenie zdefiniowane w reboot.c. reboot.cprzez lata niewiele się zmieniło. Zawsze wywoływał sync (), a następnie restartował urządzenie. Ponadto, dzięki temu zatwierdzeniu , nowoczesne wersje reboot.crównież odmontowują wszystkie systemy plików. Android 4.1.1 zawiera wspomniane wyżej zatwierdzenie, więc nie widzę, jak su -c "reboot"w Androidzie 4.1.1 może kiedykolwiek spowodować uszkodzenie systemu plików.
niezapomniany
Drogi acy: Późna odpowiedź Firelorda ( su -c 'am start -a android.intent.action.REBOOT') działa na mnie w Androidzie 4.1.2 i wydaje mi się, że jest to najlepsza z istniejących odpowiedzi. Jeśli działa dla Ciebie w Androidzie 4.1.1 lub jeśli jesteś zbyt zajęty, aby go wypróbować, kliknij zielony znacznik wyboru, aby przenieść go na górę sekcji odpowiedzi.
niezapomniany

Odpowiedzi:

13

Proste, naprawdę:

  • Android bezpiecznie wyłącza istotne części środowiska wykonawczego.
  • System operacyjny rozsyła również intencje, aby aplikacje i usługi były wdzięcznie zamykane. Te z kolei opróżniają pamięć podręczną wszystkich danych i wspólnych preferencji, zapisując to, czego nie ma w bazie danych sqlite, i tak dalej.

Innymi słowy, aplikacje i usługi mają możliwość systematycznego czyszczenia.

Polecenia, które wypróbowałeś, są ostrzejsze. W rzeczywistości omijają mechanizmy bezpieczeństwa w celu płynnego wyłączenia.

Android nie jest Linuxem per se, w sensie zwykłej wersji Linuksa na komputery stacjonarne, w której można wydawać te polecenia w celu zamknięcia środowiska Linux.

Możliwe może być utworzenie skryptu opakowania, takiego jak ten:

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

Możesz zapisać to jako safe_shutdown.shz uprawnieniami 0755. Twój przebieg może się różnić w zależności od słuchawek i pamięci ROM - więc nie ma żadnych gwarancji.

t0mm13b
źródło
dzięki za to wyjaśnienie! czy można to zrobić zdalnie, np. przez ssh (nie adb)?
acy
4
Myślę, że chce wiedzieć, jak naśladować zamknięcie przycisku za pomocą polecenia.
Flow
jeśli jest to najbardziej przyjazny / najbezpieczniejszy / najlepszy sposób na wyłączenie urządzenia, to tak :)
acy
@Flow adb reboot? Nie jestem pewien, czy to bezpieczne!?! Może wokół niego jest skrypt otoki, aby wysłać transmisję, ACTION_SHUTDOWNa następnie zadzwonić adb reboot?
t0mm13b
Nie jestem pewien, czy transmisja ACTION_SHUTDOWNzrobi to, co chcesz: „Aplikacje zwykle nie będą musiały sobie z tym radzić, ponieważ aktywność na pierwszym planie również zostanie wstrzymana”. Wygląda na to, że większość aplikacji nie poradzi sobie z tym. Czy wstrzymanie aktywności jest wystarczające?
Mateusz
12

Co dokładnie robi urządzenie, kiedy naciskam przycisk (sprzętowy) zasilania? To chyba najbardziej przyjazny sposób.

Zobaczysz okno dialogowe z opcją wyłączenia urządzenia (standardowe urządzenie Android nie oferuje ponownego uruchomienia). Wygląda na to, że funkcja ShutdownActivity jest wywoływana po długim naciśnięciu przycisku zasilania.

Tak czy inaczej, możesz spróbować zdalnie lub lokalnie, ale tylko z dostępem root:

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

Nastąpi płynne zamknięcie, a następnie ponowne uruchomienie. Szukałem dla intencją, kiedy zauważył go tutaj .

Metoda jest testowana na Android 4.2.1, 5.0.2 i 6.0.1 i powinno działać na Androidzie 4.1.1 , a także

Aktualizacja

Testowane na standardowym Androidzie 5.0 i 6.0.1:

su -c 'svc power reboot'

Za kod źródłowy tutaj , KitKat buduje powinien również wspierać komendę.

Firelord
źródło
1
Dokładnie to, czego potrzebowałem. Nadal uważam za dziwne, że mówi „Wyłączanie ...”, gdy istnieją wartości dla tekstu restartu.
Syreny
10
killall zygote

Spowoduje to zabicie zygoteprocesu rootowania i spowoduje odświeżenie systemu Android.

Nie powoduje to ponownego uruchomienia sprzętu telefonu, a jedynie procesy systemu Android.

Domyślnie (w Linuksie) polecenia kill/ killalldają procesom płynny sposób na zamknięcie, chociaż to zależy od implementacji zygote, czy to z kolei z wdziękiem zamyka uruchomione aplikacje na Androida.

Uwaga: musisz uruchomić to jako root, bez względu na to, czy używasz su -c, łącz się przez SSH lub ADB, lub inną metodą.

Inne nazwy tej akcji:

  • miękki restart
  • gorący restart
palswim
źródło
Zauważyłem, że na niektórych urządzeniach Wi-Fi nie połączy się poprawnie po tym poleceniu (więc muszę wyłączyć Wi-Fi, odczekać minutę, a następnie ponownie włączyć Wi-Fi).
palswim
2
Dla czytelników: w Lollipop standardowym sposobem ponownego uruchomienia platformy Android jest am restart. Wymaga to jednak dostępu do roota.
Firelord
Czy killall zygotedaje procesom pełen wdzięku sposób na zamknięcie? Interesujące pytanie. Ktoś musiałby spojrzeć na zygotekod źródłowy, aby się dowiedzieć.
niezapomniany