任务杀手如何工作?

Posted

技术标签:

【中文标题】任务杀手如何工作?【英文标题】:How do task killers work? 【发布时间】:2011-11-22 01:45:42 【问题描述】:

task killer 应用程序的实用性存在争议,但我想知道:它们实际上是如何工作的?怎么可能杀死特定的进程?

是否有用于此的 API,如果有,它实际上 做了什么

编辑

值得补充:我在not rooted devices 上看到任务杀手应用程序杀死进程。所以,我想知道如何杀死你在 android 中不拥有的进程?

【问题讨论】:

应该在android.stackexchange.com 嗯,我认为这是一个属于 SO 的实际问题:他想知道为什么以及如何以编程方式杀死 android 上的进程。在我看来,这是与编程相关的一个非常有趣的问题。 对于安卓/多任务:android-developers.blogspot.com/2010/04/… 关闭这个问题真的很奇怪。它与编程有关。 我看不出理解系统进程模型的内部工作对 Android 开发人员来说是多么不重要。是的,这可能可以在 Android Enthusiasts 上回答...但理想情况下,您会在这里得到一个以开发人员为中心的答案。 【参考方案1】:

简而言之,自动任务杀手的工作原理是轮询操作系统以获取当前正在运行的进程的列表以及它们正在消耗的内存。然后,通过智能算法或用户输入,Task Killers 向系统发出调用,告诉系统终止进程。有两个 API 可以做到这一点。

他们是

Process.killProcess(int pid) ActivityManager.killBackgroundProcesses(String packageName)

这首先通过调用Process.killProcess(int pid) 起作用,其中pid 是特定进程的唯一标识符。 Android 以与 linux 相同的方式杀死进程;但是,用户只能杀死他们拥有的进程。在 Android 中,每个应用程序都使用唯一的 UID (UserID) 运行。使用此 API 的应用程序只能杀死自己的进程,因此以下explanation in the docs for Process.killProcess(int pid)

杀死具有给定 PID 的进程。请注意,尽管此 API 允许 我们根据 PID 请求杀死任何进程,内核将 仍然对您实际能够使用的 PID 施加标准限制 杀。通常这意味着只有运行调用者的进程 包/应用程序以及该应用程序创建的任何其他进程; 共享一个通用 UID 的包也将能够杀死彼此的包 进程。

当调用此方法时,signal 由操作系统生成并发送到进程。每当进程从操作系统接收到信号时,它必须要么处理该信号,要么立即死亡。 SIG_KILL 等信号无法处理,导致接收进程立即死亡。如果您想杀死您没有权限杀死的进程,即它不是您的进程,那么您必须切换用户或提升您的权限(在 android 上这需要设备上的 root 权限)。

第二个 API 的工作原理是告诉内置的 ActivityManager 你想杀死与特定包关联的进程。 此 API 解决了您的 UID 与进程的 UID 匹配的需要,因为它要求用户接受 KILL_BACKGROUND_PROCESSES 权限。此权限向操作系统发出信号,表明应用已被用户批准为任务杀手。当任务终止程序想要终止应用程序时,它会告诉操作系统终止进程,从而允许应用程序解决只能终止其拥有的进程的问题。

在Android Docs it says that this API actually uses the first Process.killProcess API

让系统立即杀死所有关联的后台进程 使用给定的包。这与内核杀死那些相同 回收内存的过程;系统将负责重新启动 将来根据需要进行这些处理。

如果您想了解更多信息,建议您阅读Posix Signals 和The Linux kill command

【讨论】:

以上是关于任务杀手如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

在某些任务杀手杀死应用程序后如何恢复android应用程序?

android (Service & PhoneStateListener) - 当应用程序被任务管理器、杀手或内存不足杀死时,服务确实重新启动但不工作

如何在 Android 中创建一个高级任务杀手无法杀死的服务

Android任务杀手列表

任务杀手没有重置堆栈

Android任务杀手列表