V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
john6lq
V2EX  ›  Android

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

  •  
  •   john6lq · 2022-09-10 15:07:34 +08:00 · 9383 次点击
    这是一个创建于 833 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    测试误差不超过 1%
    john6lq
        6
    john6lq  
    OP
       2022-09-10 22:28:29 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2574 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 06:00 · PVG 14:00 · LAX 22:00 · JFK 01:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.