web-dev-qa-db-ja.com

タスクキラーはどのように機能しますか?

task killerアプリの有用性については議論されていますが、実際にはどのように機能するのでしょうか。特定のプロセスを強制終了するにはどうすればよいですか?

このためのAPIはありますか?ある場合、実際には何ですかdo

[〜#〜]編集[〜#〜]

追加する価値があります:タスクキラーアプリがnot rooted devicesでプロセスを強制終了するのを見ました。では、Androidで所有していないプロセスをどのように強制終了できるのでしょうか。

38
Igor Filippov

一言で言えば、自動タスクキラーは、現在実行中のプロセスとそれらが消費しているメモリのリストについてOSをポーリングすることによって機能します。次に、インテリジェントアルゴリズムまたはユーザー入力のいずれかを使用して、タスクキラーがシステムに呼び出しを発行し、システムにプロセスを強制終了するように指示します。これを行うことができる2つのAPIがあります。

彼らです

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

これは、最初にProcess.killProcess(int pid)を呼び出すことによって機能します。ここで、pidは特定のプロセスの一意の識別子です。 Android Linuxと同じ方法でプロセスを強制終了しますが、ユーザーは自分が所有するプロセスのみを強制終了できます。Androidでは、各アプリは一意で実行されますUID(ユーザーID)。このAPIを使用するアプリは、アプリが独自のプロセスのみを強制終了できるため、次のようになります Process.killProcess(int pid)のドキュメントでの説明

指定されたPIDでプロセスを強制終了します。このAPIを使用すると、PIDに基づいてプロセスの強制終了をリクエストできますが、カーネルは、実際に強制終了できるPIDに標準の制限を課します。通常、これは、呼び出し元のパッケージ/アプリケーションを実行しているプロセスと、そのアプリによって作成された追加のプロセスのみを意味します。共通のUIDを共有するパッケージは、互いのプロセスを強制終了することもできます。

このメソッドが呼び出されると、 signal がOSによって生成され、プロセスに送信されます。プロセスがOSからシグナルを受信するときはいつでも、そのシグナルを処理するか、すぐに終了する必要があります。 SIG_KILLなどのシグナルは処理できず、受信者プロセスが即座に停止します。強制終了する権限がないプロセス、つまりプロセスではないプロセスを強制終了する場合は、ユーザーを切り替えるか、権限をエスカレーションする必要があります(Androidでは、デバイスのroot権限が必要です) )。

2番目のAPIは、特定のパッケージに関連付けられたプロセスを強制終了することを組み込みのActivityManagerに通知することで機能します。 このAPIは、ユーザーがKILL_BACKGROUND_PROCESSES権限を受け入れる必要があるため、UIDがプロセスのUIDと一致する必要性を回避します。この権限は、アプリがタスクキラーとしてユーザーによって承認されたことをOSに通知します。タスクキラーがアプリを強制終了したい場合、OSにプロセスを強制終了するように指示し、アプリが所有するプロセスのみを強制終了できるという問題を回避できるようにします。

Android Docsには、このAPIが実際に最初のProcess.killProcess AP​​Iを使用すると書かれています

指定されたパッケージに関連付けられているすべてのバックグラウンドプロセスをシステムにただちに強制終了させます。これは、カーネルがこれらのプロセスを強制終了してメモリを再利用するのと同じです。システムは、必要に応じて、将来これらのプロセスを再起動します。

詳細を知りたい場合は、 Posix Signals および Linuxのkillコマンド について読むことをお勧めします。

53
slayton