我正在尝试获取有关智能手机CPU的信息。
我可以从显示/ proc / cpuinfo文件中得到。但是,其输出很差且无法读取。
我希望有类似“ lscpu”命令的输出,但是当我从应用程序执行命令“ lscpu”时,我没有这样做的权限(但是我可以从手机上的Termux控制台执行此操作,并且输出是可读的)。
您有什么想法让人们更容易理解吗?

这是查看/ proc / cpuinfo文件的代码:

static class CMDExecute {
    synchronized String run(String[] cmd)
            throws IOException {
        String result = "";

        try {
            ProcessBuilder builder = new ProcessBuilder(cmd);
            builder.redirectErrorStream(true);
            Process process = builder.start();
            InputStream in = process.getInputStream();
            byte[] re = new byte[1024];
            while (in.read(re) != -1) {
                System.out.println(new String(re));
                result = result + new String(re);
            }
            in.close();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return result;
    }
}

private static StringBuffer buffer;

public static void fetch_cpu_info() {
    String result = null;
    CMDExecute cmdexe = new CMDExecute();
    try {
        String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
        result = cmdexe.run(args);
        System.out.println("RESULT\n" + result);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}


及其输出:

I / System.out:
结果

processor   : 0
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part    : 0xd03
CPU revision    : 4
processor   : 1
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part    : 0xd03
CPU revision    : 4
processor   : 2
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part    : 0xd03
CPU revision    : 4
processor   : 3
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt lpae evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part    : 0xd03
CPU revision    : 4


如您所见,它的输出非常糟糕。当我尝试从我的代码中执行“ lscpu”命令时,仅更改一行:

        String[] args = {"/system/bin/cat", "/proc/cpuinfo"};




        String[] args = {"lscpu"};


我收到错误消息:

W / System.err:java.io.IOException:无法运行程序“ lscpu”:错误= 13,权限被拒绝

但是,我的手机上有应用程序Termux。它是Shell控制台,我不知道为什么,但是我可以在此控制台中执行“ lscpu”(我无法从应用程序代码中获取)。看一下这个:

lscpuoutput

我想将输出输出到我的应用程序中。您是否有任何想法如何获得有关CPU信息的良好可读性输出?

我将不胜感激!

最佳答案

好。我大部分时间都能解决问题。只关注/ proc / cpuinfo不是一个好主意。
相反,我设法获得了如下有趣的硬件信息:

获取智能手机制造商和型号。在我的情况下,输出为:“ samsung SM-J730F”:

    String manufacturer = Build.MANUFACTURER;
    String model = Build.MODEL;


该命令显示CPU内核数:

    Runtime.getRuntime().availableProcessors()


从该文件中,您可以获取CPU频率。请记住使用.trim(),因为此文件可能包含空格字符,就像我的情况一样,并且在将结果转换为float以便进行进一步操作时遇到问题:

   ("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq").trim()


包含在线CPU数量的文件:

   /sys/devices/system/cpu/online


包含离线CPU数量的文件。如果所有CPU都在线,则此文件似乎为空,但可能包含空格字符:

  ("/sys/devices/system/cpu/offline").trim()


获取架构的命令:

System.getProperty("os.arch")


通过所有这些,我创建了很好的,人类可读的输出。我想这个话题可以关闭。
最好的祝福!

10-04 17:48