Androidシステムの起動プロセスを含むシステムのすべての実行中プロセスのリストを取得するにはどうすればよいですか?
私は以下のコードを使用してリストを取得しようとしました:
_ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
_
これにより、_com.Android.phone
_、_com.Android.chrome
_などのプロセスのリストが得られました。
しかし、_adb Shell
_でps
コマンドを実行すると、他のすべてのプロセスが実行されているのを見ることができました。システムで実行されているすべてのプロセスのスクリーンショットを添付しています。
ご覧のように、いくつかのAndroidシステムのプロセスも_/system/bin/vold
_や_/system/bin/installed
_などのように実行されています。
ただし、これらはgetRunningAppProcesses()
APIによって報告されません。そのドキュメントでは、このAPIは次のように述べています。
デバイスで実行されているアプリケーションプロセスのリストを返します。
これは、「システムプロセス」が返されないということですか?そして、その場合は、Androidで実行されている「ALL」プロセスを反復処理する必要があるオプション開発者は何ですか?
-他に試したこと:ActivityManager
からさらに2つのAPIを試しました:
getRecentTasks(int maxNum)
およびそのバリアントです。ただし、Android docsはその使用について次のように警告します。
このメソッドはAPIレベル21で廃止されました。
Lollipopの時点で、このメソッドはサードパーティのアプリケーションでは使用できなくなりました
getRunningServices(int maxNum)
しかし、これらは両方とも_/system/bin/debuggerd
_などのような名前を私に与えることができませんでした。
注:非ルートデバイスでAndroid-4.2 Jellybeanを実行しています。
ActivityManager
からAPIを呼び出すことで、登録されたアプリケーション、つまりUIアクティビティのみを取得し、allプロセス。リバースDNS名ではないがパス(例:/system/bin/*
)はネイティブデーモンであり、init
で起動され、ActivityManager
から除外されます。
これを回避する1つの方法は、/proc
からプロセスのリストを直接取得することです(ツールボックスのps
が行うように)。これには、そこにあるディレクトリ(つまり/proc/[0-9]*
)をプログラムで繰り返し処理し、カーネルスレッドを削除する必要があります。カーネルスレッドはPPID
が2のスレッドなので、簡単です。ネイティブデーモンのPPID
は1です。アプリケーションのPPID
はZygoteです。