Android 如何以编程方式获取CPU使用率(以内核频率)

Android 如何以编程方式获取CPU使用率(以内核频率),android,kotlin,Android,Kotlin,我想了解(所有内核)CPU使用率的方法 目前我无法获得“/proc/stat”的信息(自API 27起) 所以我想用频率或类似的方式获取信息: 使用前面的所有答案,我接近我想要的,但还不够 主功能 private fun ReadCpu3():String{ val sb = StringBuffer(); sb.append("abi: ").append(Build.CPU_ABI).append("\n"); if (File("/p

我想了解(所有内核)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使用率的近似值以及准确程度。

您应该看到。 基本上,您希望使用
RandomAccessFile
类来解析
/proc/stat
文件

编辑:上述解决方案不适用于Android O及以上版本。Reddit用户fornwall就此向谷歌提交了一份报告,并获得:

状态:无法修复(预期行为)感谢您提交此错误 报告

删除/proc/stat是故意的/过程/统计泄漏侧 有关应用程序的频道信息,这些应用程序可能允许 应用程序来推断设备上其他应用程序的状态。 看见 比如说

EDIT2:我准备了一个示例(不使用CpuStasCollector)

包com.k3.myapplication;
导入androidx.appcompat.app.appcompat活动;
导入android.os.Bundle;
导入android.widget.TextView;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileFilter;
导入java.io.FileInputStream;
导入java.io.InputStreamReader;
导入java.util.regex.Pattern;
公共类MainActivity扩展了AppCompatActivity{
私有静态int slatcpucorecount=-1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView TextView=findviewbyd(R.id.txtv);
textView.setText(“”);
对于(int i=0;i=1){
// キャッシュさせる
返回slastcpucorecocount;
}
试一试{
//获取包含CPU信息的目录
final File dir=新文件(“/sys/devices/system/cpu/”);
//筛选以仅列出我们关心的设备
最终文件[]文件=dir.listFiles(新文件过滤器(){
公共布尔接受(文件路径名){
//检查文件名是否为“cpu”,后跟一位数字
if(Pattern.matches(“cpu[0-9]”,pathname.getName()){
返回true;
}
返回false;
}
});
//返回核心数(虚拟CPU设备)
slastcpucorecont=files.length;
}捕获(例外e){
sLastCpuCoreCount=Runtime.getRuntime().availableProcessors();
}
返回slastcpucorecocount;
}
}

当您想询问kotlin时,为什么要用java标记。我认为kotlin遵循类似的命名约定:变量名应该以camelCase开头。大写字母表示类名。另请注意:垂直间距(空行)的目的是对事物进行分组。你不能在这里或那里抛出空行,因为你可以。想象一下,如果你的代码被编写出来会是什么感觉。。。好像你在乎它@GhostCat谢谢你的建议,我更正了:)可能是@Distrigence的重复,但我只需要CPU负载,我在这个awnser中返回了一个完整的信息文本视图,您能告诉我如何使用此代码作为基础来获得CPU负载吗?@WhySoBizarreCode然后请附上其返回内容的示例。出于安全原因,您不能在andorid API27或更高版本中使用/proc/stat文件。瞧,那太好了。我会继续挖掘。但是有一些应用程序显示了cpu的使用情况,所以我认为他们正在使用频率或其他方式来实现这一点。他们是否运行Android O+?因为如果他们不运行,这可能是他们运行的原因