我想检测Android设备硬件是否足以顺利运行应用程序的某些功能。
到目前为止我的实施,
检查
结果: * Nexus 5: CPU 使用率 => 9.243698 内存可用百分比 => 33.6358 % 最大 CPU 频率 MHz => 1440
Nexus 5x: CPU 使用率 => 12.2XXX 内存可用百分比 => 47.XXXXX %
摩托G2: CPU 使用率 => 44.XXXX 内存可用百分比 => 10.XXXX %
我的流程在 Nexus 5x 中运行得很好,但在 Nexus 5、moto g 和 moto e 中则不然。
//onCreate
Log.d(LOGTAG, "Cpu Info" + Utility.getCpuInfo());
Log.d(LOGTAG, "Memory Info" + Utility.getMemoryInfo());
Log.d(LOGTAG, "Memory Percent Avail" + Utility.getMemoryPercentAvail(getContext()));
Log.d(LOGTAG, "CPU Usage" + Utility.readCPUUsage());
Log.d(LOGTAG, "Max CPU Freq MHz" + Utility.getMaxCPUFreqMHz());
// Get Memory Percent Avail
public static double getMemoryPercentAvail(Context context) {
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
ActivityManager activityManager = (ActivityManager)
context.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
double availableMegs = mi.availMem / 1048576L;
//Percentage can be calculated for API 16+
double memoryAvail = (double) mi.availMem / (double) mi.totalMem;
return memoryAvail * 100;
}
// Read CPU Usage
public static float readCPUUsage() {
try {
RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
String load = reader.readLine();
String[] toks = load.split(" +"); // Split on one or more spaces
long idle1 = Long.parseLong(toks[4]);
long cpu1 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[5])
+ Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);
try {
Thread.sleep(360);
} catch (Exception e) {}
reader.seek(0);
load = reader.readLine();
reader.close();
toks = load.split(" +");
long idle2 = Long.parseLong(toks[4]);
long cpu2 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[5])
+ Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);
return ((float)(cpu2 - cpu1) / ((cpu2 + idle2) - (cpu1 + idle1))) * 100;
} catch (IOException ex) {
ex.printStackTrace();
}
return 0;
}
// Get Max CPU Freq In MHz
public static int getMaxCPUFreqMHz() {
int maxFreq = -1;
try {
RandomAccessFile reader = new RandomAccessFile( "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state", "r" );
boolean done = false;
while ( ! done ) {
String line = reader.readLine();
if ( null == line ) {
done = true;
break;
}
String[] splits = line.split( "\\s+" );
assert ( splits.length == 2 );
int timeInState = Integer.parseInt( splits[1] );
if ( timeInState > 0 ) {
int freq = Integer.parseInt( splits[0] ) / 1000;
if ( freq > maxFreq ) {
maxFreq = freq;
}
}
}
} catch ( IOException ex ) {
ex.printStackTrace();
}
return maxFreq;
}
我建议您看一下 Telegram Messenger 按性能将设备分为 3 个类别的方式这里。他们使用 CPU 数量、最大 CPU 频率、内存类别和 Android 版本的组合来决定设备。由于 Telegram 安装在超过 10 亿台设备上,我认为他们的方法应该是可靠的。
还有 Jetpack 的性能库,它仅适用于运行 Android 11 及更高版本的设备,主要用于媒体用例。
您也可以从Facebook的年级库中获得一些灵感,但请记住,他们的数据已经过时,并且已经很长时间没有更新了。