如何获取应用程序的内存使用和CPU使用情况?

7

我发现了这段代码可以获取整体CPU使用情况。是否可以将其转换为按进程告知CPU使用情况?有没有API可以获取Android的CPU或内存使用情况?

private float readUsage() {
    try {
        RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
        String load = reader.readLine();

        String[] toks = load.split(" ");

        long idle1 = Long.parseLong(toks[5]);
        long cpu1 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
              + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);

        try {
            Thread.sleep(360);
        } catch (Exception e) {}

        reader.seek(0);
        load = reader.readLine();
        reader.close();

        toks = load.split(" ");

        long idle2 = Long.parseLong(toks[5]);
        long cpu2 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
            + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);

        return (float)(cpu2 - cpu1) / ((cpu2 + idle2) - (cpu1 + idle1));

    } catch (IOException ex) {
        ex.printStackTrace();
    }

    return 0;
}
4个回答

6
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());            
}
  • 现代操作系统中,应用程序使用共享库。因此,一些内存被多个应用程序使用,使得确定应用程序的内存使用变得复杂。

  • dalvikPrivateDirty是Java虚拟机在进程被杀死时将释放的内存。

  • nativePrivateDirty对于本地代码来说是相同的,对于其他代码也是相同的(不确定还有什么)。
  • otherPrivateDirty dalvikSharedDirty是Java虚拟机使用的共享内存,但这不会被释放。

  • 如果该应用程序被杀死,则dalvikPss是应用程序使用的内存的估计值。这包括所有私有内存和一部分共享内存。请检查pss >= private,只使用共享内存的一部分是为了保证所有负责应用程序的共享内存使用的合理性。

此值用于估算应用程序的内存负载。

总计是dalvik、native和其他的总和。


Log.e("memory"," total pss: " + MI[0].getTotalPss()); 这行代码会返回内存的字节数还是KB? - user3233280
以上代码可以运行。但是我想知道如何在设备上获取当前的CPU使用率(%)。请帮助我。 - ArrchanaMohan

2

0

试试这个:

    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;
}

-3
在运行应用程序时,运行位于Android-sdk\tools文件夹中的DDMS工具。其中您将获得有关所有正在运行的进程的完整信息。如果您启用了Android设备的调试模式,则可以通过将其连接到系统来进行调试。

请查看以下链接以获取更多信息:http://2.bp.blogspot.com/_9l0GmPwgCzk/SY-EGKmIm4I/AAAAAAAAACE/6YjUq_Rnne0/s1600/ddms_allocation_tracker.png - Pavandroid
我想让用户直接在应用程序中知道哪个进程正在使用 CPU 百分比。 - Ravi Patel
他想要像其他应用程序一样在代码中完成,而不使用DDMS环境。 - JPM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接