Android中获取CPU负载和进程cpu时间

本文介绍如何使用Android系统中的ProcessStats类获取CPU负载和进程时间,通过解析/proc目录下的文件如/proc/stat、/proc/loadavg和进程stat文件,监测系统平均负载、CPU活动信息及进程状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 性能测试实践(三)Cpu

http://www.51testing.com/html/44/15020244-3569602.html


Android中获取CPU负载和进程cpu时间

https://my.oschina.net/u/262208/blog/378660

android系统中有一个ProcessStats类,我们可以使用它来获取系统的负载情况及进程时间。

        实现原理是读取/proc目录下的文件。linux系统运行时,内核会去更新 /proc目录下的文件,将PID的运行情况写入相应的文件中。我们主要关注以下文件

1. /proc/stat

该文件包含了从系统启动开始累积到当前时刻的CPU活动信息。

看下我手机的情况,如下

cat /proc/stat

cpu  14869 5121 19794 156065 3114 0 26 0 0 0 

cpu0 10268 4823 15912 84682 2800 0 23 0 0 0

intr 8830975 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5926 0 0 0 0 0 0 0 0 0 0 0 0 0 0 84406

0 0 0 0 0 0 0 0 0 0 13205 0 2195 0 0 0 0 2 2 0 4304 0 1 0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1570 0 321 0 7132798 0 3638 21 0 0 1 0 0 0 134 0 0 0 0 0 0 0

 0 0 0 0 715 835 0 0 168670 0 0 0 0 0 0 0 0 0 0 0 0 0 2124 28527 0 0 200 0 0 0 0

 4823 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

ctxt 15331839

btime 1423869515

processes 2813

procs_running 3

procs_blocked 1

softirq 135522 11 57942 11 3386 11 11 8212 5725 54 60159

cpu的每一列的意思如下

user (14869 ) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
nice (5121 ) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
system (19794 ) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
idle (156065 ) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
iowait (3114 ) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,
irq (0) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
softirq (26) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

后三个android没有读取,估计没用。

手机是单核从,所以只有cup0,含义和上面一样

其他的如下:

“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒。
“processes (total_forks) 自系统启动以来所创建的任务的个数目。
“procs_running”:当前运行队列的任务的数目。
“procs_blocked”:当前被阻塞的任务的数目。

 

2./proc/loadavg

系统平均负载.该文件中的所有值都是从系统启动开始累计到当前时刻。该文件只给出了所有CPU的集合信息,不能该出每个CPU的信息。

 

我手机中如下:

cat /proc/loadavg

10.78 9.55 7.20 5/818 3719

 

每个值的含义为:
参数 解释
lavg_1 (10.78) 1-分钟平均负载
lavg_5 (9.55) 5-分钟平均负载
lavg_15(7.20) 15-分钟平均负载
nr_running (5) 在采样时刻,运行队列的任务的数目,与/proc/stat的procs_running表示相同意思
nr_threads (818) 在采样时刻,系统中活跃的任务的个数(不包括运行已经结束的任务)
last_pid(3719) 最大的pid值,包括轻量级进程,即线程。

 

 

3.进程信息

以PID作为文件夹名。

例如进程2411的stat如下

cat /proc/2411/stat

2411 (loop43) S 2 0 0 0 -1 2129984 0 0 0 0 0 150 0 0 0 -20 1 0 7794 0 0 42949672

95 0 0 0 0 0 0 0 2147483647 0 4294967295 0 0 17 2 0 0 0 0 0 0 0 0

每一项的含义可以看http://www.net527.cn/a/caozuoxitong/Linux/2012/0823/24385.html

 

有了以上的基础,我们就可以看ProcessStats这个类了。

update()函数读取上面所提的信息。

 

 

我们可以很方便的使用这个类,来进行cpu负荷和进程时间的监控。Android系统在SystemUI中有一个服务,就使用了这个类。

我们看SystemUI的Manifest文件,可以找到一个叫LoadAverageService的服务,它就是使用了ProcessStats获取cpu和进程信息,并把他们显示出来。

最后,在看下如何使用LoadAverageService这个服务

可以在adb shell中直接运行am startservice -n com.android.systemui/.LoadAverageService

或者用【设置】->【开发者选项】->【显示cpu使用情况】打开服务

我们在开发应用的时候,可以开启这个选项,时时跟踪系统的cpu占用情况,真的是很方便啊!!!

