获取关于 CPU 的人类可读信息
Getting human readable info about CPU
我正在尝试获取有关 smartphone 的 CPU 的信息。
我可以通过显示 /proc/cpuinfo 文件得到它。然而,它的输出很差且不可读。
我想从 "lscpu" 命令中获得类似的输出,但是当我从我的应用程序执行命令 "lscpu" 时,我没有执行该操作的权限(但是我可以从我的 phone 上的 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.输出:
结果
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,权限被拒绝
但是,我的 phone 上有应用程序 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")
通过所有这些,我创建了漂亮的、人类可读的输出。我想这个话题可以关闭了。
最好的问候!
我正在尝试获取有关 smartphone 的 CPU 的信息。 我可以通过显示 /proc/cpuinfo 文件得到它。然而,它的输出很差且不可读。 我想从 "lscpu" 命令中获得类似的输出,但是当我从我的应用程序执行命令 "lscpu" 时,我没有执行该操作的权限(但是我可以从我的 phone 上的 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.输出: 结果
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,权限被拒绝
但是,我的 phone 上有应用程序 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")
通过所有这些,我创建了漂亮的、人类可读的输出。我想这个话题可以关闭了。 最好的问候!