Further MemoryTracker robustness:

- grab a copy of the tracked processes list in the dumper
- scan running processes when memorytracker starts to catch
  pids that may have survived a crash of the tracker's process
- use RunningServiceInfo to figure out roughly how long a
  service scanned in this way has been alive

Change-Id: I861642f07183e3945f7a7a41e1e5144567e17e13
This commit is contained in:
Daniel Sandler
2013-07-07 17:16:49 -05:00
parent a29949d2ef
commit 0adfc5a755
3 changed files with 32 additions and 7 deletions
+23 -5
View File
@@ -26,6 +26,7 @@ import android.util.Log;
import android.util.LongSparseArray;
import java.util.ArrayList;
import java.util.List;
public class MemoryTracker extends Service {
public static final String TAG = MemoryTracker.class.getSimpleName();
@@ -47,10 +48,10 @@ public class MemoryTracker extends Service {
//= new Meminfo[(int) (30 * 60 / (UPDATE_RATE / 1000))]; // 30 minutes
public long max = 1;
public int head = 0;
public ProcessMemInfo(int pid, String name) {
public ProcessMemInfo(int pid, String name, long start) {
this.pid = pid;
this.name = name;
this.startTime = System.currentTimeMillis();
this.startTime = start;
}
public long getUptime() {
return System.currentTimeMillis() - startTime;
@@ -99,7 +100,7 @@ public class MemoryTracker extends Service {
return mPidsArray;
}
public void startTrackingProcess(int pid, String name) {
public void startTrackingProcess(int pid, String name, long start) {
synchronized (mLock) {
final Long lpid = new Long(pid);
@@ -114,7 +115,7 @@ public class MemoryTracker extends Service {
mPidsArray[i] = p;
sb.append(p); sb.append(" ");
}
mData.put(pid, new ProcessMemInfo(pid, name));
mData.put(pid, new ProcessMemInfo(pid, name, start));
Log.v(TAG, sb.toString());
}
}
@@ -149,6 +150,22 @@ public class MemoryTracker extends Service {
@Override
public void onCreate() {
mAm = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// catch up in case we crashed but other processes are still running
List<ActivityManager.RunningServiceInfo> svcs = mAm.getRunningServices(256);
for (ActivityManager.RunningServiceInfo svc : svcs) {
if (svc.service.getPackageName().equals(getPackageName())) {
startTrackingProcess(svc.pid, svc.process, System.currentTimeMillis() - (SystemClock.elapsedRealtime() - svc.activeSince));
}
}
List<ActivityManager.RunningAppProcessInfo> procs = mAm.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo proc : procs) {
final String pname = proc.processName;
if (pname.startsWith(getPackageName())) {
startTrackingProcess(proc.pid, pname, System.currentTimeMillis());
}
}
}
@Override
@@ -164,7 +181,8 @@ public class MemoryTracker extends Service {
if (ACTION_START_TRACKING.equals(intent.getAction())) {
final int pid = intent.getIntExtra("pid", -1);
final String name = intent.getStringExtra("name");
startTrackingProcess(pid, name);
final long start = intent.getLongExtra("start", System.currentTimeMillis());
startTrackingProcess(pid, name, start);
}
}