I found this code to get overall cpu usage. is this possible to convert this to tell cpu usage by process? Is there any API by which we can get CPU or Memory usage of android?
Context context = this.getApplicationContext();
ActivityManager mgr = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> processes = mgr.getRunningAppProcesses();
Log.e("DEBUG", "Running processes:");
for(Iterator i = processes.iterator(); i.hasNext(); )
{
RunningAppProcessInfo p = (RunningAppProcessInfo)i.next();
Log.e("DEBUG", " process name: "+p.processName);
Log.e("DEBUG", " pid: "+p.pid);
int[] pids = new int[1];
pids[0] = p.pid;
android.os.Debug.MemoryInfo[] MI = mgr.getProcessMemoryInfo(pids);
Log.e("memory"," dalvik private: " + MI[0].dalvikPrivateDirty);
Log.e("memory"," dalvik shared: " + MI[0].dalvikSharedDirty);
Log.e("memory"," dalvik pss: " + MI[0].dalvikPss);
Log.e("memory"," native private: " + MI[0].nativePrivateDirty);
Log.e("memory"," native shared: " + MI[0].nativeSharedDirty);
Log.e("memory"," native pss: " + MI[0].nativePss);
Log.e("memory"," other private: " + MI[0].otherPrivateDirty);
Log.e("memory"," other shared: " + MI[0].otherSharedDirty);
Log.e("memory"," other pss: " + MI[0].otherPss);
Log.e("memory"," total private dirty memory (KB): " + MI[0].getTotalPrivateDirty());
Log.e("memory"," total shared (KB): " + MI[0].getTotalSharedDirty());
Log.e("memory"," total pss: " + MI[0].getTotalPss());
}
In modern OS, app use shared libraries. Hence, some memory is used by multiple apps, complicating determining an apps memory usage.
dalvikPrivateDirty is the memory that would be freed by the java
virtual machine if the process is killed
otherPrivateDirty dalvikSharedDirty is the shared memory used by the java virtual machine But this would not be freed
if this app is killed dalvikPss – an estimate of how much memory is
used by the app. This includes all the private memory, and a
fraction of the shared memory Check that pss >= private The reason
that only a fraction of shared memory is used is so that
reasonability of the shared memory usage across all responsible apps
This value is used to estimate the memory load of the app.
The totals are the sum over the dalvik, native, and other.
Try this:
private float getCpuPer() { //for single process
float cpuPer = 0;
try {
String[] cmd = {"top", "-n", "1"};
Process process = Runtime.getRuntime().exec(cmd);
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(process.getInputStream()));
BufferedReader stdError = new BufferedReader(new
InputStreamReader(process.getErrorStream()));
// read the output from the command
//System.out.println("Here is the standard output of the command:\n");
String s = null;
while ((s = stdInput.readLine()) != null) {
if (s.contains("your process name")) {
String [] arr = s.split(" ");
for (int i = 0; i < arr.length; i++) {
if (arr[i].contains("%")) {
s = arr[i].replace("%", "");
cpuPer = Float.parseFloat(s);
break;
}
}
//System.out.println(s);
}
}
// read any errors from the attempted command
//System.out.println("Here is the standard error of the command (if any):\n");
//while ((s = stdError.readLine()) != null) {
//System.out.println(s);
//}
} catch (IOException e) {
e.printStackTrace();
}
return cpuPer;
}
While Running your application, Run the DDMS tool which is present in Android-sdk\tools folder. Where you will get the complete details about all the running process. If you have debug enabled Android Device, then you can debug even from the device by connecting it to the system.
Read /proc/[pid]/stat - [pid] is your target process's pid
Then look for the following members.
man /proc @ http://linux.die.net/man/5/proc