我想了解所有内核的CPU使用率方法
目前我无法获取“ / proc / stat”的信息(自API 27起)
所以我想以频率或类似频率获取信息
使用所有先前的答案我都接近我想要的,但还不够
主要功能
private fun ReadCpu3():String{
val sb = StringBuffer();
sb.append("abi: ").append(Build.CPU_ABI).append("\n");
if (File("/proc/cpuinfo").exists()) {
try {
//val br = BufferedReader(FileReader(File("/proc/cpuinfo")));
val file = File("/proc/cpuinfo")
file.bufferedReader().forEachLine {
sb.append(it+"\n");
}
} catch (e: IOException) {
e.printStackTrace();
}
}
return sb.toString();
}
我的结果
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 45
model name : Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz
stepping : 6
microcode : 1561
cpu MHz : 600.000
cache size : 20480 KB
physical id : 0
siblings : 16
core id : 0
cpu cores : 8
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt
bogomips : 4399.93
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
所以我得到了CPU的所有信息,但没有实际的负载或使用情况。我不知道是否可以通过当前信息来了解CPU的使用情况以及精确度。
答案 0 :(得分:0)
您应该看到this SO post here。
基本上,您想使用RandomAccessFile
类来解析/proc/stat
文件。
编辑:以上解决方案不适用于Android O及更高版本。 See this link for more information。 Reddit用户fornwall就此向Google提交了报告,并得到:
状态:无法解决(预期行为)感谢您提交此错误 报告。
故意删除/ proc / stat。 / proc / stat泄漏的一面 有关应用程序的通道信息,可能允许一个 应用程序以推断设备上其他应用程序的状态。 看到 https://www.cl.cam.ac.uk/~lmrs2/publications/interrupts_pets16.pdf 例如。
EDIT2:我已经准备了一个示例(不使用CpuStasCollector)
package com.k3.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.regex.Pattern;
public class MainActivity extends AppCompatActivity {
private static int sLastCpuCoreCount = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.txtv);
textView.setText("");
for (int i = 0; i < calcCpuCoreCount(); i++) {
textView.append(takeCurrentCpuFreq(i) +"\n");
}
}
private static int readIntegerFile(String filePath) {
try {
final BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(filePath)), 1000);
final String line = reader.readLine();
reader.close();
return Integer.parseInt(line);
} catch (Exception e) {
return 0;
}
}
private static int takeCurrentCpuFreq(int coreIndex) {
return readIntegerFile("/sys/devices/system/cpu/cpu" + coreIndex + "/cpufreq/scaling_cur_freq");
}
public static int calcCpuCoreCount() {
if (sLastCpuCoreCount >= 1) {
// キャッシュさせる
return sLastCpuCoreCount;
}
try {
// Get directory containing CPU info
final File dir = new File("/sys/devices/system/cpu/");
// Filter to only list the devices we care about
final File[] files = dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
//Check if filename is "cpu", followed by a single digit number
if (Pattern.matches("cpu[0-9]", pathname.getName())) {
return true;
}
return false;
}
});
// Return the number of cores (virtual CPU devices)
sLastCpuCoreCount = files.length;
} catch(Exception e) {
sLastCpuCoreCount = Runtime.getRuntime().availableProcessors();
}
return sLastCpuCoreCount;
}
}