如何读取CPU“;统计数据“;用Java从安卓手机下载?

如何读取CPU“;统计数据“;用Java从安卓手机下载?,java,android,Java,Android,我试图通过核心计算出CPU的使用率,如果可能的话,可能是temp,并且通常计算出我可以从CPU读取什么 我已经做了一些搜索,我有一些返回核心数的代码(请参阅)。现在,我正试图从这个链接()中找出如何使用它来获取内核的CPU使用率 唯一的问题是我对Java/Android有点陌生,所以我很难理解评论者想说什么。有一条评论说,您应该更改idle1和cpu1上的分隔符……我对idle2和cpu2也这样做吗?任何帮助都将不胜感激,因此提前感谢您 现在我有了一个更好的方法来理解我在做什么,但是我的4核测试

我试图通过核心计算出CPU的使用率,如果可能的话,可能是temp,并且通常计算出我可以从CPU读取什么

我已经做了一些搜索,我有一些返回核心数的代码(请参阅)。现在,我正试图从这个链接()中找出如何使用它来获取内核的CPU使用率

唯一的问题是我对Java/Android有点陌生,所以我很难理解评论者想说什么。有一条评论说,您应该更改idle1和cpu1上的分隔符……我对idle2和cpu2也这样做吗?任何帮助都将不胜感激,因此提前感谢您

