¿Cómo funcionan los asesinos de tareas?

La utilidad de las aplicaciones de task killer de task killer se debate, pero me pregunto: ¿cómo funcionan realmente? ¿Cómo es posible matar un proceso particular?

¿Hay una API para esto y, de ser así, qué hace realmente?

EDITAR

Vale la pena agregar: vi que las aplicaciones asesinas de tareas mataban los procesos en not rooted devices . Entonces, me pregunto cómo es posible matar el proceso, que no tiene en Android.

En resumen, los asesinos automáticos de tareas trabajan al sondear el sistema operativo para obtener una lista de los procesos actualmente en ejecución y la memoria que están consumiendo. Entonces, ya sea con un algoritmo inteligente o con la entrada del usuario, los asesinos de tareas emiten una llamada al sistema para indicarle al sistema que mate el proceso. Hay dos apis que puedes hacer esto.

Son

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

Esto funciona primero invocando Process.killProcess(int pid) donde pid es el identificador único para un proceso específico. Android mata procesos de la misma manera que Linux; sin embargo, un usuario solo puede matar procesos que sean de su propiedad. En Android, cada aplicación se ejecuta con un único UID (UserID). Las aplicaciones que usan esta API una aplicación solo pueden matar sus propios procesos, de ahí la siguiente explicación en los documentos para Process.killProcess(int pid) :

Mata el proceso con el PID dado. Tenga en cuenta que, aunque esta API nos permite solicitar que se elimine cualquier proceso basado en su PID, el kernel seguirá imponiendo restricciones estándar sobre los PID que realmente puede eliminar. Por lo general, esto significa solo el proceso que ejecuta los paquetes / aplicaciones de la persona que llama y cualquier proceso adicional creado por esa aplicación; los paquetes que comparten un UID común también podrán matar los procesos de los demás.

Cuando se llama a este método, la señal la genera el sistema operativo y se envía al proceso. Cada vez que un proceso recibe una señal del sistema operativo, debe manejar esa señal o morir inmediatamente. Las señales como SIG_KILL no pueden manejarse y resultar en la muerte inmediata del proceso del destinatario. Si desea eliminar procesos que no tiene privilegios para matar, es decir, no es su proceso, debe cambiar de usuario o escalar sus privilegios (en Android esto requiere privilegios de administrador en el dispositivo).

La segunda API funciona al decirle al ActivityManager incorporado que desea eliminar los procesos asociados con un paquete específico. Esta API evita la necesidad de que su UID coincida con el UID del proceso porque requiere que el usuario acepte el permiso KILL_BACKGROUND_PROCESSES . Este permiso indica al sistema operativo que el usuario ha aprobado una aplicación como asesino de tareas . Cuando un asesino de tareas quiere matar a una aplicación, le dice al sistema operativo que mate el proceso, permitiendo que una aplicación evite el problema de que solo pueda matar los procesos que posee.

En los documentos de Android dice que esta API realmente usa la primera API Process.killProcess

Haga que el sistema mate inmediatamente todos los procesos en segundo plano asociados con el paquete dado. Esto es lo mismo que el núcleo que mata esos procesos para reclamar memoria; el sistema se encargará de reiniciar estos procesos en el futuro según sea necesario.

Si quieres saber más, te sugiero que leas sobre las señales de Posix y el comando de matar de Linux