天津做网站哪家好,儿童影楼网站设计,微网站 免费,建立网站商城建议参考链接#xff1a; https://www.jianshu.com/p/76d68d13c475 https://github.com/matthewYang92/Themis
获取CPU频率、核数的逻辑#xff0c;是通过文件操作实现的#xff0c;Android是基于Linux系统的#xff0c;所以该方式针对不同的手机都是可靠的操作方式。
RAM https://www.jianshu.com/p/76d68d13c475 https://github.com/matthewYang92/Themis
获取CPU频率、核数的逻辑是通过文件操作实现的Android是基于Linux系统的所以该方式针对不同的手机都是可靠的操作方式。
RAM public static final int DEVICEINFO_UNKNOWN -1;/*** Calculates the total RAM of the device through Android API or /proc/meminfo.** param c - Context object for current running activity.* return Total RAM that the device has, or DEVICEINFO_UNKNOWN -1 in the event of an error.*/TargetApi(Build.VERSION_CODES.JELLY_BEAN)public static long getTotalMemory(Context c) {// 内存是按照1024计算int thundred 1024;// memInfo.totalMem not supported in pre-Jelly Bean APIs.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 / (thundred * thundred);} else {return DEVICEINFO_UNKNOWN;}} else {// 低版本不做处理因此默认返回0return DEVICEINFO_UNKNOWN;}}
CPU频率 /*** Method for reading the clock speed of a CPU core on the device. Will read from either* {code /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq} or {code /proc/cpuinfo}.** return Clock speed of a core on the device, or -1 in the event of an error.*/public static ArrayListInteger getCPUFreqMHzs() {int maxFreq DEVICEINFO_UNKNOWN;int curFreq 0;ArrayListInteger arrayList new ArrayListInteger();try {int coreNum getNumberOfCPUCores();for (int i 0; i coreNum; i) {String filename /sys/devices/system/cpu/cpu i /cpufreq/cpuinfo_max_freq;File cpuInfoMaxFreqFile new File(filename);if (cpuInfoMaxFreqFile.exists() cpuInfoMaxFreqFile.canRead()) {byte[] buffer new byte[128];FileInputStream stream new FileInputStream(cpuInfoMaxFreqFile);try {stream.read(buffer);int endIndex 0;//Trim the first number out of the byte buffer.while (Character.isDigit(buffer[endIndex]) endIndex buffer.length) {endIndex;}String str new String(buffer, 0, endIndex);// 频率是按照1000计算curFreq Integer.parseInt(str) / 1000;arrayList.add(curFreq);} catch (NumberFormatException e) {} finally {stream.close();}}}if (maxFreq DEVICEINFO_UNKNOWN arrayList.size() 0) {FileInputStream stream new FileInputStream(/proc/cpuinfo);try {int freqBound parseFileForValue(cpu MHz, stream);curFreq freqBound;arrayList.add(curFreq);} finally {stream.close();}}} catch (IOException e) {}return arrayList;}/*** Reads the number of CPU cores from the first available information from* {code /sys/devices/system/cpu/possible}, {code /sys/devices/system/cpu/present},* then {code /sys/devices/system/cpu/}.** return Number of CPU cores in the phone, or DEVICEINFO_UKNOWN -1 in the event of an error.*/public static int getNumberOfCPUCores() {if (coreNumber ! DEVICEINFO_UNKNOWN) {return coreNumber;}if (Build.VERSION.SDK_INT Build.VERSION_CODES.GINGERBREAD_MR1) {// Gingerbread doesnt 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.coreNumber 1;return coreNumber;}int cores;try {cores getCoresFromFileInfo(/sys/devices/system/cpu/present);if (cores DEVICEINFO_UNKNOWN) {cores new File(/sys/devices/system/cpu/).listFiles(CPU_FILTER).length;;}} catch (SecurityException e) {cores DEVICEINFO_UNKNOWN;} catch (NullPointerException e) {cores DEVICEINFO_UNKNOWN;}coreNumber cores;return coreNumber;}/*** Tries to read file contents from the file location to determine the number of cores on device.* param fileLocation The location of the file with CPU information* return Number of CPU cores in the phone, or DEVICEINFO_UKNOWN -1 in the event of an error.*/private static int getCoresFromFileInfo(String fileLocation) {InputStream is null;try {is new FileInputStream(fileLocation);BufferedReader buf new BufferedReader(new InputStreamReader(is));String fileContents buf.readLine();buf.close();return getCoresFromFileString(fileContents);} catch (IOException e) {return DEVICEINFO_UNKNOWN;} finally {if (is ! null) {try {is.close();} catch (IOException e) {// Do nothing.}}}}/*** Converts from a CPU core information format to number of cores.* param str The CPU core information string, in the format of 0-N* return The number of cores represented by this string*/private static int getCoresFromFileString(String str) {if (str null || !str.matches(0-[\\d]$)) {return DEVICEINFO_UNKNOWN;}return Integer.valueOf(str.substring(2)) 1;}private static final FileFilter CPU_FILTER new FileFilter() {Overridepublic boolean accept(File pathname) {String path pathname.getName();//regex is slow, so checking char by char.if (path.startsWith(cpu)) {for (int i 3; i path.length(); i) {if (!Character.isDigit(path.charAt(i))) {return false;}}return true;}return false;}};/*** Helper method for reading values from system files, using a minimised buffer.** param textToMatch - Text in the system files to read for.* param stream - FileInputStream of the system file being read from.* return A numerical value following textToMatch in specified the system file.* -1 in the event of a failure.*/private static int parseFileForValue(String textToMatch, FileInputStream stream) {byte[] buffer new byte[1024];try {int length stream.read(buffer);for (int i 0; i length; i) {if (buffer[i] \n || i 0) {if (buffer[i] \n) i;for (int j i; j length; j) {int textIndex j - i;//Text doesnt match query at some point.if (buffer[j] ! textToMatch.charAt(textIndex)) {break;}//Text matches query here.if (textIndex textToMatch.length() - 1) {return extractValue(buffer, j);}}}}} catch (IOException e) {//Ignore any exceptions and fall through to return unknown value.} catch (NumberFormatException e) {}return DEVICEINFO_UNKNOWN;}/*** Helper method used by {link #parseFileForValue(String, FileInputStream) parseFileForValue}. Parses* the next available number after the match in the file being read and returns it as an integer.* param index - The index in the buffer array to begin looking.* return The next number on that line in the buffer, returned as an int. Returns* DEVICEINFO_UNKNOWN -1 in the event that no more numbers exist on the same line.*/private static int extractValue(byte[] buffer, int index) {while (index buffer.length buffer[index] ! \n) {if (Character.isDigit(buffer[index])) {int start index;index;while (index buffer.length Character.isDigit(buffer[index])) {index;}String str new String(buffer, 0, start, index - start);return Integer.parseInt(str);}index;}return DEVICEINFO_UNKNOWN;}系统版本
String systemVersion android.os.Build.VERSION.RELEASE;CPU核数 /*** Reads the number of CPU cores from the first available information from* {code /sys/devices/system/cpu/possible}, {code /sys/devices/system/cpu/present},* then {code /sys/devices/system/cpu/}.** return Number of CPU cores in the phone, or DEVICEINFO_UKNOWN -1 in the event of an error.*/public static int getNumberOfCPUCores() {if (coreNumber ! DEVICEINFO_UNKNOWN) {return coreNumber;}if (Build.VERSION.SDK_INT Build.VERSION_CODES.GINGERBREAD_MR1) {// Gingerbread doesnt 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.coreNumber 1;return coreNumber;}int cores;try {cores getCoresFromFileInfo(/sys/devices/system/cpu/present);if (cores DEVICEINFO_UNKNOWN) {cores new File(/sys/devices/system/cpu/).listFiles(CPU_FILTER).length;;}} catch (SecurityException e) {cores DEVICEINFO_UNKNOWN;} catch (NullPointerException e) {cores DEVICEINFO_UNKNOWN;}coreNumber cores;return coreNumber;}