Después de investigar un poco en la fuente que mencionó roxan, parece que lo siguiente en /proc puede decirle qué velocidades de CPU están disponibles y cuánto tiempo se ha pasado en cada una:
/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
Sin embargo, proporciona algunos otros estados que no son apropiados. Por ejemplo, en mi Samsung Vibrant, obtengo:
1400000 0
1300000 0
1200000 0
1000000 214141
800000 40092
400000 25273
200000 6159308
100000 389
Pero el reloj estándar del chip es de 1 GHz. Por lo tanto, parece fácil encontrar la velocidad más alta de la lista que tiene un tiempo distinto de cero.
Para mis propósitos, esto debería ser adecuado.
Editar: He observado que a veces el orden en el que se enumeran las frecuencias puede variar, por lo que querrá iterar a través de toda la lista y encontrar la más rápida (en lugar de detenerse en la primera que no sea cero).
Más edición: Aquí hay una función que me funciona:
/**
* Obtener la velocidad máxima de la CPU.
*
* Esto funciona examinando la lista de frecuencias de CPU en el archivo seudó "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state" y cuánto tiempo se ha pasado en cada una. Encuentra el tiempo más alto que no es cero y asume que es la frecuencia máxima (notar que a veces se pueden informar frecuencias más altas que las diseñadas). Por lo tanto, no es imposible que este método devuelva una frecuencia de CPU incorrecta.
*
* También tenga en cuenta que (obviamente) esto no reflejará diferentes núcleos de CPU con velocidades máximas diferentes.
*
* @return frecuencia de la CPU en MHz
*/
public static int getMaxCPUFreqMHz() {
int maxFreq = -1;
try {
RandomAccessFile reader = new RandomAccessFile("/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state", "r");
boolean done = false;
while (!done) {
String line = reader.readLine();
if (null == line) {
done = true;
break;
}
String[] splits = line.split("\\s+");
assert (splits.length == 2);
int timeInState = Integer.parseInt(splits[1]);
if (timeInState > 0) {
int freq = Integer.parseInt(splits[0]) / 1000;
if (freq > maxFreq) {
maxFreq = freq;
}
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
return maxFreq;
}