web-dev-qa-db-ja.com

Androidで実行中のすべてのプロセスのリスト

Androidシステムの起動プロセスを含むシステムのすべての実行中プロセスのリストを取得するにはどうすればよいですか?

私は以下のコードを使用してリストを取得しようとしました:

_ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
_

これにより、_com.Android.phone_、_com.Android.chrome_などのプロセスのリストが得られました。

しかし、_adb Shell_でpsコマンドを実行すると、他のすべてのプロセスが実行されているのを見ることができました。システムで実行されているすべてのプロセスのスクリーンショットを添付しています。 Running processes in my devices

ご覧のように、いくつかのAndroidシステムのプロセスも_/system/bin/vold_や_/system/bin/installed_などのように実行されています。

ただし、これらはgetRunningAppProcesses() AP​​Iによって報告されません。そのドキュメントでは、このAPIは次のように述べています。

デバイスで実行されているアプリケーションプロセスのリストを返します。

これは、「システムプロセス」が返されないということですか?そして、その場合は、Androidで実行されている「ALL」プロセスを反復処理する必要があるオプション開発者は何ですか?

-他に試したこと:ActivityManagerからさらに2つのAPIを試しました:

  1. getRecentTasks(int maxNum)およびそのバリアントです。

ただし、Android docsはその使用について次のように警告します。

このメソッドはAPIレベル21で廃止されました。

Lollipopの時点で、このメソッドはサードパーティのアプリケーションでは使用できなくなりました

  1. getRunningServices(int maxNum)

しかし、これらは両方とも_/system/bin/debuggerd_などのような名前を私に与えることができませんでした。

注:非ルートデバイスでAndroid-4.2 Jellybeanを実行しています。

19
AADProgramming

ActivityManagerからAPIを呼び出すことで、登録されたアプリケーション、つまりUIアクティビティのみを取得し、allプロセス。リバースDNS名ではないがパス(例:/system/bin/*)はネイティブデーモンであり、initで起動され、ActivityManagerから除外されます。

これを回避する1つの方法は、/procからプロセスのリストを直接取得することです(ツールボックスのpsが行うように)。これには、そこにあるディレクトリ(つまり/proc/[0-9]*)をプログラムで繰り返し処理し、カーネルスレッドを削除する必要があります。カーネルスレッドはPPIDが2のスレッドなので、簡単です。ネイティブデーモンのPPIDは1です。アプリケーションのPPIDはZygoteです。

参照: NewAndroidBook.com

6
Technologeeks