2010-03-18 13 views
19

Voglio ottenere l'utilizzo complessivo della CPU su Android, simile a quello che fa il Task Manager di Windows. Posso analizzare l'output del programma top incluso in Android, ma se c'è una chiamata API che fa la stessa cosa, sarebbe meglio.Come ottenere statistiche sull'utilizzo della CPU su Android?

Eventuali suggerimenti?

risposta

2

È possibile fare riferimento al progetto "DevTools".

Usando ActivityManager è possibile ottenere informazioni lotti, come ad esempio ActivityManager.RunningAppProcessInfo, ActivityManager.RunningTaskInfo, ...

Ma io non sono sicuro che il risultato sarà uguale a comando 'top'.

vedere ActivityManager

+7

Nessun utilizzo della CPU o informazioni in tempo può essere trovato c'è (o mi è mancato?), solo l'utilizzo della memoria tra le altre cose. – yuku

+0

per l'utilizzo della CPU, è possibile fare riferimento a CPUGauge.cpp, penso che non ci sia "API pubblica" per questo tipo di informazioni che si desidera. Oppure devi analizzare "/ proc/stat" da solo. –

+0

Per riferimento, ecco la fonte di CPUGauge https://android.googlesource.com/platform/frameworks/native/+/a6938ba/libs/surfaceflinger/CPUGauge.cpp –

25

Per l'utilizzo completo della CPU (non per ogni processo) è possibile utilizzare:

/** 
* 
* @return integer Array with 4 elements: user, system, idle and other cpu 
*   usage in percentage. 
*/ 
private int[] getCpuUsageStatistic() { 

    String tempString = executeTop(); 

    tempString = tempString.replaceAll(",", ""); 
    tempString = tempString.replaceAll("User", ""); 
    tempString = tempString.replaceAll("System", ""); 
    tempString = tempString.replaceAll("IOW", ""); 
    tempString = tempString.replaceAll("IRQ", ""); 
    tempString = tempString.replaceAll("%", ""); 
    for (int i = 0; i < 10; i++) { 
     tempString = tempString.replaceAll(" ", " "); 
    } 
    tempString = tempString.trim(); 
    String[] myString = tempString.split(" "); 
    int[] cpuUsageAsInt = new int[myString.length]; 
    for (int i = 0; i < myString.length; i++) { 
     myString[i] = myString[i].trim(); 
     cpuUsageAsInt[i] = Integer.parseInt(myString[i]); 
    } 
    return cpuUsageAsInt; 
} 

private String executeTop() { 
    java.lang.Process p = null; 
    BufferedReader in = null; 
    String returnString = null; 
    try { 
     p = Runtime.getRuntime().exec("top -n 1"); 
     in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     while (returnString == null || returnString.contentEquals("")) { 
      returnString = in.readLine(); 
     } 
    } catch (IOException e) { 
     Log.e("executeTop", "error in getting first line of top"); 
     e.printStackTrace(); 
    } finally { 
     try { 
      in.close(); 
      p.destroy(); 
     } catch (IOException e) { 
      Log.e("executeTop", 
        "error in closing and destroying top process"); 
      e.printStackTrace(); 
     } 
    } 
    return returnString; 
} 

divertirsi con essa :)

Problemi correlati