如何从“/ proc / cpuinfo”文件中获取Android设备的具体信息?

时间:2014-10-07 15:42:20

标签: android linux-kernel

如何解析Android平板电脑的/proc/cpuinfo虚拟文件,以获取处理器核心和时钟速度的信息? 我不需要上述文件提供的所有信息;只是这两位。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:5)

  • 目前尚不清楚您是否希望在自己的应用中使用此信息,或仅供自己使用。

    您可以使用adb获取此信息:

    adb shell cat /proc/cpuinfo
    

    adb shell cpuinfo

  • 如果您想在应用中使用此信息,请创建一个简单的函数来返回Map<String,String>,例如,

    public static Map<String, String> getCpuInfoMap() {
        Map<String, String> map = new HashMap<String, String>();
        try {
            Scanner s = new Scanner(new File("/proc/cpuinfo"));
            while (s.hasNextLine()) {
                String[] vals = s.nextLine().split(": ");
                if (vals.length > 1) map.put(vals[0].trim(), vals[1].trim());
            }
        } catch (Exception e) {Log.e("getCpuInfoMap",Log.getStackTraceString(e));}
        return map;
    }
    

    注意,这不会得到多个cpus信息,覆盖。无论如何,大多数值都是相似的。或修改以创建CpuInfoMaps列表。

    试,

    Log.d("getCpuInfoMap test", getCpuInfoMap().toString());
    

答案 1 :(得分:0)

我希望答案不会太晚,但是,这就是我获得特定cpu核心的当前频率的方法:

public class MainActivity extends Activity{

private static final int INSERTION_POINT = 27;

private static String getCurFrequencyFilePath(int whichCpuCore){
    StringBuilder filePath = new StringBuilder("/sys/devices/system/cpu/cpu/cpufreq/scaling_cur_freq");
    filePath.insert(INSERTION_POINT, whichCpuCore);
    return filePath.toString();
 }

public static int getCurrentFrequency(int whichCpuCore){

     int curFrequency = -1;
     String cpuCoreCurFreqFilePath = getCurFrequencyFilePath(whichCpuCore);

     if(new File(cpuCoreCurFreqFilePath).exists()){

         try {
                BufferedReader br = new BufferedReader(new FileReader(new File(cpuCoreCurFreqFilePath)));
                String aLine;
                while ((aLine = br.readLine()) != null) {

                    try{
                        curFrequency = Integer.parseInt(aLine);
                    }
                    catch(NumberFormatException e){

                        Log.e(getPackageName(), e.toString());
                    }

                }
                if (br != null) {
                    br.close();
                }
        } 
        catch (IOException e) {
            Log.e(getPackageName(), e.toString());
        }

     }

     return curFrequency;
 }

}

从这里开始,你只需要调用方法:-D

int core1CurrentFreq = getCurrentFrequency(1, this); 

有时核心会脱机,在这种情况下,文件路径将不存在,并且将返回-1

<强> 即可。返回值以KHz为单位 MHz值为core1CurrentFreq / 1e3
GHz值为core1CurrentFreq / 1e6

关于getCurFrequencyFilePath()方法的一些解释,因为它不是那么清楚。

当前频率通常存储在文件中:scaling_cur_freq

文件路径为:

"/sys/devices/system/cpu/cpu(XX)/cpufreq/scaling_cur_freq"

其中(XX)代替cpu核心号,例如:

"/sys/devices/system/cpu/cpu2/cpufreq/scaling_cur_freq"

INSERTION_POINT变量只不过是(XX)的索引,我们想要放置对应于cpu核心的数字的点

我建议您查看cpufreq文件夹中的其他一些文件,您可以使用它们获取其他信息,如最大和最小频率,可用频率列表等。

点击此按钮 Link 并向下滚动到标题3