Короче говоря, 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 работает, сообщая встроенному диспетчеру действий, что вы хотите убить процессы, связанные с определенным пакетом. Этот API позволяет обойти потребность в том, чтобы ваш UID совпадал с UID процесса, потому что он требует, чтобы пользователь принял разрешение KILL_BACKGROUND_PROCESSES. Это разрешение сигнализирует ОС, что приложение было одобрено пользователем как убийца задач. Когда таск-киллер хочет убить приложение, он говорит ОС, чтобы убить процесс, позволяя приложению обойти проблему возможности убивать только те процессы, которыми оно владеет.
В Android Docs говорится, что этот API фактически использует первый API Process.killProcess.
Пусть система немедленно завершит все фоновые процессы, связанные с данным пакетом. Это то же самое, что ядро убивает эти процессы, чтобы освободить память; система позаботится о перезапуске этих процессов в будущем по мере необходимости. Если вы хотите узнать больше, я предлагаю вам прочитать о сигналах Posix и команде kill в Linux.
person
Farhad Faghihi
schedule
27.03.2015