统计一下文件个数便可以获得 CPU 核数。
public static int getNumberOfCPUCores() {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
return 1;
}
int cores;
try {
cores =
new File(
"/sys/devices/system/cpu/").listFiles(CPU_FILTER).length;
}
catch (SecurityException e) {
cores = DEVICEINFO_UNKNOWN;
}
catch (NullPointerException e) {
cores = DEVICEINFO_UNKNOWN;
}
return cores;
}
private static final FileFilter CPU_FILTER =
new FileFilter() {
@Override
public boolean accept(File pathname) {
String path = pathname.getName();
if (path.startsWith(
"cpu")) {
for (
int i =
3; i < path.length(); i++) {
if (path.charAt(i) <
'0' || path.charAt(i) >
'9') {
return false;
}
}
return true;
}
return false;
}
};
public static int getNumberOfCPUCores() {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
return 1;
}
int cores;
try {
cores =
new File(
"/sys/devices/system/cpu/").listFiles(CPU_FILTER).length;
}
catch (SecurityException e) {
cores = DEVICEINFO_UNKNOWN;
}
catch (NullPointerException e) {
cores = DEVICEINFO_UNKNOWN;
}
return cores;
}
private static final FileFilter CPU_FILTER =
new FileFilter() {
@Override
public boolean accept(File pathname) {
String path = pathname.getName();
if (path.startsWith(
"cpu")) {
for (
int i =
3; i < path.length(); i++) {
if (path.charAt(i) <
'0' || path.charAt(i) >
'9') {
return false;
}
}
return true;
}
return false;
}
};
获取 CPU 核数
我们都知道,Linux 中的设备都是以文件的形式存在,CPU 也不例外,因此 CPU 的文件个数就等价与核数。
Android 的 CPU 设备文件位于 /sys/devices/system/cpu/ 目录,文件名的的格式为 cpu\d+。 1 root@generic_x86_64:/sys/devices/system/cpu # ls 2 cpu0 3 cpufreq 4 cpuidle 5 kernel_max 6 modalias 7 offline 8 online 9 possible 10 power 11 present 12 uevent
获取内存大小
如果 SDK 版本大于等于 JELLY_BEAN ,可以通过 ActivityManager 来获取内从大小。
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static long getTotalMemory(Context c) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
ActivityManager.MemoryInfo memInfo =
new ActivityManager.MemoryInfo();
ActivityManager am = (ActivityManager) c.getSystemService(Context.ACTIVITY_SERVICE);
am.getMemoryInfo(memInfo);
if (memInfo !=
null) {
return memInfo.totalMem;
}
else {
return DEVICEINFO_UNKNOWN;
}
}
else {
long totalMem = DEVICEINFO_UNKNOWN;
try {
FileInputStream stream =
new FileInputStream(
"/proc/meminfo");
try {
totalMem = parseFileForValue(
"MemTotal", stream);
totalMem *=
1024;
}
finally {
stream.close();
}
}
catch (IOException e) {
}
return totalMem;
}
}