¿Cuál es la mejor manera de reiniciar Android a través de la línea de comandos (de forma remota)?

29

Estoy buscando la mejor / más amigable manera de reiniciar mi dispositivo Android 4.1.1 rooteado. Encontré estas soluciones hasta ahora:

  • su -c "reboot" - Causa problemas con wifi después de reiniciar en mi dispositivo ... Leí que esto puede causar un sistema de archivos corrupto en algunos casos ... No funciona a través de ssh para mí.
  • toolbox reboot - Las mismas preocupaciones aquí, pero funciona a través de ssh.
  • reboot -d 8 -f - causa problemas después del reinicio, por ejemplo, algunas aplicaciones no se inician
  • busybox killall system_server - "Reinicio en caliente" (no es realmente un reinicio del sistema)
  • start|stop - Inicia / detiene Android Runtime (no es realmente un reinicio del sistema)

¿Qué está haciendo el dispositivo exactamente cuando presiono el botón de encendido (hardware)? Supongo que es la forma más amigable.

acy
fuente
su -c "reboot"ejecuta el rebootcomando, que se define en reboot.c. reboot.cno ha cambiado mucho a lo largo de los años. Siempre ha llamado a sync () y luego reinicia el dispositivo. Además, gracias a este compromiso , las versiones modernas de reboot.ctambién desmontan todos los sistemas de archivos. Android 4.1.1 incluye la confirmación que mencioné, por lo que no veo cómo su -c "reboot"Android 4.1.1 podría causar daños en el sistema de archivos.
inolvidableid
Querido acy: La respuesta tardía de Firelord ( su -c 'am start -a android.intent.action.REBOOT') funciona para mí en Android 4.1.2, y me parece ser la mejor de las respuestas existentes. Si funciona para usted en Android 4.1.1, o si está demasiado ocupado para probarlo, haga clic en la marca de verificación verde para que flote en la parte superior de la sección de respuestas.
inolvidableid

Respuestas:

13

Simple, realmente:

  • Android está cerrando de manera segura partes vitales del tiempo de ejecución.
  • El sistema operativo también está transmitiendo intentos de decirle a las aplicaciones y servicios que se cierren con gracia. Estos, a su vez, vacían sus cachés de todos los datos y preferencias compartidas, guardan lo que no es en la base de datos sqlite, etc.

En otras palabras, las aplicaciones y los servicios tienen la oportunidad de hacer su limpieza sistemáticamente.

Los comandos que has probado son más duros. De hecho, evitan los mecanismos de seguridad para un apagado elegante.

Android no es Linux per se, en el sentido de una versión de escritorio ordinaria de Linux donde esos comandos podrían emitirse para apagar el entorno Linux.

Es posible crear un script de envoltura como este:

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

Puede guardar esto como safe_shutdown.sh, con permisos de 0755. Su kilometraje puede variar, dependiendo de los teléfonos y ROM, por lo que no hay garantías.

t0mm13b
fuente
¡Gracias por esta explicación! ¿es posible hacer esto de forma remota, por ejemplo, a través de ssh (no adb)?
acy
44
Creo que quiere saber cómo puede imitar el apagado del botón con un comando.
Flujo
si esa es la forma más amigable / segura / mejor de apagar el dispositivo, entonces sí :)
acy
@Flow adb reboot? ¡No estoy seguro si eso es seguro! ¿Tal vez un script de envoltura alrededor para enviar una transmisión y ACTION_SHUTDOWNluego llamar adb reboot?
t0mm13b
Tampoco estoy seguro de que la transmisión ACTION_SHUTDOWNhaga lo que desea: "Las aplicaciones normalmente no necesitarán manejar esto, ya que la actividad en primer plano también se detendrá". Parece que la mayoría de las aplicaciones, por lo tanto , no lo manejarán. ¿Pausar la actividad es suficiente?
Mateo leyó el
12

¿Qué está haciendo el dispositivo exactamente cuando presiono el botón de encendido (hardware)? Supongo que es la forma más amigable.

Puede ver un cuadro de diálogo con una opción para apagar el dispositivo (el Android original no ofrece reinicio). Parece que se activa ShutdownActivity cuando presiona el botón de encendido.

De todos modos, esto es lo que puedes probar, de forma remota o local, pero solo con acceso root:

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

Hará un apagado elegante seguido del reinicio. Estaba buscando una intención cuando la noté aquí .

Método se probó en Android 4.2.1, 5.0.2 y 6.0.1 y debería funcionar para Android 4.1.1 , así

Actualizar

Probado en stock Android 5.0 y 6.0.1:

su -c 'svc power reboot'

Según el código fuente aquí , las compilaciones de KitKat también deberían admitir el comando.

Señor del fuego
fuente
1
Exactamente lo que necesitaba. Todavía me resulta extraño que diga "Apagando ..." cuando hay valores para el texto de reinicio.
Sirenas
10
killall zygote

Esto eliminará el zygoteproceso raíz y provocará una actualización del sistema Android.

Esto no reinicia el hardware de su teléfono, solo los procesos de Android.

Por defecto (en Linux), los comandos kill/ le killalldan a los procesos una forma elegante de cerrar, aunque depende de la implementación del cigoto si esto a su vez apaga con gracia las aplicaciones de Android en ejecución.

Nota: debe ejecutar esto como root, ya sea que lo use su -c, se conecte a través de SSH o ADB, u otro método.

Otros nombres para esta acción:

  • reinicio suave
  • reinicio en caliente
palswim
fuente
He notado que en algunos dispositivos, el Wifi no se volverá a conectar correctamente después de este comando (así que tengo que desactivar el Wifi, esperar un minuto y luego volver a habilitar el Wifi nuevamente).
palswim
2
Para los lectores: en Lollipop, la forma estándar de reiniciar el marco de Android es am restart. Sin embargo, esto requiere acceso de root.
Señor del fuego
¿Le killall zygoteda a los procesos una forma elegante de cerrar? Interesante pregunta. Alguien tendría que mirar el zygotecódigo fuente para saberlo.
inolvidableid