Qual é a melhor maneira de reiniciar o Android via linha de comando (remotamente)?

29

Estou procurando a melhor / mais amigável maneira de reiniciar o meu dispositivo Android 4.1.1 enraizado. Encontrei essas soluções até agora:

  • su -c "reboot" - Causa problemas com o wifi após reiniciar no meu dispositivo ... Eu li que isso pode causar um sistema de arquivos danificado em alguns casos ... Não funciona via ssh para mim.
  • toolbox reboot - Mesmas preocupações aqui, mas funciona via ssh.
  • reboot -d 8 -f - causa problemas após a reinicialização, por exemplo, alguns aplicativos não iniciam
  • busybox killall system_server - "Hot Reboot" (não é realmente uma reinicialização do sistema)
  • start|stop - Inicia / pára o Android Runtime (não é realmente uma reinicialização do sistema)

O que o dispositivo está fazendo exatamente quando pressiono o botão liga / desliga (hardware)? Eu acho que é a maneira mais amigável.

acy
fonte
su -c "reboot"executa o rebootcomando, definido em reboot.c. reboot.cnão mudou muito ao longo dos anos. Ele sempre chamou sync () e, em seguida, reiniciou o dispositivo. Além disso, graças a esse commit , as versões modernas reboot.ctambém desmontam todos os sistemas de arquivos. O Android 4.1.1 inclui o commit que eu mencionei e, portanto, não vejo como o su -c "reboot"Android 4.1.1 poderia causar corrupção no sistema de arquivos.
Inesquecívelid
Caro amigo, A resposta tardia do Firelord ( su -c 'am start -a android.intent.action.REBOOT') funciona para mim no Android 4.1.2 e me parece a melhor das respostas existentes. Se funcionar para você no Android 4.1.1 ou se você estiver ocupado demais para experimentá-lo, clique na marca de seleção verde para fazê-lo flutuar na parte superior da seção de respostas.
Inesquecível

Respostas:

13

Simples, realmente:

  • O Android está desligando com segurança partes vitais do tempo de execução.
  • O sistema operacional também está transmitindo intenções de dizer aos aplicativos e serviços para fechar normalmente. Estes, por sua vez, liberam seus caches de todos os dados e preferências compartilhadas, salvam o que não é do banco de dados sqlite, etc.

Em outras palavras, aplicativos e serviços têm a chance de fazer sua limpeza sistematicamente.

Os comandos que você tentou são mais severos. Eles realmente ignoram os mecanismos de segurança para um desligamento normal.

O Android não é o Linux propriamente dito, no sentido de uma versão desktop comum do Linux, na qual esses comandos podem ser emitidos para desligar o ambiente Linux.

Pode ser possível criar um script de wrapper como este:

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

Você pode salvar isso como safe_shutdown.sh, com permissões de 0755. Sua milhagem pode variar, dependendo de aparelhos e ROMs - portanto, não há garantias.

t0mm13b
fonte
obrigado por esta explicação! é possível fazer isso remotamente, por exemplo, via ssh (não adb)?
Acy
4
Eu acho que ele quer saber como ele pode imitar o desligamento do botão com um comando.
Flow
se isso é o mais amigável / mais segura melhor maneira / desligar o dispositivo, então sim :)
ACY
@Flow adb reboot? Não tenho certeza se isso é seguro!?! Talvez um script wrapper para enviar uma transmissão e ACTION_SHUTDOWNdepois ligar adb reboot?
precisa saber é o seguinte
Não há certeza de que a transmissão ACTION_SHUTDOWNfaça o que você deseja: "Normalmente, os aplicativos não precisam lidar com isso, pois a atividade em primeiro plano também será pausada". Parece que a maioria dos aplicativos, portanto , não vai lidar com isso. Pausar a atividade é suficiente?
Matthew Leia
12

O que o dispositivo está fazendo exatamente quando pressiono o botão liga / desliga (hardware)? Eu acho que é a maneira mais amigável.

Você verá uma caixa de diálogo com uma opção para desligar o dispositivo (o Android padrão não oferece reinicialização). Parece que a ShutdownActivity é chamada quando você pressiona o botão Liga / Desliga.

De qualquer forma, é isso que você pode tentar, remotamente ou localmente, mas apenas com acesso root:

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

Ele fará um desligamento normal seguido pela reinicialização. Eu estava procurando por uma intenção quando a notei aqui .

Método é testado em Android 4.2.1, 5.0.2 e 6.0.1 e deve trabalhar para Android 4.1.1 , bem

Atualizar

Testado em estoque Android 5.0 e 6.0.1:

su -c 'svc power reboot'

De acordo com o código-fonte aqui , as compilações do KitKat também devem suportar o comando.

Senhor do Fogo
fonte
1
Exatamente o que eu precisava. Ainda acho estranho dizer "Desligando ..." quando há valores para o texto de reinicialização.
Sirenes
10
killall zygote

Isso interromperá o zygoteprocesso raiz e causará uma atualização do sistema Android.

Isso não reinicia o hardware do seu telefone, apenas o Android processa.

Por padrão (no Linux), os comandos kill/ killallfornecem aos processos uma maneira fácil de desligar, embora dependa da implementação do zygote se isso, por sua vez, encerra normalmente seus aplicativos Android em execução.

Nota: você deve executá-lo como root, independentemente de usar su -c, conectar-se via SSH ou ADB ou outro método.

Outros nomes para esta ação:

  • reinicialização suave
  • reinicialização a quente
palswim
fonte
Eu notei que em alguns dispositivos, o Wifi não será reconectado corretamente após esse comando (então eu tenho que desativar o Wifi, esperar um minuto e reativar o Wifi novamente).
palswim
2
Para os leitores: No Lollipop, a maneira padrão de reiniciar a estrutura do Android é am restart. Isso requer acesso root, no entanto.
Firelord
killall zygoteaos processos uma maneira elegante de desligar? Pergunta interessante. Alguém teria que olhar o zygotecódigo fonte para saber.
Inesquecível