Подтвердить что ты не робот

Как работают убийцы задач?

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

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

ИЗМЕНИТЬ

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

4b9b3361

Ответ 1

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

Они

  • 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, ядро ​​будет все еще налагают стандартные ограничения, на основании которых вы действительно способны убить. Обычно это означает только процесс, выполняющий пакетов/приложений и любых дополнительных процессов, созданных этим приложением; пакеты, совместно использующие общий UID, также смогут убивать друг друга процессы.

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

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

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

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

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