<think>好的,我现在需要帮助用户了解如何在Android平台上使用Perfetto来监控CPU使用率负载。首先,我需要回忆一下Perfetto的基本知识,它是什么,以及它在Android系统中的作用。Perfetto是Google开发的一个性能分析工具,用于跟踪分析系统及应用的性能数据,包括CPU、内存、电池等。 接下来,用户的问题具体是关于CPU负载使用率的统计。我需要确定Perfetto如何收集这些数据。记得Perfetto可以通过配置文件(trace config)来定义需要收集的数据类型参数。可能需要指导用户如何创建这样的配置文件,特别是针对CPU的部分。 然后,我需要考虑用户可能的操作步骤:如何启用开发者选项USB调试,如何安装Perfetto,如何启动跟踪,以及如何分析结果。这些步骤需要详细但清晰,适合不同水平的用户。例如,启用USB调试可能对新手来说需要指导,而生成配置文件可能需要提供示例代码。 另外,用户可能需要了解如何解析生成的数据。Perfetto的跟踪文件可以在Perfetto UI中进行分析,这里需要说明如何上传文件,查看CPU频率、核心使用情况、线程调度等信息。可能还需要提到一些高级分析技巧,比如筛选特定进程或线程,查看上下文切换次数等。 同时,要考虑到用户可能遇到的常见问题,比如权限不足、设备不兼容、数据解读困难等。因此,在回答中可能需要包含一些注意事项,比如需要root权限的部分,或者推荐在特定Android版本上使用。 还需要参考提供的引用内容,但看起来这些引用主要关于内存分析、ActivityTaskManagerServicesystrace工具。虽然用户的问题是关于PerfettoCPU的,但可能需要确认是否有相关内容可以借鉴。例如,引用[3]提到了systrace,而Perfetto实际上是systrace的升级版,因此可以提到两者的关系,但重点放在Perfetto上。 最后,生成相关问题时要确保问题与主题相关,能够帮助用户进一步探索。例如,如何自动化监控、与其他工具的比较、优化CPU使用率的方法等。 现在,我需要将以上思考整理成一个结构化的回答,分步骤说明如何使用Perfetto监控CPU,并确保涵盖配置、数据收集、分析以及注意事项。同时,提供相关问题供用户深入探讨。</think>以下是如何使用Perfetto在Android平台上统计CPU负载使用率的完整指南: ### 一、环境准备 1. 开启开发者选项:进入手机设置 > 关于手机 > 连续点击"版本号"7次 2. 启用USB调试:开发者选项中打开"USB调试""USB安装" 3. 安装Perfetto工具链: ```bash adb install -r path/to/perfetto.apk ``` ### 二、配置跟踪参数 创建`cpu_trace.cfg`配置文件: ```json buffers: { size_kb: 10240 fill_policy: DISCARD } data_sources: { config { name: "linux.ftrace" ftrace_config { ftrace_events: "sched/sched_switch" ftrace_events: "power/cpu_frequency" ftrace_events: "cpu/cpu_idle" } } } duration_ms: 10000 # 跟踪时长10秒 ``` ### 三、启动跟踪会话 通过ADB执行命令: ```bash adb shell perfetto --txt -c /data/local/tmp/cpu_trace.cfg -o /data/local/tmp/trace.pftrace ``` ### 四、数据分析流程 1. 导出跟踪文件: ```bash adb pull /data/local/tmp/trace.pftrace ``` 2. 使用Perfetto可视化分析: - 访问[Perfetto UI](https://ui.perfetto.dev) - 点击"Open trace file"上传.pftrace文件 3. 关键指标查看: - CPU频率曲线:筛选`power/cpu_frequency`事件 - 核心利用率:查看`sched/sched_switch`统计 - 线程调度细节:使用"Slice details"面板 ### 五、高级配置技巧 统计各进程CPU使用率: ```json data_sources: { config { name: "linux.process_stats" target_buffer: 0 process_stats_config { scan_all_processes_on_start: true proc_stats_poll_ms: 1000 # 采样间隔 } } } ``` ### 六、注意事项 1. Android 9+ 系统原生集成Perfetto,低版本需要手动部署 2. 完整CPU负载分析建议跟踪时长≥30秒 3. 需要`android.permission.DUMP`权限[^2] 4. 核心休眠状态可通过`cpu_idle`事件追踪
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值