问题起因: 获取进程实时 CPU 占用率,还在看这方面东西,如有更好方法提供也非常感谢。
问题描述:
Release 环境下,没有自身进程相关信息,即使去掉-o
部分,输出的也只有一条其他进程的信息。
测试设备: Google Pixel 3 Android 12 Android Studio Chipmunk | 2021.2.1 Patch 2
代码:
mBinding.btnConfirmAttCpu.setOnClickListener {
val runtime = Runtime.getRuntime()
val cmd = arrayOf("sh","-c","top -n 1 -p ${Process.myPid()} -o PID,%CPU")
val exec = runtime.exec(cmd)
exec.inputStream.reader().apply {
mBinding.displayCpuAttCpu.text = readLines().joinToString("${System.lineSeparator()}${System.lineSeparator()}")
close()
}
exec.destroy()
}
Debug 输出:
[s [999C [999B [6n [u [H [J [?25l [H [J [s [999C [999B [6n [uTasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Mem: 3665332K total, 3516028K used, 149304K free, 4520K buffers
Swap: 2097148K total, 590344K used, 1506804K free, 1975304K cached
800%cpu 0%user 0%nice 0%sys 800%idle 0%iow 0%irq 0%sirq 0%host
[7m PID[%CPU [0m
24654 12.0
[?25h [0m [1000;1H [K [?25h [?25h [0m [1000;1H [K
Release 输出:
[s [999C [999B [6n [u [H [J [?25l [H [J [s [999C [999B [6n [uTasks: 0 total, 0 running, 0 sleeping, 0 stopped, 0 zombie
Mem: 3665332K total, 3537360K used, 127972K free, 4520K buffers
Swap: 2097148K total, 542884K used, 1554264K free, 1971444K cached
800%cpu 0%user 0%nice 0%sys 800%idle 0%iow 0%irq 0%sirq 0%host
[7m PID[%CPU [0m
[?25h [0m [1000;1H [K [?25h [?25h [0m [1000;1H [K
1
guchengyehai1 2022-09-10 15:25:57 +08:00 via iPhone
通过 /proc/[PID]/stat 文件查看某一进程的 CPU 活动信息
|
2
Tyanboot 2022-09-10 16:32:36 +08:00
@guchengyehai1 Android 早就开了 hidepid ,看不到其他进程目录的。
|
4
john6lq OP @ysc3839
我爬楼很久,发现谷歌为了安全,release 下`/proc/stat`不允许读取了,`top`、`dumpsys cpuinfo`也无效,目前没看见有相关 API 直接获取。`HardwarePropertiesManager `普通设备也不能用。 此贴终结 |
5
john6lq OP 不好意思,终结早了,发现新方法,`proc/{pid}/stat`下取得`utime`及`stime`
usage = (utime + stime) / (时间间隔 * 时钟频率 * 核心数) 测试误差不超过 1% |
6
john6lq OP @guchengyehai1 感谢
|