Как работают убийцы задач? - PullRequest
38 голосов
/ 21 сентября 2011

Полезность task killer приложений обсуждается, но мне интересно: как они на самом деле работают?Как можно убить определенный процесс?

Есть ли для этого API, и если да, то что он на самом деле делает ?

РЕДАКТИРОВАТЬ

Стоит добавить: я видел, как приложения-убийцы задач убивают процессы на not rooted devices.Итак, мне интересно, как можно убить процесс, которым вы не владеете в Android?

1 Ответ

53 голосов
/ 26 сентября 2011

В двух словах, автоматические убийцы задач работают, опрашивая ОС на предмет списка текущих запущенных процессов и памяти, которую они потребляют. Затем либо с помощью интеллектуального алгоритма, либо с помощью пользовательского ввода Task Killers отправляет вызов системе, сообщая системе, что нужно завершить процесс. Есть два API, вы можете сделать это.

Они

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

Это сначала работает, вызывая Process.killProcess(int pid), где pid - уникальный идентификатор для конкретного процесса. Android убивает процессы так же, как Linux; однако пользователь может уничтожать только те процессы, которые ему принадлежат. В Android каждое приложение запускается с уникальным UID (UserID). Приложения, использующие этот API, могут убивать только свои собственные процессы, поэтому в документах приведено следующее объяснение для Process.killProcess(int pid):

Завершить процесс с помощью данного PID. Обратите внимание, что, хотя этот API позволяет мы просим убить любой процесс, основанный на его PID, ядро по-прежнему накладывают стандартные ограничения на то, какие PID вы на самом деле можете убить. Как правило, это означает, что только процесс, выполняющий вызывающую пакеты / приложение и любые дополнительные процессы, созданные этим приложением; пакеты с общим UID также смогут убивать друг друга процессы. * * тысяча двадцать одна

Когда этот метод вызывается, сигнал генерируется ОС и отправляется процессу. Всякий раз, когда процесс получает сигнал от ОС, он должен либо обработать этот сигнал, либо сразу же умереть. Такие сигналы, как SIG_KILL, не могут быть обработаны и приводят к немедленной смерти процесса получателя. Если вы хотите уничтожить процессы, для которых у вас нет привилегий, т. Е. Это не ваш процесс, вы должны переключить пользователей или повысить свои привилегии (на android это требует привилегий root на устройстве).

Второй API работает, сообщая встроенному ActivityManager, что вы хотите уничтожить процессы, связанные с конкретным Пакетом. Этот API-интерфейс позволяет обойтись без того, чтобы ваш UID совпадал с UID процесса , поскольку он требует, чтобы пользователь принял разрешение KILL_BACKGROUND_PROCESSES. Это разрешение сигнализирует ОС, что приложение было одобрено пользователем как убийца задач . Когда убийца задач хочет убить приложение, он говорит ОС убить процесс, позволяя приложению обойти проблему, связанную только с возможностью уничтожения принадлежащих ему процессов.

В Android Docs говорится, что этот API фактически использует первый Process.killProcess API

Пусть система немедленно уничтожит все фоновые процессы, связанные с данным пакетом. Это то же самое, что ядро, убивающее тех, процессы, чтобы восстановить память; система позаботится о перезапуске эти процессы в будущем по мере необходимости.

Если вы хотите узнать больше, я предлагаю вам прочитать о Posix Signals и Команда Linux kill

...