アプリの有用性についてtask killer
は議論されていますが、私は疑問に思っています。実際にどのように機能するのでしょうか。特定のプロセスを強制終了するにはどうすればよいですか?
このためのAPIはありますか?もしそうなら、それは実際に何をしますか?
編集
追加する価値があります:タスクキラーアプリがでプロセスを強制終了するのを見ましたnot rooted devices
。では、Androidで所有していないプロセスをどのように強制終了できるのでしょうか。
アプリの有用性についてtask killer
は議論されていますが、私は疑問に思っています。実際にどのように機能するのでしょうか。特定のプロセスを強制終了するにはどうすればよいですか?
このためのAPIはありますか?もしそうなら、それは実際に何をしますか?
編集
追加する価値があります:タスクキラーアプリがでプロセスを強制終了するのを見ましたnot rooted devices
。では、Androidで所有していないプロセスをどのように強制終了できるのでしょうか。
一言で言えば、自動タスクキラーは、現在実行中のプロセスとそれらが消費しているメモリのリストについてOSをポーリングすることによって機能します。次に、インテリジェントアルゴリズムまたはユーザー入力のいずれかを使用して、タスクキラーがシステムに呼び出しを発行し、システムにプロセスを強制終了するように指示します。これを実行できるAPIは2つあります。
彼らです
Process.killProcess(int pid)
ActivityManager.killBackgroundProcesses(String packageName)
これは最初に、特定のプロセスの一意の識別子であるProcess.killProcess(int pid)
whereを呼び出すことによって機能します。pid
Androidは、Linuxと同じ方法でプロセスを強制終了します。ただし、ユーザーは自分が所有するプロセスのみを強制終了できます。Androidでは、各アプリは一意のUID(UserID)で実行されます。このAPIを使用するアプリは、独自のプロセスのみを強制終了できるため、ドキュメントの次の説明Process.killProcess(int pid)
は次のとおりです。
指定されたPIDでプロセスを強制終了します。このAPIを使用すると、PIDに基づいてプロセスの強制終了をリクエストできますが、カーネルは、実際に強制終了できるPIDに標準の制限を課します。通常、これは、呼び出し元のパッケージ/アプリケーションを実行しているプロセスと、そのアプリによって作成された追加のプロセスのみを意味します。共通のUIDを共有するパッケージは、互いのプロセスを強制終了することもできます。
このメソッドが呼び出されると、シグナルはOSによって生成され、プロセスに送信されます。プロセスがOSからシグナルを受信するときはいつでも、そのシグナルを処理するか、すぐに終了する必要があります。このようなシグナルSIG_KILL
は処理できず、受信者プロセスが即座に停止します。強制終了する権限がないプロセス、つまりプロセスではないプロセスを強制終了する場合は、ユーザーを切り替えるか、権限をエスカレーションする必要があります(Androidでは、デバイスのroot権限が必要です)。
ActivityManager
2番目のAPIは、特定のパッケージに関連付けられたプロセスを強制終了するようにビルトインに指示することで機能します。このAPIは、ユーザーが権限を受け入れる必要があるため、UIDがプロセスのUIDと一致する必要性を回避します。この権限は、アプリがタスクキラーKILL_BACKGROUND_PROCESSES
としてユーザーによって承認されたことをOSに通知します。タスクキラーがアプリを強制終了する場合、OSにプロセスを強制終了するように指示し、アプリが所有するプロセスのみを強制終了できるという問題を回避できるようにします。
Androidドキュメントでは、このAPIは実際に最初のAPIを使用すると書かれていますProcess.killProcess
指定されたパッケージに関連付けられているすべてのバックグラウンドプロセスをシステムにただちに強制終了させます。これは、カーネルがそれらのプロセスを強制終了してメモリを再利用するのと同じです。システムは、必要に応じて、将来これらのプロセスを再起動します。
詳細を知りたい場合は、PosixSignalsとLinuxのkillコマンドについて読むことをお勧めします。