2010-05-11 67 views
3

是否有可能以编程方式从运行在Dalvik虚拟机上的应用程序(服务)重新启动手机?是否可以使用Android SDK或NDK重新启动手机?

如果SDK不提供此功能,那么使用NDK并调用内核提供的某些功能怎么样?我知道这个选项不是首选(不够稳定的库),但如果它是唯一的选择,我也必须考虑这一点。

+0

出于好奇,什么是编辑?我没有看到任何(重大)修改。 – kaskelotti 2010-05-13 11:49:33

+0

他添加了android标签。如果你点击“编辑......前”链接,它会显示你。 – David 2010-05-13 12:08:37

+0

谢谢。我正在寻找这个功能来展示不同之处。标签很好:) – kaskelotti 2010-05-13 12:12:01

回答

3

希望不是。 :-)

如果可以随意重新启动手机,恶意应用程序可以随机安静地执行此操作,并使您的生活变得不快乐。

由于Android依靠进程边界和Linux访问权限来实现安全性,而不是Java语言沙箱,因此NDK不会为您提供任何其他功能。

你为什么要这样做?也许还有其他一些方法可以完成你的目标。

+0

感谢您的回复。我几乎需要重新启动手机,或者这是确切的要求。我正在工作的应用程序用于测试手机上的应用程序。重新启动意味着在测试完成后执行以释放所有资源。另一种可能性是杀死一个特定的Dalvik VM,但我不知道这是否足以作为发布过程,并且比完整的重新启动更容易实现。 – kaskelotti 2010-05-13 11:48:40

+0

进程可以很容易地杀死*自己*。如果你控制相关的应用程序,他们只需要接受一个“死”的消息,并调用System.exit()。只有具有相同的用户ID才能杀死其他进程,而这些用户ID只有在由同一开发人员构建和签名时才会生效。 – fadden 2010-05-13 14:44:25

+0

谢谢。你的意思是把这些“死亡”消息作为Intents或其他一些高级手段发送出去,或者通过发送内核中的信号发送出去?用户标识是什么意思? shell上的'ps'命令为启动该进程的用户提供了帮助。有更高级别的用户ID吗? – kaskelotti 2010-05-17 08:51:19

1

我在Linux中发现了正确的系统调用,可以做到这一点,并且在摆弄NDK/JNI路径之后,我终于设法调用该函数。结果是我需要超级用户的权限。我有点猜测,情况会是这样。

有没有办法解决这个问题?除了电话,我仍然试图避免。

仍然可以用adb重新启动手机。我想这与ddmd或其他一些守护进程通信,所以有可能以某种方式使用相同的功能?

+0

什么是系统调用? – Reno 2011-11-15 10:10:06

+0

我已经忘记了这整个话题。我认为http://developer.android.com/reference/android/os/PowerManager.html#reboot%28java.lang.String%29更适合重新启动设备。还没有测试过它。对于系统调用,我无法完全记得,也许是sys_reboot。但请注意,我认为我使用Android 1.6进行了测试,而且Android内核/ API已经发展得相当多,甚至可能会导致此类系统调用不再可用。 – kaskelotti 2011-11-15 12:07:21

+0

诚然,这些似乎都不能在GB或ICS上工作,如果我找到任何东西,我会发布答案。如果您还记得使用过的系统调用,请告诉我。谢谢。 – Reno 2011-11-15 12:14:53

3

powermanager.reboot是因为API级别可供8 需要reboot permission

+0

+1很高兴看到Androik SDK正在发展(并且该线程仍然在同一时间接收更新)。由于问题域不再相同,因此无法真正接受这是一个正确的答案。仍然收到投票作为新设备的优秀更新,感谢分享。 – kaskelotti 2012-10-29 12:59:48

相关问题