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

Estoy buscando la forma mejor / más amigable 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 de reiniciar, 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é hace exactamente el dispositivo cuando presiono el botón de encendido (hardware)? Supongo que esa es la forma más amigable.

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 llamó a sync() y luego reinició el dispositivo. Además, gracias a este compromiso , las versiones modernas reboot.ctambién desmontan todos los sistemas de archivos. Android 4.1.1 incluye el compromiso que mencioné, por lo que no veo cómo su -c "reboot"en Android 4.1.1 podría causar daños en el sistema de archivos.
Querida acy: La respuesta tardía de Firelord ( su -c 'am start -a android.intent.action.REBOOT') me funciona en Android 4.1.2 y me parece 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.

Respuestas (3)

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

Puede ver un cuadro de diálogo con una opción para apagar el dispositivo (el Android estándar no ofrece reinicio). Parece que se llama a ShutdownActivity cuando mantiene presionado el botón de encendido.

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

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

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

El método se prueba en Android 4.2.1, 5.0.2 y 6.0.1 y también debería funcionar para Android 4.1.1

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.

Exactamente lo que necesitaba. Todavía me resulta extraño que diga "Apagando..." cuando hay valores para el texto de reinicio.

Sencillo, de verdad:

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

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, pasan por alto los mecanismos de seguridad para un apagado elegante.

Android no es Linux en sí mismo, en el sentido de una versión de escritorio común de Linux donde esos comandos podrían ejecutarse para cerrar el entorno de Linux.

Podría ser posible crear un script contenedor 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, según los teléfonos y las ROM, por lo que no hay garantías.

gracias por esta explicacion! ¿Es posible hacer esto de forma remota, por ejemplo, a través de ssh (no adb)?
Creo que quiere saber cómo puede imitar el botón de apagado con un comando.
si esa es la forma más amigable/segura/mejor de apagar el dispositivo, entonces sí :)
@Flujo adb reboot? No estoy seguro si eso es seguro!?! ¿ Quizás una secuencia de comandos de envoltura a su alrededor para enviar una transmisión ACTION_SHUTDOWNy luego llamar adb reboot?
Tampoco estoy seguro de que la transmisión ACTION_SHUTDOWNhaga lo que usted quiere: "Normalmente, las aplicaciones 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. ¿Es suficiente pausar la actividad?
¿Cómo puedes pausar la actividad entonces? No es un lugar garantizado para guardar preferencias, etc. según el ciclo de vida de la actividad. No solo eso, la secuencia de comandos terminaría complicándose para determinar qué aplicaciones se están ejecutando, incluidos los servicios... no vi eso ACTION_SHUTDOWN(era cierto para versiones anteriores, pero se modificó ligeramente en JB).
@sguha Pruebe algo como esto a través de ssh: su -c 'am broadcast android.intent.action.ACTION_SHUTDOWN && sleep 5 && toolbox reboot'(Puede variar según su ROM)
Parece que ninguno de estos funciona en mis dispositivos. Lo probé en FinlessROM ejecutándose en el dispositivo RK3188, así como en LG P970 con CM10.1.
Todavía experimenta problemas de red aquí después de reiniciar a través de la línea de comando (intenté su -c 'am broadcast android.intent.action.ACTION_SHUTDOWN && sleep 5 && toolbox reboot' y busybox killall system_server )
am broadcast android.intent.action.ACTION_SHUTDOWNparece transmitir la intención bien en mi emulador "Lollipop" de Android 5.1.1. Devuelve: Broadcast completed: result=0. Curiosamente, el mismo comando nunca devuelve nada en mi Samsung Galaxy S Relay con Android 4.1.2 "Jelly Bean". En cambio, el amcomando parece seguir ejecutándose para siempre.
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.

De forma predeterminada (en Linux), los comandos kill/ killalldan a los procesos una forma elegante de cerrarse, aunque depende de la implementación del cigoto si esto a su vez cierra correctamente las aplicaciones de Android en ejecución.

Nota: debe ejecutar esto como root, ya sea que 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
He notado que en algunos dispositivos, el wifi no se vuelve a conectar correctamente después de este comando (así que tengo que deshabilitar el wifi, esperar un minuto y luego volver a habilitar el wifi nuevamente).
Para lectores: en Lollipop, la forma estándar de reiniciar el marco de Android es am restart. Sin embargo, esto requiere acceso de root.
¿Le killall zygoteda a los procesos una forma elegante de cerrarse? Interesante pregunta. Alguien tendría que mirar el zygotecódigo fuente para saberlo.