奇怪, `TOP`命令在 Debug 和 Release 环境下输出结果不一样

2022-09-10 15:07:34 +08:00
 john6lq

问题起因: 获取进程实时 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
8537 次点击
所在节点    Android
6 条回复
guchengyehai1
2022-09-10 15:25:57 +08:00
通过 /proc/[PID]/stat 文件查看某一进程的 CPU 活动信息
Tyanboot
2022-09-10 16:32:36 +08:00
@guchengyehai1 Android 早就开了 hidepid ,看不到其他进程目录的。
ysc3839
2022-09-10 20:27:55 +08:00
建议直接用系统提供的底层 API ,不建议去解析二手信息
@Tyanboot 那 top 也获取不到呀
john6lq
2022-09-10 21:47:52 +08:00
@ysc3839

我爬楼很久,发现谷歌为了安全,release 下`/proc/stat`不允许读取了,`top`、`dumpsys cpuinfo`也无效,目前没看见有相关 API 直接获取。`HardwarePropertiesManager `普通设备也不能用。

此贴终结
john6lq
2022-09-10 22:23:25 +08:00
不好意思,终结早了,发现新方法,`proc/{pid}/stat`下取得`utime`及`stime`

usage = (utime + stime) / (时间间隔 * 时钟频率 * 核心数)

测试误差不超过 1%
john6lq
2022-09-10 22:28:29 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/879120

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX