任务杀手如何工作?

task killer应用程序的有用性是辩论,但我想知道:他们如何实际工作? 如何杀死特定的进程?

有没有一个API,如果是这样,它实际上做了什么?

编辑

值得添加:我看到任务杀手应用程序杀死not rooted devices上的进程。 所以,我想知道怎么可能杀死你在Android中没有的进程?

简而言之,自动任务杀手工作通过轮询操作系统的当前正在运行的进程和他们正在消耗的内存的列表。 然后,无论是使用智能algorithm还是使用用户input,“任务杀手”都会向系统发出一个呼叫,通知系统终止进程。 有两个apis你可以做到这一点。

他们是

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

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

用给定的PID来杀死进程。 请注意,尽pipe这个API允许我们根据PID来请求终止任何进程,但是内核仍然会对你实际上能够杀死的PID施加标准的限制。 通常这意味着只有运行调用者的包/应用程序的进程以及由该应用程序创build的任何附加进程; 共享一个通用UID的软件包也将能够杀死对方的进程。

当这个方法被调用的时候,这个信号是由OS生成的,并被发送给进程。 每当一个进程收到来自操作系统的信号,它必须处理该信号或立即死亡。 SIG_KILL等信号无法处理,导致收件人程序立即死亡。 如果你想杀死你没有特权杀死的进程,也就是说它不是你的进程,那么你必须切换用户或升级你的特权(在android上这需要设备上的root权限)。

第二个API的工作原理是告诉内置的ActivityManager你将终止与特定Package相关的进程。 这个API绕过了你的UID来匹配进程的UID,因为它需要用户接受KILL_BACKGROUND_PROCESSES权限。 此权限通知操作系统一个应用程序已被用户认可为任务杀手 。 当一个任务杀手想要杀死一个应用程序,它告诉操作系统杀死进程,允许应用程序绕过只能杀死它拥有的进程的问题。

在Android文档中,它说这个API实际上使用了第一个Process.killProcess API

让系统立即杀死与给定软件包相关的所有后台进程。 这与内核杀死这些进程来回收内存是一样的; 系统会根据需要在将来重新启动这些进程。

如果你想知道更多,我build议你阅读关于Posix Signals和Linux kill命令