2011-09-21 9 views
36

L'utilità delle app task killer è discusso, ma mi chiedo: come funzionano? Com'è possibile uccidere un particolare processo?Come funzionano gli assassini di attività?

Esiste un'API per questo e, in caso affermativo, che cosa fa effettivamente do?

EDIT

la pena di aggiungere: ho visto le applicazioni Task Killer uccidono processi su not rooted devices. Quindi, mi chiedo come è possibile uccidere il processo, che non possiedi in Android?

+1

dovrebbe essere sulla http://android.stackexchange.com/ –

+21

Beh penso che sia una domanda reale che appartiene a SO: Vuole sapere perché e come è programmaticamente possibile uccidere i processi su Android. Questa è una questione di programmazione ai miei occhi e una domanda molto interessante. – theomega

+0

per android/multitasking: http://android-developers.blogspot.com/2010/04/multitasking-android-way.html –

risposta

51

In breve, i Task Killers automatici funzionano eseguendo il polling del sistema operativo per un elenco dei processi attualmente in esecuzione e della memoria che stanno consumando. Quindi, con un algoritmo intelligente o con l'input dell'utente, i Task Killers inviano una chiamata al sistema che dice al sistema di uccidere il processo. Ci sono due apis che puoi fare.

Sono

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

Questo primo opere invocando Process.killProcess(int pid) dove pid è l'identificatore univoco per un processo specifico. Android uccide i processi allo stesso modo di Linux; tuttavia, un utente può solo uccidere i processi che possiedono. In Android ogni app viene eseguita con un UID univoco (UserID). Le app che utilizzano questa API un'App possono solo uccidere i propri processi, quindi il seguente explanation in the docs for Process.killProcess(int pid):

Uccidere il processo con il PID specificato. Si noti che, sebbene questa API consenta a di richiedere l'interruzione di qualsiasi processo basato sul relativo PID, il kernel applicherà restrizioni standard su quali PID effettivamente è possibile annullare . In genere ciò significa solo il processo che esegue i pacchetti/applicazioni del chiamante e tutti i processi aggiuntivi creati da tale app; I pacchetti che condividono un UID comune saranno anche in grado di uccidere i rispettivi processi .

Quando viene chiamato questo metodo, il signal viene generato dal sistema operativo e inviato al processo. Ogni volta che un processo riceve un segnale dal sistema operativo, deve gestirlo o morire immediatamente. Segnali come SIG_KILL non possono essere gestiti e comportano la morte immediata del processo destinatario. Se vuoi eliminare i processi che non hai i privilegi da eliminare, ovvero non il tuo processo, devi cambiare utente o inoltrare i tuoi privilegi (su Android questo richiede i privilegi di root sul dispositivo).

La seconda API funziona dicendo all'unità ActivityManager incorporata che si desidera eliminare i processi associati a un pacchetto specifico. Questa API risolve la necessità che l'UID corrisponda all'UID del processo perché richiede che l'utente accetti l'autorizzazione KILL_BACKGROUND_PROCESSES. Questa autorizzazione segnala al sistema operativo che un'app è stata approvata dall'utente come task killer . Quando un task killer vuole uccidere un'app, dice al sistema operativo di uccidere il processo consentendo a un'app di aggirare il problema di essere solo in grado di uccidere i processi di sua proprietà.

Nel Android Docs it says that this API actually uses the first Process.killProcess API

avere il sistema di uccidere immediatamente tutti i processi in background associati con il pacchetto data. È lo stesso del kernel che uccide quei processi per recuperare la memoria; il sistema si prenderà cura di riavviare questi processi in futuro, se necessario.

Se volete saperne di più vi consiglio di leggere la Posix Signals e The Linux kill command

Problemi correlati