如何检测 Android 设备是低端还是高端(如 moto e、moto g 或 Nexus 5x)

问题描述 投票:0回答:1

我想检测Android设备硬件是否足以顺利运行应用程序的某些功能。

到目前为止我的实施,

检查

  • 可用内存百分比。
  • CPU 使用率。
  • 最大 CPU 频率 MHz。

结果: * 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;
}
android performance android-memory
1个回答
0
投票

我建议您看一下 Telegram Messenger 按性能将设备分为 3 个类别的方式这里。他们使用 CPU 数量、最大 CPU 频率、内存类别和 Android 版本的组合来决定设备。由于 Telegram 安装在超过 10 亿台设备上,我认为他们的方法应该是可靠的。

还有 Jetpack 的性能库,它仅适用于运行 Android 11 及更高版本的设备,主要用于媒体用例。

您也可以从Facebook的年级库中获得一些灵感,但请记住,他们的数据已经过时,并且已经很长时间没有更新了。

© www.soinside.com 2019 - 2024. All rights reserved.