Android工具类之CPU信息获取

本文详细探讨了在Android平台上如何获取设备的CPU信息,包括CPU使用率、核心数、频率等关键数据,通过实例代码展示了如何利用Java或JNI实现这一功能,对于Android开发者优化应用性能具有实用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class CpuUtils {

    private static final String TAG = CpuUtils.class.getSimpleName();
    public static final String AARCH_64 = "aarch64";
    public static final String STRING_OX = "0X";
    public static final String STRING_0x = "0x";

    /**
     * It's also good way to get cpu core number
     */
    public static int getCPUCoreNum() {
        return Runtime.getRuntime().availableProcessors();
    }

    /**
     * 64 系统判断
     *
     * @return
     */
    public static boolean isCpu64() {
        boolean result = false;

        String mProcessor = null;
        try {
            mProcessor = getFieldFromCpuinfo("Processor");
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (mProcessor != null) {
            Log.d(TAG, "isCPU64 mProcessor = " + mProcessor);
            if (mProcessor.contains(AARCH_64)) {
                result = true;
            }
        }
        return result;
    }

    private static long cpuMaxFreq = 0;
    private static long cpuMinFreq = 0;
    /**
     * CPU 最大频率
     *
     * @return
     */
    public static long getCpuMaxFreq() {
        if(cpuMaxFreq != 0) {
            return cpuMaxFreq;
        }

        long result = 0L;
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"));
            if ((line = br.readLine()) != null) {
                result = Long.parseLong(line);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        cpuMaxFreq = result;
        return result;
    }

    /**
     * CPU 最小频率
     *
     * @return
     */
    public static long getCpuMinFreq() {
        if(cpuMinFreq != 0) {
            return cpuMinFreq;
        }
        long result = 0L;
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq"));
            if ((line = br.readLine()) != null) {
                result = Long.parseLong(line);
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        cpuMinFreq = result;
        return result;
    }

    /**
     * 可调节 CPU 频率档位
     *
     * @return
     */
    public static String getCpuAvailableFrequenciesSimple() {
        String result = null;
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"));
            if ((line = br.readLine()) != null) {
                result = line;
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 可调节 CPU 频率档位
     *
     * @return
     */
    public static List<Long> getCpuAvailableFrequencies() {
        List<Long> result = new ArrayList<>();
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"));
            if ((line = br.readLine()) != null) {
                String[] list = line.split("\\s+");
                for (String value : list) {
                    long freq = Long.parseLong(value);
                    result.add(freq);
                }
            }


            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 可调节 CPU 频率档位
     *
     * @return
     */
    public static List<Integer> getCpuFreqList() {
        List<Integer> result = new ArrayList<>();
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"));
            if ((line = br.readLine()) != null) {
                String[] list = line.split("\\s+");
                for (String value : list) {
                    result.add(Integer.parseInt(value));
                }
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static String[] getCpuAFreqList() {
        String[] result = null;
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies"));
            if ((line = br.readLine()) != null) {
                result = line.split("\\s+");
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * CPU 调频策略
     *
     * @return
     */
    public static String getCpuGovernor() {
        String result = null;
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"));
            if ((line = br.readLine()) != null) {
                result = line;
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * CPU 支持的调频策略
     *
     * @return
     */
    public static String getCpuAvailableGovernorsSimple() {
        String result = null;
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors"));
            if ((line = br.readLine()) != null) {
                result = line;
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static String[] getCpuAvailableGovernorsList() {
        String[] result = null;
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors"));
            if ((line = br.readLine()) != null) {
                result = line.split("\\s+");
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * CPU 支持的调频策略
     *
     * @return
     */
    public static List<String> getCpuAvailableGovernors() {
        List<String> result = new ArrayList<>();
        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors"));
            if ((line = br.readLine()) != null) {
                String[] list = line.split("\\s+");
                for (String value : list) {
                    result.add(value);
                }
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * CPU 场景配置文件
     *
     * @return
     */
    public static List<String> getCpuSceneInfo() {
        List<String> result = new ArrayList<>();
        BufferedReader br = null;
        try {
            String line;
            br = new BufferedReader(new FileReader("/system/vendor/etc/perfservscntbl.txt"));
            result.add("/system/vendor/etc/perfservscntbl.txt");
            while ((line = br.readLine()) != null) {
                result.add(line);
            }

            result.add("/system/vendor/etc/perf_whitelist_cfg.xml");
            br = new BufferedReader(new FileReader("/system/vendor/etc/perf_whitelist_cfg.xml"));
            while ((line = br.readLine()) != null) {
                result.add(line);
            }

            br.close();
        } catch (FileNotFoundException e) {
            result.add(e.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

    /**
     * CPU 电压
     *
     * @return
     */
    public static List<String> getCpuVoltage() {
        List<String> result = new ArrayList<>();
        BufferedReader br = null;
        try {
            String line;
            br = new BufferedReader(new FileReader("/proc/cpufreq/MT_CPU_DVFS_LL/cpufreq_oppidx"));
            while ((line = br.readLine()) != null) {
                result.add(line);
            }

            br.close();
        } catch (FileNotFoundException e) {
            result.add(e.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

    public static String getArchitecture() {
        String result = null;

        try {
            String mCpuPart = getFieldFromCpuinfo("CPU part");
            Log.d(TAG, "mCpuPart = " + mCpuPart);

            if (mCpuPart.startsWith(STRING_0x) || mCpuPart.startsWith(STRING_OX)) {
                mCpuPart = mCpuPart.substring(2);
            }

            int mCpuPartId = Integer.valueOf(mCpuPart, 16);

            switch (mCpuPartId) {
                case 0x920:
                    result = "ARM" + " ARM920T";
                    break;
                case 0x926:
                    result = "ARM" + " ARM926EJ";
                    break;
                case 0xB36:
                    result = "ARM" + " ARM1136";
                    break;
                case 0xB56:
                    result = "ARM" + " ARM1156";
                    break;
                case 0xB76:
                    result = "ARM" + " ARM1176";
                    break;
                case 0xC05:
                    result = "ARM" + " Cortex-A5";
                    break;
                case 0xC07:
                    result = "ARM" + " Cortex-A7";
                    break;
                case 0xC08:
                    result = "ARM" + " Cortex-A8";
                    break;
                case 0xC09:
                    result = "ARM" + " Cortex-A9";
                    break;
                case 0xC0C:
                    result = "ARM" + " Cortex-A12";
                    break;
                case 0xC0F:
                    result = "ARM" + " Cortex-A15";
                    break;
                case 0xC0E:
                    result = "ARM" + " Cortex-A17";
                    break;
                case 0xc14:
                    result = "ARM" + " Cortex-R4";
                    break;
                case 0xc15:
                    result = "ARM" + " Cortex-R5";
                    break;
                case 0xc20:
                    result = "ARM" + " Cortex-M0";
                    break;
                case 0xc21:
                    result = "ARM" + " Cortex-M1";
                    break;
                case 0xc23:
                    result = "ARM" + " Cortex-M3";
                    break;
                case 0xc24:
                    result = "ARM" + " Cortex-M4";
                    break;
                case 0xD03:
                    result = "ARM" + " Cortex-A53";
                    break;
                case 0xD07:
                    result = "ARM" + " Cortex-A57";
                    break;
                case 0x8:
                    result = "NVIDIA" + " Tegra K1";
                    break;
                case 0xf:
                    result = "Qualcomm" + " Snapdragon S1/S2";
                    break;
                case 0x2d:
                    result = "Qualcomm" + " Snapdragon S2/S3";
                    break;
                case 0x4d:
                    result = "Qualcomm" + " Snapdragon S4";
                    break;
                case 0x6F:
                    result = "Qualcomm" + " Snapdragon 200/400/600/800";
                    break;
                default:
                    result = "0x" + Integer.toHexString(mCpuPartId);
                    break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

    public static List<String> getCpuInfo() {
        List<String> result = new ArrayList<>();

        try {
            String line;
            BufferedReader br = new BufferedReader(new FileReader("/proc/cpuinfo"));
            while ((line = br.readLine()) != null) {
                result.add(line);
            }
            br.close();
        } catch (FileNotFoundException e) {
            result.add(e.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }

    /** /proc/cpuinfo

        processor       : 0
        Processor       : AArch64 Processor rev 4 (aarch64)
        model name      : AArch64 Processor rev 4 (aarch64)
        BogoMIPS        : 26.00
        Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
        CPU implementer : 0x41
        CPU architecture: 8
        CPU variant     : 0x0
        CPU part        : 0xd03
        CPU revision    : 4
    */
    public static String getFieldFromCpuinfo(String field) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("/proc/cpuinfo"));
        Pattern p = Pattern.compile(field + "\\s*:\\s*(.*)");

        try {
            String line;
            while ((line = br.readLine()) != null) {
                Matcher m = p.matcher(line);
                if (m.matches()) {
                    return m.group(1);
                }
            }
        } finally {
            br.close();
        }

        return null;
    }

    /**
     * 获取 CPU 名称
     *
     * @return
     */
    public static String getProcessor() {
        if(!TextUtils.isEmpty(processInfo)) {
            return processInfo;
        }
        String result = null;

        try {
            result = getFieldFromCpuinfo("Processor");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值