Android系统-获取 CPU 运行总时长

一、adb shell “cat /proc/stat”

/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。

// 该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致
Z91:/proc # cat stat
cat stat
【第一行】cpu  10986698 461191 6973833 18392057 14380 0 13792 0 0 0
cpu0 2979270 114716 1953131 16232623 13661 0 3698 0 0 0
cpu1 2942761 116427 1876644 702278 228 0 3423 0 0 0
cpu2 2629212 114251 1639567 717985 250 0 3449 0 0 0
cpu3 2435454 115796 1504490 739170 241 0 3221 0 0 0
intr 497972353 0 0 114727036 0 0 51390375 11248 0 1 0 110907 0 0 63628 0 0 0 0 0
 0 67 0 0 0 0 673409 0 0 709 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7731 0 0 0 0 0 0 0 0 0 0 0
0 40 0 0 0 2 0 226026 0 0 0 0 0 0 74813 288 0 0 2208919 0 0 0 0 0 675250 4252472
 27956 0 0 0 18 0 0 0 11740 3456 11394777 10510299 0 0 0 0 3310034 0 2662785 0 4
90866 1124030 4792262 0 4309958 0 0 0 0 0 0 4162101 4309750 57256 0 681 1828961
0 0 75835 0 20541 0 0 0 0 0 10 133443 0 0 0 1579819 0
ctxt 718173363
btime 1515467835
processes 488766
procs_running 3
procs_blocked 0
softirq 195036376 95295 78945733 51458 840637 35071 35071 80176 50194210 0 64758
725

============================================================
上述中的第一行可以进行 CPU 运行总时长
【第一行】cpu  10986698 461191 6973833 18392057 14380 0 13792 0 0 0

二、参数解释

【第一行】cpu 10986698 461191 6973833 18392057 14380 0 13792 0 0 0
1. user (10986698)
从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。
2. nice (461191)
从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
3. system (6973833)
从系统启动开始累计到当前时刻,处于核心态的运行时间
4. idle (18392057)
从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间iowait (12256) 从系统启动开始累计到当前时刻,IO等待时间
5. irq (14380)
从系统启动开始累计到当前时刻,硬中断时间
6. softirq (0)
从系统启动开始累计到当前时刻,软中断时间
7. guest(13792)
which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel
8. 总的cpu时间
totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest

三、代码实现

package com.fadisu.cpurun.util;

import android.os.Process;
import android.util.Log;

/**
 * ReadCpuProcFile analysis
 */
public class ReadCpuProcFile {

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

    // ReadCpuProcFile probe
    private static final int[] SYSTEM_CPU_FORMAT = new int[]{
            Process.PROC_SPACE_TERM | Process.PROC_COMBINE,
            Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 1: user time
            Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 2: nice time
            Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 3: sys time
            Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 4: idle time
            Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 5: iowait time
            Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 6: irq time
            Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG  // 7: softirq time
    };

    private static long mTotalCpuTime ;
    private static long mUserStart;
    private static long mSystemStart;
    private static long mIdleStart;
    private static long mIrqStart;

    public static void getTotalCpuTime() {
        long[] sysCpu = new long[7];
        if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, sysCpu, null)) {
            mUserStart = sysCpu[0] + sysCpu[1];
            mSystemStart = sysCpu[2];
            mIdleStart = sysCpu[3];
            mIrqStart = sysCpu[4] + sysCpu[5] + sysCpu[6];

            mTotalCpuTime = mUserStart + mSystemStart + mIdleStart + mIdleStart + mIrqStart;
            Log.d(TAG, "TotalCpuTime = " + mTotalCpuTime);
        }
    }

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值