как получить использование памяти и процессора приложением? - PullRequest
5 голосов
/ 18 марта 2012

Я нашел этот код, чтобы получить общее использование процессора.Возможно ли преобразовать это, чтобы сказать использование процессора процессом?Есть ли какой-либо API, с помощью которого мы можем получить использование процессора или памяти Android?

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 ]

4 голосов
/ 06 марта 2013
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 Причина
    что используется только часть общей памяти, так что
    обоснованность использования общей памяти всеми ответственными приложениями

Это значение используется для оценки загрузки памяти приложения.

Итоговые суммы представляют собой сумму по далвику, туземцу и др.

2 голосов
/ 19 июля 2012

Чтение / proc / [pid] / stat - [pid] - это pid целевого процесса

Затем найдите следующих членов.

  • время% lu
  • stime% lu

man / proc @ http://linux.die.net/man/5/proc

0 голосов
/ 07 ноября 2017

Попробуйте это:

    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;
}
0 голосов
/ 18 марта 2012

Во время работы приложения запустите инструмент DDMS, который находится в папке Android-sdk \ tools.Где вы получите полную информацию обо всем запущенном процессе.Если у вас включено отладочное устройство Android, вы можете отладить его даже с устройства, подключив его к системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...