2012-03-18 10 views
4

Я нашел этот код, чтобы получить общее использование процессора. можно ли это преобразовать, чтобы указать использование процессора процессом? Есть ли какой-либо 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
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 это память, которая будет освобождена от Явы
    виртуальной машины, если процесс был убит

  • nativePrivateDirty одинаков для нативного кода одинакова для некоторого другого кода (не уверен, что еще есть есть)
  • otherPrivateDirty dalvikSharedDirty является общей памятью, используемой виртуальной машиной Java Но это не будет освобожден

  • если это приложение будет убито dalvikPss - оценка объема памяти
    , используемая приложением. Это включает в себя всю приватную памяти и
    части общей памяти Убедитесь, что PSS> = личное Причина
    , что только часть общей памяти используются так, что
    Целесообразности совместного использования памяти во всех ответственных приложениях

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

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

+0

Log.e («memory», «total pss:» + MI [0] .getTotalPss()); будет ли эта строка возвращать память в байтах или в КБ? – user3233280

-1

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

+0

Проверьте изображение для получения дополнительной информации на http://2.bp.blogspot.com/_9l0GmPwgCzk/SY-EGKmIm4I/AAAAAAAAACE/6YjUq_Rnne0/s1600/ddms_allocation_tracker.png – Pavandroid

+0

я хочу чтобы пользователь знал непосредственно в приложении, в процессе которого используется процент процессора. –

+0

Он хочет сделать это в коде, так как другие приложения не используют среду DDMS – JPM

2

Чтение/Proc/[PID]/стат - [PID] является PID вашего целевого процесса в

Тогда обратите внимание на следующие члены.

  • utime% лу
  • STIME% лу

человек/Proc @http://linux.die.net/man/5/proc

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; 
} 
Смежные вопросы