public class CpuUtils {
private static final String TAG = CpuUtils.class.getSimpleName();
public static final String AARCH_64 = "aarch64";
public static final String STRING_OX = "0X";
public static final String STRING_0x = "0x";
/**
* It's also good way to get cpu core number
*/
public static int getCPUCoreNum() {
return Runtime.getRuntime().availableProcessors();
}
/**
* 64 系统判断
*
* @return
*/
public static boolean isCpu64() {
boolean result = false;
String mProcessor = null;
try {
mProcessor = getFieldFromCpuinfo("Processor");
} catch (IOException e) {
e.printStackTrace();
}
if (mProcessor != null) {
Log.d(TAG, "isCPU64 mProcessor = " + mProcessor);
if (mProcessor.contains(AARCH_64)) {
result = true;
}
}
return result;
}
private static long cpuMaxFreq = 0;
private static long cpuMinFreq = 0;
/**
* CPU 最大频率
*
* @return
*/
public static long getCpuMaxFreq() {
if(cpuMaxFreq != 0) {
return cpuMaxFreq;
}
long result = 0L;
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"));
if ((line = br.readLine()) != null) {
result = Long.parseLong(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
cpuMaxFreq = result;
return result;
}
/**
* CPU 最小频率
*
* @return
*/
public static long getCpuMinFreq() {
if(cpuMinFreq != 0) {
return cpuMinFreq;
}
long result = 0L;
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq"));
if ((line = br.readLine()) != null) {
result = Long.parseLong(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
cpuMinFreq = result;
return result;
}
/**
* 可调节 CPU 频率档位
*
* @return
*/
public static String getCpuAvailableFrequenciesSimple() {
String result = null;
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"));
if ((line = br.readLine()) != null) {
result = line;
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 可调节 CPU 频率档位
*
* @return
*/
public static List<Long> getCpuAvailableFrequencies() {
List<Long> result = new ArrayList<>();
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"));
if ((line = br.readLine()) != null) {
String[] list = line.split("\\s+");
for (String value : list) {
long freq = Long.parseLong(value);
result.add(freq);
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 可调节 CPU 频率档位
*
* @return
*/
public static List<Integer> getCpuFreqList() {
List<Integer> result = new ArrayList<>();
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"));
if ((line = br.readLine()) != null) {
String[] list = line.split("\\s+");
for (String value : list) {
result.add(Integer.parseInt(value));
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
public static String[] getCpuAFreqList() {
String[] result = null;
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"));
if ((line = br.readLine()) != null) {
result = line.split("\\s+");
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* CPU 调频策略
*
* @return
*/
public static String getCpuGovernor() {
String result = null;
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"));
if ((line = br.readLine()) != null) {
result = line;
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* CPU 支持的调频策略
*
* @return
*/
public static String getCpuAvailableGovernorsSimple() {
String result = null;
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors"));
if ((line = br.readLine()) != null) {
result = line;
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
public static String[] getCpuAvailableGovernorsList() {
String[] result = null;
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors"));
if ((line = br.readLine()) != null) {
result = line.split("\\s+");
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* CPU 支持的调频策略
*
* @return
*/
public static List<String> getCpuAvailableGovernors() {
List<String> result = new ArrayList<>();
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors"));
if ((line = br.readLine()) != null) {
String[] list = line.split("\\s+");
for (String value : list) {
result.add(value);
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* CPU 场景配置文件
*
* @return
*/
public static List<String> getCpuSceneInfo() {
List<String> result = new ArrayList<>();
BufferedReader br = null;
try {
String line;
br = new BufferedReader(new FileReader("/system/vendor/etc/perfservscntbl.txt"));
result.add("/system/vendor/etc/perfservscntbl.txt");
while ((line = br.readLine()) != null) {
result.add(line);
}
result.add("/system/vendor/etc/perf_whitelist_cfg.xml");
br = new BufferedReader(new FileReader("/system/vendor/etc/perf_whitelist_cfg.xml"));
while ((line = br.readLine()) != null) {
result.add(line);
}
br.close();
} catch (FileNotFoundException e) {
result.add(e.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
/**
* CPU 电压
*
* @return
*/
public static List<String> getCpuVoltage() {
List<String> result = new ArrayList<>();
BufferedReader br = null;
try {
String line;
br = new BufferedReader(new FileReader("/proc/cpufreq/MT_CPU_DVFS_LL/cpufreq_oppidx"));
while ((line = br.readLine()) != null) {
result.add(line);
}
br.close();
} catch (FileNotFoundException e) {
result.add(e.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
public static String getArchitecture() {
String result = null;
try {
String mCpuPart = getFieldFromCpuinfo("CPU part");
Log.d(TAG, "mCpuPart = " + mCpuPart);
if (mCpuPart.startsWith(STRING_0x) || mCpuPart.startsWith(STRING_OX)) {
mCpuPart = mCpuPart.substring(2);
}
int mCpuPartId = Integer.valueOf(mCpuPart, 16);
switch (mCpuPartId) {
case 0x920:
result = "ARM" + " ARM920T";
break;
case 0x926:
result = "ARM" + " ARM926EJ";
break;
case 0xB36:
result = "ARM" + " ARM1136";
break;
case 0xB56:
result = "ARM" + " ARM1156";
break;
case 0xB76:
result = "ARM" + " ARM1176";
break;
case 0xC05:
result = "ARM" + " Cortex-A5";
break;
case 0xC07:
result = "ARM" + " Cortex-A7";
break;
case 0xC08:
result = "ARM" + " Cortex-A8";
break;
case 0xC09:
result = "ARM" + " Cortex-A9";
break;
case 0xC0C:
result = "ARM" + " Cortex-A12";
break;
case 0xC0F:
result = "ARM" + " Cortex-A15";
break;
case 0xC0E:
result = "ARM" + " Cortex-A17";
break;
case 0xc14:
result = "ARM" + " Cortex-R4";
break;
case 0xc15:
result = "ARM" + " Cortex-R5";
break;
case 0xc20:
result = "ARM" + " Cortex-M0";
break;
case 0xc21:
result = "ARM" + " Cortex-M1";
break;
case 0xc23:
result = "ARM" + " Cortex-M3";
break;
case 0xc24:
result = "ARM" + " Cortex-M4";
break;
case 0xD03:
result = "ARM" + " Cortex-A53";
break;
case 0xD07:
result = "ARM" + " Cortex-A57";
break;
case 0x8:
result = "NVIDIA" + " Tegra K1";
break;
case 0xf:
result = "Qualcomm" + " Snapdragon S1/S2";
break;
case 0x2d:
result = "Qualcomm" + " Snapdragon S2/S3";
break;
case 0x4d:
result = "Qualcomm" + " Snapdragon S4";
break;
case 0x6F:
result = "Qualcomm" + " Snapdragon 200/400/600/800";
break;
default:
result = "0x" + Integer.toHexString(mCpuPartId);
break;
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static List<String> getCpuInfo() {
List<String> result = new ArrayList<>();
try {
String line;
BufferedReader br = new BufferedReader(new FileReader("/proc/cpuinfo"));
while ((line = br.readLine()) != null) {
result.add(line);
}
br.close();
} catch (FileNotFoundException e) {
result.add(e.toString());
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/** /proc/cpuinfo
processor : 0
Processor : AArch64 Processor rev 4 (aarch64)
model name : AArch64 Processor rev 4 (aarch64)
BogoMIPS : 26.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
*/
public static String getFieldFromCpuinfo(String field) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("/proc/cpuinfo"));
Pattern p = Pattern.compile(field + "\\s*:\\s*(.*)");
try {
String line;
while ((line = br.readLine()) != null) {
Matcher m = p.matcher(line);
if (m.matches()) {
return m.group(1);
}
}
} finally {
br.close();
}
return null;
}
/**
* 获取 CPU 名称
*
* @return
*/
public static String getProcessor() {
if(!TextUtils.isEmpty(processInfo)) {
return processInfo;
}
String result = null;
try {
result = getFieldFromCpuinfo("Processor");
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}