获取 CPU 核数Linux 中的设备都是以文件的形式存在,CPU 也不例外,因此 CPU 的文件个数就等价与核数。Android 的 CPU 设备文件位于/sys/devices/system/cpu/目录,文件名的的格式为cpu\d+。root@generic_x86_64:/sys/devices/system/cpu # ls cpu0 cpufreqcpuidlekernel_maxmodaliasofflineonlinepossiblepowerpresentuevent统计一下文件个数便可以获得 CPU 核数。public static int getNumberOfCPUCores() { if (BuildVERSIONSDK_INT <= BuildVERSION_CODESGINGERBREAD_MR1) { // Gingerbread doesn't support giving a single application access to both cores, but a // handful of devices (Atrix 4G and Droid X2 for example) were released with a dual-core // chipset and Gingerbread; that can let an app in the background run without impacting // the foreground application But for our purposes, it makes them single core 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 = pathnamegetName(); //regex is slow, so checking char by char if (pathstartsWith("cpu")) { for (int i = 3; i < pathlength(); i++) { if (pathcharAt(i) < '0' pathcharAt(i) > '9') { return false; } } return true; } return false; }};获取时钟频率获取时钟频率需要读取系统文件 -/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq或者/proc/cpuinfo。 Android 模拟器中并没有cpuinfo_max_freq文件,因此只能读取/proc/cpuinfo。/proc/cpuinfo包含了很多 cpu 数据。processor : 0vendor_id : GenuineIntelcpu family : 6model : 70model name : Intel(R) Core(TM) i7-4770HQ CPU @ 220GHzstepping : 1cpu MHz : 0000cache size : 1024 KBfdiv_bug : nohlt_bug : nof00f_bug : nocoma_bug : nofpu : yesfpu_exception : yescpuid level : 4wp : yes代码如下:public static int getCPUMaxFreqKHz() { int maxFreq = DEVICEINFO_UNKNOWN; try { for (int i = 0; i < getNumberOfCPUCores(); i++) { String filename = "/sys/devices/system/cpu/cpu" + i + "/cpufreq/cpuinfo_max_freq"; File cpuInfoMaxFreqFile = new File(filename); if (cpuInfoMaxFreqFileexists()) { byte[] buffer = new byte[128]; FileInputStream stream = new FileInputStream(cpuInfoMaxFreqFile); try { streamread(buffer); int endIndex = 0; //Trim the first number out of the byte buffer while (buffer[endIndex] >= '0' && buffer[endIndex] <= '9' && endIndex < bufferlength) endIndex++; String str = new String(buffer, 0, endIndex); Integer freqBound = IntegerparseInt(str); if (freqBound > maxFreq) maxFreq = freqBound; } catch (NumberFormatException e) { //Fall through and use /proc/cpuinfo } finally { streamclose(); } } } if (maxFreq == DEVICEINFO_UNKNOWN) { FileInputStream stream = new FileInputStream("/proc/cpuinfo"); try { int freqBound = parseFileForValue("cpu MHz", stream); freqBound = 1000; //MHz -> kHz if (freqBound > maxFreq) maxFreq = freqBound; } finally { streamclose(); } } } catch (IOException e) { maxFreq = DEVICEINFO_UNKNOWN; //Fall through and return unknown } return maxFreq;}获取内存大小如果 SDK 版本大于等于JELLY_BEAN,可以通过ActivityManager来获取内从大小。ActivityManagerMemoryInfo memInfo = new ActivityManagerMemoryInfo();ActivityManager am = (ActivityManager) cgetSystemService(ContextACTIVITY_SERVICE);amgetMemoryInfo(memInfo);如果版本低于JELLY_BEAN,则只能读取系统文件了。FileInputStream stream = new FileInputStream("/proc/meminfo");totalMem = parseFileForValue("MemTotal", stream);完整代码如下:@TargetApi(BuildVERSION_CODESJELLY_BEAN)public static long getTotalMemory(Context c) { // memInfototalMem not supported in pre-Jelly Bean APIs if (BuildVERSIONSDK_INT >= BuildVERSION_CODESJELLY_BEAN) { ActivityManagerMemoryInfo memInfo = new ActivityManagerMemoryInfo(); ActivityManager am = (ActivityManager) cgetSystemService(ContextACTIVITY_SERVICE); amgetMemoryInfo(memInfo); if (memInfo != null) { return memInfototalMem; } else { return DEVICEINFO_UNKNOWN; } } else { long totalMem = DEVICEINFO_UNKNOWN; try { FileInputStream stream = new FileInputStream("/proc/meminfo"); try { totalMem = parseFileForValue("MemTotal", stream); totalMem = 1024; } finally { streamclose(); } } catch (IOException e) { } return totalMem; }}
以上就是关于如何获取 Android 设备的CPU核数,时钟频率以及内存大小全部的内容,包括:如何获取 Android 设备的CPU核数,时钟频率以及内存大小、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)