package com.lh.fly.common.utils; import com.lh.fly.common.assist.Check; import com.lh.fly.common.log.Log; import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.util.regex.Pattern; /** * Get CPU info. * * @author MaTianyu * @date 2015-04-18 */ public class CpuUtil { private static final String TAG = CpuUtil.class.getSimpleName(); private static final String CPU_INFO_PATH = "/proc/cpuinfo"; private static final String CPU_FREQ_NULL = "N/A"; private static final String CMD_CAT = "/system/bin/cat"; private static final String CPU_FREQ_CUR_PATH = "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"; private static final String CPU_FREQ_MAX_PATH = "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"; private static final String CPU_FREQ_MIN_PATH = "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq"; private static String CPU_NAME; private static int CPU_CORES = 0; private static long CPU_MAX_FREQENCY = 0; private static long CPU_MIN_FREQENCY = 0; /** * Print cpu info. */ public static String printCpuInfo() { String info = FileUtil.getFileOutputString(CPU_INFO_PATH); if (Log.isPrint) { Log.i(TAG, "_______ CPU : \n" + info); } return info; } /** * Get available processors. */ public static int getProcessorsCount() { return Runtime.getRuntime().availableProcessors(); } /** * Gets the number of cores available in this device, across all processors. * Requires: Ability to peruse the filesystem at "/sys/devices/system/cpu" * * @return The number of cores, or available processors if failed to get result */ public static int getCoresNumbers() { if (CPU_CORES != 0) { return CPU_CORES; } //Private Class to display only CPU devices in the directory listing class CpuFilter implements FileFilter { @Override public boolean accept(File pathname) { //Check if filename is "cpu", followed by a single digit number if (Pattern.matches("cpu[0-9]+", pathname.getName())) { return true; } return false; } } try { //Get directory containing CPU info File dir = new File("/sys/devices/system/cpu/"); //Filter to only list the devices we care about File[] files = dir.listFiles(new CpuFilter()); //Return the number of cores (virtual CPU devices) CPU_CORES = files.length; } catch (Exception e) { e.printStackTrace(); } if (CPU_CORES < 1) { CPU_CORES = Runtime.getRuntime().availableProcessors(); } if (CPU_CORES < 1) { CPU_CORES = 1; } return CPU_CORES; } /** * Get CPU name. */ public static String getCpuName() { if (!Check.isEmpty(CPU_NAME)) { return CPU_NAME; } try { BufferedReader bufferedReader = new BufferedReader(new FileReader(CPU_INFO_PATH), 8192); String line = bufferedReader.readLine(); bufferedReader.close(); String[] array = line.split(":\\s+", 2); if (array.length > 1) { if (Log.isPrint) { Log.i(TAG, array[1]); } CPU_NAME = array[1]; } } catch (IOException e) { e.printStackTrace(); } return CPU_NAME; } /** * Get current CPU freqency. */ public static long getCurrentFreqency() { try { return Long.parseLong(FileUtil.getFileOutputString(CPU_FREQ_CUR_PATH).trim()); } catch (Exception e) { e.printStackTrace(); } return 0; } /** * Get maximum CPU freqency */ public static long getMaxFreqency() { if (CPU_MAX_FREQENCY > 0) { return CPU_MAX_FREQENCY; } try { CPU_MAX_FREQENCY = Long.parseLong(getCMDOutputString(new String[]{CMD_CAT, CPU_FREQ_MAX_PATH}).trim()); } catch (Exception e) { e.printStackTrace(); } return CPU_MAX_FREQENCY; } /** * Get minimum frenqency. */ public static long getMinFreqency() { if (CPU_MIN_FREQENCY > 0) { return CPU_MIN_FREQENCY; } try { CPU_MIN_FREQENCY = Long.parseLong(getCMDOutputString(new String[]{CMD_CAT, CPU_FREQ_MIN_PATH}).trim()); } catch (Exception e) { e.printStackTrace(); } return CPU_MIN_FREQENCY; } /** * Get command output string. */ public static String getCMDOutputString(String[] args) { try { ProcessBuilder cmd = new ProcessBuilder(args); Process process = cmd.start(); InputStream in = process.getInputStream(); StringBuilder sb = new StringBuilder(); byte[] re = new byte[64]; int len; while ((len = in.read(re)) != -1) { sb.append(new String(re, 0, len)); } in.close(); process.destroy(); if (Log.isPrint) { Log.i(TAG, "CMD: " + sb.toString()); } return sb.toString(); } catch (IOException ex) { ex.printStackTrace(); } return null; } }