Dlaczego „adb restart” wyłącza mój telefon znacznie szybciej niż zwykle przed ponownym uruchomieniem? Czy pomija ważne kroki?

13

Posiadam Samsung Galaxy S Relay 4G z systemem Android 4.1.2. Ponadto mam zainstalowany adb na komputerze.

Kiedy długo wciskam przycisk Zasilanie, a następnie stuknij „Uruchom ponownie”, zamknięcie mojego telefonu zajmuje około dziesięć sekund. Następnie uruchamia się ponownie.

Kiedy adb rebootzamiast tego wchodzę , telefon wyłącza się znacznie szybciej: zamknięcie zajmuje tylko około sekundy. Następnie uruchamia się ponownie.

Moje pytania:

  1. Dlaczego jest adb rebooto wiele szybszy?

  2. Czy po prostu pomija animację zamykania operatora sieci komórkowej, czy też pomija także ważniejsze procedury?

  3. Czy mogę używać za adb rebootkażdym razem, gdy chcę zrestartować telefon, czy może jest to wady?

  4. (Opcjonalnie) Skąd wiesz?


Więcej informacji (możesz to pominąć)

Przed opublikowaniem tego pytania przeprowadziłem kilka badań. Ale wciąż jestem nieoświecony. Pokażę wam, co ja nie dowiedzieć.

Tetsuyuki Kobayashi z Kyoto Microcomputer Co. wyjaśnia na slajdzie 8 tego pokazu PDF, że adb składa się z trzech części: klienta, serwera i demona. Klient i serwer działają na komputerze. Demon działa na telefonie. W slajdzie 11 wyjaśnia, że ​​wszystkie trzy części są zbudowane z jednego katalogu źródłowego. (To ten katalog .)

Próbowałem szukać słowa w tym katalogu źródłowymreboot i czytać części usług. Cpp , ale nadal nie byłem w stanie dowiedzieć się, co adb rebootwłaściwie robi, jakie bajty wysyła przez kabel ani jaki kod uruchamia telefon, gdy działa otrzymuje te bajty. Nie znalazłem też odpowiedzi na żadne z moich pytań.


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

unforgettableidSupportsMonica
źródło
Wydaje się bardzo podobny do tego setprop sys.powerctl reboot, co by zrobił. Nieczyste zamknięcie, a następnie instrukcja ponownego uruchomienia.
Firelord

Odpowiedzi:

7

Na podstawie platform/system/corerepozytorium, które podłączyłeś powyżej, myślę, że klucz jest w libcutils/android_reboot.c. I ważne są definicje include/cutils/android_reboot.h; mianowicie:

    /* Commands */
    #define ANDROID_RB_RESTART  0xDEAD0001
    #define ANDROID_RB_POWEROFF 0xDEAD0002
    #define ANDROID_RB_RESTART2 0xDEAD0003

Zwykle w normalnym trybie ponownego uruchamiania (za pomocą przycisku urządzenia itp.) Proces jest dłuższy, ponieważ (zakładam) umountowanie partycji, zabicie wszystkich aplikacji, zamknięcie wszystkich otwartych węzłów, jak w procesie zamykania. adb rebootMożna porównać z poleceniem ponownego uruchamiania systemu Linux (skąd pochodzi): po prostu czyści dysk i wprowadź restart bez pierwszych procesów zabijania lub odmontowywanie systemów plików. Widzę też polecenie szybkiego ponownego zamontowania, aby przed ponownym uruchomieniem uruchomić dysk (w naszym przypadku część pamięci urządzenia w systemie) w trybie ro.

Wierzę również, że wydane polecenie kernel_restart()jest osadzone w jądrze. Zobacz na przykład http://www.phonesdevelopers.com/1730094/ . Sprawdź także machine_restartpołączenia.

użytkownik3344236
źródło
1
+1. Dziękuję Ci bardzo! Czy mogę to robić adb rebootcodziennie, nawet jeśli nie wykona pełnej procedury wyłączania?
unforgettableidSupportsMonica
To nie boli, ale możesz mieć dobry powód, aby to zrobić. Jeśli chcesz wyczyścić niektóre buforowane dane, i tak istnieją inne rozwiązania.
user3344236
Inne rozwiązania, takie jak ...?
JohnyTex,
2

Inni użytkownicy wymiany stosów już odpowiedzieli na to pytanie w innych postach.

t0mm13b pisze, że podczas wyświetlania animacji wyłączenia operatora:

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

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

[Polecenia takie jak adb reboot] są ostrzejsze. W rzeczywistości omijają mechanizmy bezpieczeństwa w celu płynnego wyłączenia.

Gdzie indziej Yury oferuje inne wyjaśnienie tego, co robi Android podczas płynnego zamykania:

  • Wyłącza ActivityManager. Myślę, że zamknięcie ActivityManager oznacza, że ​​wszystkie działania przejdą konieczny cykl życia, a zatem stany działań zostaną zapisane. Ale nie jestem pewien. Nie sprawdziłem.
  • Następnie Android wyłącza komórkowy interfejs radiowy.
  • Następnie wyłącza Bluetooth.
  • Wreszcie próbuje zamknąć MountService.

adb reboot jest szybszy, ponieważ pomija niektóre lub wszystkie powyższe.

niezapomniany
źródło