如何获取 Android 设备的CPU核数,时钟频率以及内存大小

如何获取 Android 设备的CPU核数,时钟频率以及内存大小,第1张

获取 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核数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9451327.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存