获取 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; }}
MODEL 应该就是吧
Logd("build","BOARD:" + BuildBOARD);
Logd("build","BOOTLOADER:" + BuildBOOTLOADER);
Logd("build","BRAND:" + BuildBRAND);
Logd("build","CPU_ABI:" + BuildCPU_ABI);
Logd("build","CPU_ABI2:" + BuildCPU_ABI2);
Logd("build","DEVICE:" + BuildDEVICE);
Logd("build","DISPLAY:" + BuildDISPLAY);
Logd("build","FINGERPRINT:" + BuildFINGERPRINT);
Logd("build","HARDWARE:" + BuildHARDWARE);
Logd("build","HOST:" + BuildHOST);
Logd("build","ID:" + BuildID);
Logd("build","MANUFACTURER:" + BuildMANUFACTURER);
Logd("build","MODEL:" + BuildMODEL);
Logd("build","PRODUCT:" + BuildPRODUCT);
Logd("build","RADIO:" + BuildRADIO);
Logd("build","TAGS:" + BuildTAGS);
Logd("build","TIME:" + BuildTIME);
Logd("build","TYPE:" + BuildTYPE);
Logd("build","UNKNOWN:" + BuildUNKNOWN);
Logd("build","USER:" + BuildUSER);
Logd("build","VERSIONCODENAME:" + BuildVERSIONCODENAME);
Logd("build","VERSIONINCREMENTAL:" + BuildVERSIONINCREMENTAL);
Logd("build","VERSIONRELEASE:" + BuildVERSIONRELEASE);
Logd("build","VERSIONSDK:" + BuildVERSIONSDK);
Logd("build","VERSIONSDK_INT:" + BuildVERSIONSDK_INT);
因为Android本质上是linux系统,所以关系硬件相关的信息实际上是用文件表示的
CPU相关信息放在 /sys/devices/system/cpu/ 这个路径下,
要知道cpu的核数只需要查看这个路径中的文件即可
如果CPU是双核的,则 /sys/devices/system/cpu/ 路径下有两个子文件夹 cpu0 和 cpu1
如果CPU是四核的,则 /sys/devices/system/cpu/ 路径下有四个子文件夹 cpu0 和 cpu1 和 cpu2 和 cpu3
以此类推
这个是抄来的
命令中的"应用包名"应该替换为你需要查询的包名
执行命令后, 在输出的内容中, 第二项即应用的进程名, 例如:
那么 22411 即为该应用当前的pid
其中的"应用的pid"为上一步获取到的pid
执行命令后, 命令行工具即会打印应用运行信息
命令中的"应用包名"应该替换为你需要查询的包名
命令执行后过段时间即会打印内存占用大小
以上就是关于如何获取 Android 设备的CPU核数,时钟频率以及内存大小全部的内容,包括:如何获取 Android 设备的CPU核数,时钟频率以及内存大小、Android开发中如何获取android系统芯片型号、android获取cpu核数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)