Quelle est la meilleure façon de redémarrer Android via la ligne de commande (à distance)?

29

Je cherche le meilleur moyen / le plus convivial de redémarrer mon appareil Android 4.1.1 enraciné. J'ai trouvé ces solutions jusqu'à présent:

  • su -c "reboot" - Cause des problèmes avec le wifi après le redémarrage de mon appareil ... J'ai lu que cela peut provoquer un système de fichiers currupt dans certains cas ... Ne fonctionne pas via ssh pour moi.
  • toolbox reboot - Même soucis ici, mais fonctionne via ssh.
  • reboot -d 8 -f - provoque des problèmes après le redémarrage, par exemple, certaines applications ne démarrent pas
  • busybox killall system_server - "Hot Reboot" (pas vraiment un redémarrage du système)
  • start|stop - Démarre / arrête Android Runtime (pas vraiment un redémarrage du système)

Que fait l'appareil exactement lorsque j'appuie sur le bouton d'alimentation (matériel)? Je suppose que c'est la manière la plus amicale.

acy
la source
su -c "reboot"exécute la rebootcommande, qui est définie dans reboot.c. reboot.cn'a pas beaucoup changé au fil des ans. Il a toujours appelé sync () puis redémarré l'appareil. De plus, grâce à ce commit , les versions modernes de reboot.cdémontent également tous les systèmes de fichiers. Android 4.1.1 inclut le commit que j'ai mentionné, et donc je ne vois pas comment su -c "reboot"sur Android 4.1.1 pourrait jamais endommager le système de fichiers.
inoubliableid
Cher acy: La réponse tardive de Firelord ( su -c 'am start -a android.intent.action.REBOOT') fonctionne pour moi sur Android 4.1.2, et me semble être la meilleure des réponses existantes. Si cela fonctionne pour vous sur Android 4.1.1, ou si vous êtes trop occupé pour l'essayer, veuillez cliquer sur la coche verte afin de la faire flotter en haut de la section des réponses.
inoubliableid

Réponses:

13

Simple, vraiment:

  • Android arrête en toute sécurité les parties vitales de l'exécution.
  • Le système d'exploitation diffuse également des intentions pour dire aux applications et aux services de se fermer avec élégance. Celles-ci, à leur tour, vident leurs caches de toutes les données et préférences partagées, enregistrent les autres éléments dans la base de données sqlite, et cetera.

En d'autres termes, les applications et les services ont la possibilité de faire leur nettoyage systématiquement.

Les commandes que vous avez essayées sont plus dures. Ils contournent en fait les mécanismes de sécurité pour un arrêt gracieux.

Android n'est pas Linux en soi, au sens d'une version de bureau ordinaire de Linux où ces commandes pourraient être émises pour arrêter l'environnement Linux.

Il pourrait être possible de créer un script wrapper comme celui-ci:

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

Vous pouvez l'enregistrer sous safe_shutdown.sh, avec les autorisations de 0755. Votre kilométrage peut varier en fonction des combinés et des ROM - donc aucune garantie là-bas.

t0mm13b
la source
merci pour cette explication! est-il possible de le faire à distance, par exemple via ssh (pas adb)?
acy
4
Je pense qu'il veut savoir comment il peut imiter l'arrêt du bouton avec une commande.
Débit du
si c'est la manière la plus conviviale / la plus sûre / la meilleure pour éteindre l'appareil, alors oui :)
acy
@Flow adb reboot? Je ne sais pas si c'est sûr!?! Peut-être un script wrapper autour pour envoyer une diffusion ACTION_SHUTDOWNpuis appeler adb reboot?
t0mm13b
Pas sûr que la diffusion ACTION_SHUTDOWNfasse ce que vous voulez non plus: "Les applications n'auront normalement pas besoin de gérer cela, car l'activité de premier plan sera également suspendue." Il semble que la plupart des applications ne le gèrent pas. La pause de l'activité est-elle suffisante?
Matthew Read
12

Que fait l'appareil exactement lorsque j'appuie sur le bouton d'alimentation (matériel)? Je suppose que c'est la manière la plus amicale.

Vous pouvez voir une boîte de dialogue avec une option pour éteindre l'appareil (Android ne propose pas de redémarrage). Il semble que ShutdownActivity soit appelé lorsque vous appuyez longuement sur le bouton d'alimentation.

Quoi qu'il en soit, c'est ce que vous pouvez essayer, à distance ou localement, mais uniquement avec un accès root:

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

Il fera un arrêt gracieux suivi du redémarrage. Je cherchais une intention quand je l'ai remarqué ici .

La méthode est testée sur Android 4.2.1, 5.0.2 et 6.0.1 et devrait fonctionner pour Android 4.1.1 et

Mise à jour

Testé sur stock Android 5.0 et 6.0.1:

su -c 'svc power reboot'

Selon le code source ici , les builds KitKat devraient également prendre en charge la commande.

Seigneur du feu
la source
1
Exactement ce dont j'avais besoin. Je trouve toujours étrange qu'il dise "Mise hors tension ..." quand il y a des valeurs pour le texte de redémarrage.
Sirens
10
killall zygote

Cela tuera le zygoteprocessus racine et provoquera une actualisation du système Android.

Cela ne redémarre pas le matériel de votre téléphone, seulement les processus Android.

Par défaut (sous Linux), les commandes kill/ killalldonnent aux processus un moyen gracieux de s'arrêter, bien que cela dépende de l' implémentation de zygote si cela à son tour arrête gracieusement vos applications Android en cours d'exécution.

Remarque: vous devez l'exécuter en tant que root, que vous utilisiez, vous su -cconnectiez via SSH ou ADB, ou une autre méthode.

Autres noms pour cette action:

  • redémarrage en douceur
  • redémarrage à chaud
palswim
la source
J'ai remarqué sur certains appareils, le Wifi ne se reconnectera pas correctement après cette commande (je dois donc désactiver le Wifi, attendre une minute, puis réactiver le Wifi à nouveau).
palswim
2
Pour les lecteurs: Dans Lollipop, la façon standard de redémarrer le framework Android est am restart. Cela nécessite cependant un accès root.
Firelord
Donne-t-il killall zygoteaux processus une manière élégante de s'arrêter? Question interessante. Il faudrait que quelqu'un regarde le zygotecode source pour le savoir.
inoubliableid