通过命令行(远程)重启Android的最佳方法是什么?


29

我正在寻找重新启动已扎根的android 4.1.1设备的最佳方法。到目前为止,我找到了以下解决方案:

  • su -c "reboot" -在我的设备上重新启动后导致wifi出现问题。我读到这在某些情况下可能会导致文件系统损坏...对我来说,它无法通过ssh正常运行。
  • toolbox reboot -这里同样关注,但通过ssh起作用。
  • reboot -d 8 -f -重新启动后导致问题,例如某些应用程序无法启动
  • busybox killall system_server -“热重启”(实际上不是系统重启)
  • start|stop -启动/停止Android运行时(实际上不是系统重启)

当我按下(硬件)电源按钮时,设备到底在做什么?我想那是最友好的方式。


su -c "reboot"运行在reboot中定义的命令reboot.creboot.c这些年来并没有太大变化。它始终调用sync(),然后重新启动设备。同样,由于此commit,现代版本的reboot.clinux也卸载了所有文件系统。Android 4.1.1包含了我提到的提交,因此我看不到su -c "reboot"Android 4.1.1上的文件可能会导致文件系统损坏。
unforgettableid 2015年

亲爱的朋友:Firelord的最新答案(su -c 'am start -a android.intent.action.REBOOT')在Android 4.1.2上对我有效,在我看来,它是现有答案中最好的。如果它在Android 4.1.1上适用于您,或者您太忙而无法尝试,请单击绿色的对勾以使其浮到答案部分的顶部。
unforgettableid

Answers:


13

简单,真的:

  • Android安全关闭了运行时的重要部分。
  • 操作系统还广播意图告诉应用程序和服务正常关闭的意图。这些反过来刷新其所有数据和共享首选项的缓存,将“注意事项”保存到sqlite数据库等。

换句话说,应用程序和服务有机会系统地进行清理。

您尝试过的命令更加严格。他们实际上绕过了安全机制,可以正常关机。

从本质上讲,Android不是Linux本身,在普通的Linux桌面版本中,可以发出这些命令以关闭Linux环境。

可能可以创建如下包装脚本:

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

您可以将其另存为safe_shutdown.sh,权限为0755。根据手机和ROM的不同,行驶里程可能会有所不同-因此,此处不做任何保证。


谢谢你的爆炸!是否有可能通过ssh(而非adb)远程执行此操作?
acy

4
我认为他想知道如何使用命令模仿按钮关闭。

如果那是关闭设备的最友好/最安全/最佳方法,则是:)
acy

@Flow adb reboot?我不确定那是否安全!!!也许它周围的包装器脚本发送广播ACTION_SHUTDOWN然后调用adb reboot
t0mm13b

不确定广播ACTION_SHUTDOWN会按照您的意愿进行操作:“应用程序通常不需要处理此操作,因为前台活动也会被暂停。” 听起来大多数应用程序因此无法处理它。暂停活动是否足够?
马修(Matthew)

12

当我按下(硬件)电源按钮时,设备到底在做什么?我想那是最友好的方式。

您会看到一个对话框,其中包含关闭设备电源的选项(Android普通版不提供重启功能)。长按电源按钮时似乎会调用ShutdownActivity

无论如何,这是您可以尝试的远程或本地尝试,但只能通过root用户访问:

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

它将正常关机,然后重新启动。当我在这里注意到它时,我正在寻找一个意图。

法是在Android 4.2.1,5.0.2测试6.0.1和应为Android 4.1.1工作以及

更新资料

在股票Android 5.0和6.0.1上进行了测试:

su -c 'svc power reboot'

根据此处的源代码,KitKat构建也应支持该命令。


1
正是我所需要的。当重新启动文本有值时,我仍然觉得奇怪,它说“ Powering off ...”。
塞伦斯

10
killall zygote

这将杀死根zygote进程并导致Android系统刷新。

这不会重启手机的硬件,只有Android处理。

默认情况下(在Linux中),kill/ killall命令确实为进程提供了一种正常关闭的方式,尽管它是否取决于合子实现是否又能正常关闭正在运行的Android应用程序。

注意:无论使用su -c,通过SSH或ADB或其他方法连接,都必须以root用户身份运行。

此操作的其他名称:

  • 软重启
  • 热重启

我注意到在某些设备上,此命令后Wifi无法正常重新连接(因此,我必须禁用Wifi,请稍等片刻,然后再次重新启用Wifi)。
palswim 2015年

2
对于读者:在Lollipop中,重新启动Android框架的标准方法是am restart。不过,这需要root访问。
Firelord

是否killall zygote给进程一个优雅的关闭方式?有趣的问题。有人必须查看zygote源代码才能知道。
unforgettableid 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.