现在我有了一个更好的方法来理解我在做什么,但是我的4核测试板上的2-4核都是0。有时,当我启动应用程序时,core 2的值大于0,但在后续运行时(应用程序每秒更新一次值),它会返回到0。这是我目前拥有的代码,非常感谢

    public double readUsage(int corenum) {
    int j=0;
    int coreVal = getNumCores();
    String[] toks;
    long idle1;
    long cpu1;
    long idle2;
    long cpu2;

    try {           
            RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
            String load = reader.readLine();
            reader.seek(0);
            while (j <= corenum){
                load = reader.readLine();
                j++;
            }
            j=0;
            toks = load.split(" ");

            if (corenum == 0) {
                idle1 = Long.parseLong(toks[5]);
                cpu1 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
                      + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);
            }

            else {
                idle1 = Long.parseLong(toks[4]);
                cpu1 = Long.parseLong(toks[1]) + Long.parseLong(toks[2]) + Long.parseLong(toks[3])
                        + Long.parseLong(toks[5]) + Long.parseLong(toks[6]) + Long.parseLong(toks[7]);
            }   

            try {
                 Thread.sleep(100);
            } catch (Exception e) {}

            reader.seek(0);
            while (j <= corenum){
                load = reader.readLine();
                j++;
            }
            j=0;
            reader.close();
            toks = load.split(" ");

            if (corenum == 0) {
                idle2 = Long.parseLong(toks[5]);
                cpu2 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
                      + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);
            }

            else {
                idle2 = Long.parseLong(toks[4]);
                cpu2 = Long.parseLong(toks[1]) + Long.parseLong(toks[2]) + Long.parseLong(toks[3])
                        + Long.parseLong(toks[5]) + Long.parseLong(toks[6]) + Long.parseLong(toks[7]);
            }

           return (double)(cpu2 - cpu1) / ((cpu2 + idle2) - (cpu1 + idle1));

    } catch (IOException ex) {
        ex.printStackTrace();
    }

    return 9999999;
}
public双读用法(int-corenum){
int j=0;
int coreVal=getNumCores();
字符串[]toks;
长时间闲置1;
长cpu1;
长时间闲置2;
长cpu2;
试试{
RandomAccessFile reader=新的RandomAccessFile(“/proc/stat”,“r”);
字符串加载=reader.readLine();
reader.seek(0);

而(j您可以使用此答案中的代码:

如注释中所述,您可以跳过第一行以获取每个核心的数据

根据下面的注释,您可以阅读文件的每一行并打印用法,然后按照提供的链接拆分这些行:

public void printCpuUsages()
{
    try
    {
        RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
        String load = reader.readLine();
        while (load != null)
        {
            Log.d("CPU", "CPU usage: " + load);
            load = reader.readLine();
        }
    }
    catch (IOException ex)
    {
        ex.printStackTrace();
    }
}

尽管答案似乎是正确的,我还是创建了一个小解析器来帮助人们提取“proc/stat”的信息

公共类Cpu{
私有字符串名称=”;
专用长cpu_用户=0;
专用长cpu_niced=0;
专用长cpu_系统=0;
专用长cpu_空闲=0;
专用长cpu_iowait=0;
专用长cpu_irq=0;
专用长cpu_softirqs=0;
公共Cpu(字符串名称、长Cpu\u用户、长Cpu\u niced、长Cpu\u系统、长Cpu\u空闲、长Cpu\u iowait、长Cpu\u irq、长Cpu\u软件irq){
this.name=名称;
this.cpu\u user=cpu\u user;
this.cpu\u niced=cpu\u niced;
this.cpu\u system=cpu\u system;
this.cpu\u idle=cpu\u idle;
this.cpu\u iowait=cpu\u iowait;
this.cpu\u irq=cpu\u irq;
this.cpu_softirqs=cpu_softirqs;
}
公共长getCpuUser(){
返回cpu_用户;
}
公共长getCpuNiced(){
返回cpu_niced;
}
公共长getCpuSystem(){
返回cpu_系统;
}
公共长getCpuIdle(){
返回cpu_空闲;
}
公共长getCpuIowait(){
返回cpu_iowait;
}
公共长getCpuIrq(){
返回cpu_irq;
}
公共长getCpuSoftirqs(){
返回cpu_软件;
}
public double getAverageIdlePercentage(){
返回(cpu_空闲*100)/(cpu_用户+cpu_加密+cpu_系统+cpu_空闲+cpu_iowait+cpu_irq+cpu_软件irq);
}
公共字符串getName(){
返回名称;
}
公共字符串toString(){
字符串temp=“”;
temp+=名称+“”;
温度+=cpu_用户+“”;
温度+=cpu_niced+“”;
温度+=cpu_系统+“”;
温度+=cpu_空闲+“”;
温度+=cpu_iowait+“”;
温度+=cpu_irq+“”;
temp+=cpu_softirqs+“”;
返回温度;
}
}
公共类固定文件{
/**
*第一行“cpu”汇总了所有其他“cpuN”行中的数字。
*这些数字表示CPU执行不同类型工作所花费的时间。时间单位为用户赫兹或千分之一秒(通常为百分之一秒)。
*/
私有列表CPU;
/**
*对于每个可能的系统中断,自启动时起提供服务的中断计数。第一列是提供服务的所有中断的总数;随后的每列是该特定中断的总数。
*/
私人名单中断;
/**
*跨所有CPU的上下文切换的总数。
*/
私有长ctxt=0;
/**
*系统启动的时间
*/
私人约会时间;
/**
*创建的进程和线程的数量,包括(但不限于)通过调用fork()和clone()系统调用创建的进程和线程。
*/
私有长进程=0;
/**
*当前在CPU上运行的进程数
*/
私有长进程运行=0;
/**
*当前被阻止、等待I/O完成的进程数
*/
私有长进程阻塞=0;
私人名单软件;
公共StatFile(){
CPU=新的ArrayList();
中断=新建ArrayList();
ctxt=0;
b时间=新日期();
进程=0;
procs_running=0;
procs_blocked=0;
softirq=newarraylist();
}
公共列表getCPU(){
返回CPU;
}
公共无效设置CPU(列出CPU){
this.cpus=CPU;
}
公共列表getInterruptions(){
返回中断;
}
公共中断(列表中断){
这个。中断=中断;
}
公共长getCtxt(){
返回ctxt;
}
公共无效setCtxt(长ctxt){
this.ctxt=ctxt;
}
公共日期getBtime(){
返回b时间;
}
公共时间(日期时间){
this.btime=btime;
}
公共长getprocesss(){
返回过程;
}
公共进程(长进程){
这个过程=过程;
}
公共长getProcs_正在运行(){
返回正在运行的进程;
}
public void setProcs_运行(长进程运行){
this.procs\u running=procs\u running;
}
公共长getProcs_阻塞(){
返回进程被阻止;
}
公共无效设置进程被阻止(长进程被阻止){
this.procs\u blocked=procs\u blocked;
}
公共列表getSoftirq(){
返回软irq;
}
公共无效setSoftirq(列表软件IRQ){
this.softirq=softirq;
}
}
CpuUtils类:

public class CpuUtils {

 private static final String TAG = CpuUtils.class.getSimpleName();

 /**
 * Normal processes executing in user mode
 */
private static final int CPU_USER=1;
/**
 * Niced processes executing in user mode
 */
private static final int CPU_NICE=2;
/**
 * Processes executing in kernel mode
 */
private static final int CPU_SYSTEM=3;
/**
 * Twiddling thumbs
 */
private static final int CPU_IDLE=4;
/**
 * Waiting for I/O to complete
 */
private static final int CPU_IOWAIT=5;
/**
 * Servicing interrupts
 */
private static final int CPU_IRQ=6;
/**
 * Servicing softirqs
 */
private static final int CPU_SOFTIRQS=7;

public static StatFile parseStatsFile() {
    StatFile statFile = new StatFile();
    try {
        RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
        try {
            while (true) {
                String load = reader.readLine();
                //Avoid problem parsing doble space
                if(load!=null) {
                    Log.d(TAG, "Stat: " + load);
                    load = load.replace("  ", " ");
                    String[] tokens = load.split(" ");
                    if (tokens[0].startsWith("cpu")) {
                        Cpu cpu = parseCpuTokens(tokens);
                        statFile.getCpus().add(cpu);
                    }
                    else if(tokens[0].startsWith("intr")){
                        for(int i=1; i<tokens.length; i++){
                            statFile.getInterruptions().add(Long.parseLong(tokens[i]));
                        }
                    }
                    else if(tokens[0].startsWith("ctxt")){
                        statFile.setCtxt(Long.parseLong(tokens[1]));
                    }
                    else if(tokens[0].startsWith("btime")){
                        //time is in seconds, therefore we need it in milliseconds
                        statFile.setBtime(new Date(Long.parseLong(tokens[1])*1000));
                    }
                    else if(tokens[0].startsWith("processes")){
                        statFile.setProcesses(Long.parseLong(tokens[1]));
                    }
                    else if(tokens[0].startsWith("procs_running")){
                        statFile.setProcs_running(Long.parseLong(tokens[1]));
                    }
                    else if(tokens[0].startsWith("procs_blocked")){
                        statFile.setProcs_blocked(Long.parseLong(tokens[1]));
                    }
                    else if(tokens[0].startsWith("softirq")){
                        for(int i=1; i<tokens.length; i++){
                            statFile.getSoftirq().add(Long.parseLong(tokens[i]));
                        }
                    }
                }
                else{
                    throw new EOFException("File end reached");
                }
            }
        } catch (EOFException ex) {

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }catch (FileNotFoundException e){
        e.printStackTrace();
        throw new IllegalStateException("Unable to access the stats");
    }

    return statFile;
}

private static Cpu parseCpuTokens(String[] tokens){
    Cpu cpu = new Cpu(tokens[0],
            Long.parseLong(tokens[CPU_USER]),
            Long.parseLong(tokens[CPU_NICE]),
            Long.parseLong(tokens[CPU_SYSTEM]),
            Long.parseLong(tokens[CPU_IDLE]),
            Long.parseLong(tokens[CPU_IOWAIT]),
            Long.parseLong(tokens[CPU_IRQ]),
            Long.parseLong(tokens[CPU_SOFTIRQS]));
    return cpu;
}
}
公共类CpuUtils{
私有静态最终字符串标记=CpuUtils.class.getSimpleName();
/**
*在用户模式下执行的正常进程
*/
专用静态最终int CPU_用户=1;
/**
*在用户模式下执行的Niced进程
*/
私有静态最终整数
public class CpuUtils {

 private static final String TAG = CpuUtils.class.getSimpleName();

 /**
 * Normal processes executing in user mode
 */
private static final int CPU_USER=1;
/**
 * Niced processes executing in user mode
 */
private static final int CPU_NICE=2;
/**
 * Processes executing in kernel mode
 */
private static final int CPU_SYSTEM=3;
/**
 * Twiddling thumbs
 */
private static final int CPU_IDLE=4;
/**
 * Waiting for I/O to complete
 */
private static final int CPU_IOWAIT=5;
/**
 * Servicing interrupts
 */
private static final int CPU_IRQ=6;
/**
 * Servicing softirqs
 */
private static final int CPU_SOFTIRQS=7;

public static StatFile parseStatsFile() {
    StatFile statFile = new StatFile();
    try {
        RandomAccessFile reader = new RandomAccessFile("/proc/stat", "r");
        try {
            while (true) {
                String load = reader.readLine();
                //Avoid problem parsing doble space
                if(load!=null) {
                    Log.d(TAG, "Stat: " + load);
                    load = load.replace("  ", " ");
                    String[] tokens = load.split(" ");
                    if (tokens[0].startsWith("cpu")) {
                        Cpu cpu = parseCpuTokens(tokens);
                        statFile.getCpus().add(cpu);
                    }
                    else if(tokens[0].startsWith("intr")){
                        for(int i=1; i<tokens.length; i++){
                            statFile.getInterruptions().add(Long.parseLong(tokens[i]));
                        }
                    }
                    else if(tokens[0].startsWith("ctxt")){
                        statFile.setCtxt(Long.parseLong(tokens[1]));
                    }
                    else if(tokens[0].startsWith("btime")){
                        //time is in seconds, therefore we need it in milliseconds
                        statFile.setBtime(new Date(Long.parseLong(tokens[1])*1000));
                    }
                    else if(tokens[0].startsWith("processes")){
                        statFile.setProcesses(Long.parseLong(tokens[1]));
                    }
                    else if(tokens[0].startsWith("procs_running")){
                        statFile.setProcs_running(Long.parseLong(tokens[1]));
                    }
                    else if(tokens[0].startsWith("procs_blocked")){
                        statFile.setProcs_blocked(Long.parseLong(tokens[1]));
                    }
                    else if(tokens[0].startsWith("softirq")){
                        for(int i=1; i<tokens.length; i++){
                            statFile.getSoftirq().add(Long.parseLong(tokens[i]));
                        }
                    }
                }
                else{
                    throw new EOFException("File end reached");
                }
            }
        } catch (EOFException ex) {

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }catch (FileNotFoundException e){
        e.printStackTrace();
        throw new IllegalStateException("Unable to access the stats");
    }

    return statFile;
}

private static Cpu parseCpuTokens(String[] tokens){
    Cpu cpu = new Cpu(tokens[0],
            Long.parseLong(tokens[CPU_USER]),
            Long.parseLong(tokens[CPU_NICE]),
            Long.parseLong(tokens[CPU_SYSTEM]),
            Long.parseLong(tokens[CPU_IDLE]),
            Long.parseLong(tokens[CPU_IOWAIT]),
            Long.parseLong(tokens[CPU_IRQ]),
            Long.parseLong(tokens[CPU_SOFTIRQS]));
    return cpu;
}
}