ActivityManagerを利用することで、システムメモリの使用状況、Activityやタスクの状態がわかります。今回はその中から、以下の3つのシステム情報について取得方法を紹介します
- メモリ使用量の取得
- エラーが発生したタスク情報
- 実行中のタスク情報
それぞれ、以下のAPIを利用できます。
- void ActivityManager.getMemoryInfo(ActivityManager.MemoryInfo outInfo)
- List<ActivityManager.ProcessErrorStateInfo> ActivityManager.getProcessesInErrorState()
- List<ActivityManager.RunningAppProcessInfo>ActivityManager.getRunningAppProcesses()
メモリ使用量を取得する
ActivityManager.MemoryInfo
現在の利用可能なメモリを取得します。メモリが少なくなってきた際、積極的にプロセスを殺すLowMemoryKillerが実行されるしきい値などもMemoryInfoで取得できます。
| メンバ | 説明 |
|---|---|
| availMem | システムの使用可能メモリ合計 |
| lowMemory | 現在のlowmemoryフラグ(trueでメモリ不足状態) |
| threshold | しきい値。下回った際に、バックグラウンドサービスや、その他無関係なプロセスからKillし始める |
サンプルコードです。ActivityManagerを利用することで簡単に取得できます。
ActivityManager activityManager = ((ActivityManager) getSystemService(ACTIVITY_SERVICE));
//メモリ情報の取得
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
Log.d("ActivityManager","memoryInfo availMem :"+memoryInfo.availMem);
Log.d("ActivityManager","memoryInfo lowMemory :"+memoryInfo.lowMemory);
Log.d("ActivityManager","memoryInfo threshold :"+memoryInfo.threshold);
エラー情報、実行中のタスク情報は以下に続きます。
エラー情報を取得する
エラー状態(condition)にはCRASHED、NOT_RESPONDING、NO_ERRORがあり、応答のない状態として有名なANR(Application Not Responding)状態などが取得できます。
ActivityManager.ProcessErrorStateInfo
| メンバ | 説明 |
|---|---|
| condition | エラー状態(CRASHED/ANR/NO_ERROR) |
| crashData | nullが推奨値 |
| longMsg | エラーの説明文(長いほう)詳細 |
| shortMsg | エラーの説明文(短いほう)概要 |
| pid | 親プロセスID、ない場合は0 |
| processName | エラー・クラッシュしたプロセス名 |
| stackTrace | エラー発生時のスタックトレース |
| tag | エラー情報のタグ |
| uid | このプロセスに割り当てられているカーネルUserID |
今現在の実装では、エラー発生時のuid(UserID)は、エラーが起きたアプリケーション固有の番号ではありません。いくつかのアプリケーションで共有していますので注意が必要です。またエラー情報は、各プロセス(Activity)が正常な場合は取得しても空(null)となります。
//エラー情報の取得
List<ActivityManager.ProcessErrorStateInfo> errorStateInfo = activityManager.getProcessesInErrorState();
if(errorStateInfo != null){
for (ActivityManager.ProcessErrorStateInfo error : errorStateInfo){
//エラー情報
Log.d("ActivityManager","error.condition :"+error.condition); // CRASHED,NOT_RESPONDING,NO_ERROR
Log.d("ActivityManager","error.longMsg :"+error.longMsg);
Log.d("ActivityManager","error.shortMsg :"+error.shortMsg);
Log.d("ActivityManager","error.pid :"+error.pid);
Log.d("ActivityManager","error.processName:"+error.processName);
Log.d("ActivityManager","error.stackTrace :"+error.stackTrace);
Log.d("ActivityManager","error.tag :"+error.tag);
Log.d("ActivityManager","error.uid :"+error.uid);
}
}
“running”状態のタスク情報を取得する
ここでいう実行状態(running)のタスク情報とは、(実際にLinux上で)プロセスが実行中で、活発に動いている状態を指すわけではありません。
システム上、”running”状態になっているタスク情報を取得することができます。極端なことを言うと、(システムのLowMemoryKillerなどが)特定のプロセスをKillしたケースであっても、(ユーザ操作により、アプリケーションを再起動するために)プロセスの状態は”running”を維持している可能性があります。
ActivityManager.RunningTaskInfo
| メンバ | 説明 |
|---|---|
| baseActivity | ComponentNameクラス。タスクで初めて起動したActivity |
| description | 現在の状態の概要 |
| id | ユニークなtaskID |
| numActivities | タスクのActivity数 |
| numRunning | running状態のActivity数 |
| thumbnail | Bitmap形式のサムネイル |
| topActivity | ComponentNameクラス。タスク・スタックの先頭Activity |
タスク状態を取得するにはパーミッションの設定が必要です。
AndroidManifest.xml
<uses-permission android:name="android.permission.GET_TASKS" />
サンプルコード
//起動中のタスク情報
// <uses-permission android:name="android.permission.GET_TASKS" /> パーミッションが必要
List<ActivityManager.RunningTaskInfo> taskInfo = activityManager.getRunningTasks(5);//直近5つを取得
if(taskInfo != null){
for (RunningTaskInfo task : taskInfo){
//エラー情報
Log.d("ActivityManager","task.id :"+task.id);
Log.d("ActivityManager","task.description :"+task.description);
Log.d("ActivityManager","task.numActivities:"+task.numActivities);
Log.d("ActivityManager","task.numRunning :"+task.numRunning);
}
}