12

当我使用 TOP 命令时,我可以获得以下信息:

shell@android:/ $ top -n 1                                                     

User 31%, System 10%, IOW 0%, IRQ 0%
User 346 + Nice 10 + Sys 120 + Idle 637 + IOW 6 + IRQ 0 + SIRQ 2 = 1121

  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
  481  1  26% S    89 762832K  81688K  fg system   system_server
 1699  0   5% S    27 676472K  39092K  fg u0_a72   wm.cs.systemmonitor
11243  0   3% S    28 673140K  29796K  bg u0_a111  com.weather.Weather
13327  2   1% S    23 680472K  35844K  bg u0_a83   com.rhmsoft.fm
  659  0   1% S    17 663044K  33136K  bg u0_a13   android.process.media
20260  1   0% R     1   1208K    508K     shell    top

我们可以看到它CPU%是四舍五入到整数,有什么方法可以得到CPU%更高精度的过程吗?

-- 对赏金的澄清 -- 亚历克斯

该问题涉及Android系统,最好是非root设备。虽然 Android 为 Java 应用程序提供了高级分析技术,但用于本机代码 (C++) 的工具是有限的。Android 上的top命令允许显示系统中运行的所有线程的统计信息,包括 Java 线程和 C++ 线程。我正在寻找一个有助于完成以下任务的答案:

我的应用在后台不活动时使用 2% 的 CPU,而它应该低于 0.1%。如果我运行top -t,对于属于我的进程的所有 15 个线程,我得到 0%(一些线程是 Java 线程,例如 Main、UI 线程;其他是从不附加到 JVM 的 pthread)。我怎么能猜出哪个线程吃掉了电池?

我很高兴能获得有关此意外活动的更多详细信息,并且 Android为 Java 线程提供了很好的帮助程序,例如TraceView 。任何有关本机代码工具的见解都将受到高度赞赏。

4

4 回答 4

6

您在帖子中没有提到它,但在评论中您说您确实需要每个线程而不是每个进程的 CPU 利用率。

如果找不到足够准确的工具,可以/proc/[pid]/task/[ThreadName]按照手册页中的说明直接查看/proc. 这给出了自执行开始以来在“时钟滴答”中消耗的总 CPU 时间。获得比这更好的分辨率可能很困难或不可能。

编辑

从OP的评论中,列出相关信息的命令是:

adb shell cat /proc/${pid}/task/*/stat | awk -F\ '{print $1, $14}' 

这只是向调试主机发送cat正确的/proc文件,该主机运行一个小awk程序来打印 和 的piduser time。如果不可用,您也可以轻松使用cut -d " " -f1,14或类似的东西perl来获取列。awk

于 2013-07-01T13:12:32.807 回答
3

试试这个:

ps -eo pcpu,pid,user,args | sort -r -k1 | less 

%CPU   PID USER     COMMAND
 9.0  2721 user   bash
 1.4   956 root     ...
 0.5  2212 user   ...

编辑:

您可以使用 adb shell 和 busybox ( http://www.busybox.net/downloads/BusyBox.html )

adb shellbusybox 顶部

c:\ adb push busybox /system/bin
c:\ adb shell
# busybox top 

CPU:  2.3% usr  3.1% sys  3.9% nic 90.5% idle  0.0% io  0.0% irq  0.0% sirq
Load average: 1.06 1.66 10.63 1/589 8048
←[7m  PID  PPID USER     STAT   VSZ %MEM CPU %CPU COMMAND←[0m
31619  2180 10112    S     217m 67.0   0  3.8 com.mgeek.android.DolphinBrowser.B

 2232  2180 1000     S     551m169.6   0  2.6 system_server
 8038  8037 0        R     2068  0.6   0  0.8 busybox top
 2178     1 0        S    11092  3.3   0  0.6 /system/bin/drexe
 6812  2180 10104    S     199m 61.2   0  0.5 android.tether
 2291  2180 1001     S     324m 99.8   0  0.3 com.android.phone
 2308  2180 10006    S     325m100.0   0  0.1 com.sec.android.app.dialertab
 2177     1 1001     S     9624  2.8   0  0.1 /system/bin/rild
    5     2 0        SW<      0  0.0   0  0.1 [events/0]
30087  2180 10022    S     358m110.4   0  0.0 com.samsung.vvm
 2304  2180 10006    S     311m 96.0   0  0.0 com.sec.android.app.twlauncher
16110  2180 10006    S     296m 91.3   0  0.0 android.process.acore
 2445  2180 10006    S     272m 83.8   0  0.0 com.sec.android.provider.logsprovi

 8064  2180 10002    S     238m 73.4   0  0.0 com.google.process.gapps
31537  2180 10037    S     227m 69.9   0  0.0 com.google.android.gm
 2288  2180 10048    S     221m 68.1   0  0.0 com.swype.android.inputmethod
 2285  2180 10013    S     215m 66.3   0  0.0 com.tat.livewallpaper.aurora
30664  2180 10011    S     213m 65.8   0  0.0 com.android.email
31191  2180 10099    S     209m 64.4   0  0.0 com.sirma.mobile.bible.android
 2377  2180 10087    S     207m 63.9   0  0.0 android.tts

(取自这里

于 2013-06-27T08:00:22.987 回答
2

从另一个线程得到这个信息:

3) 获取 CPU 信息

~$ adb shell dumpsys cpuinfo

输出:

负载:0.08 / 0.4 / 0.64 CPU 使用率从 42816 毫秒到 34683 毫秒前:system_server:1% = 1% 用户 + 0% 内核/故障:16 次要 kdebuglog.sh:0% = 0% 用户 + 0% 内核/故障:160次要 tiwlan_wq: 0% = 0% 用户 + 0% 内核 usb_mass_storag: 0% = 0% 用户 + 0% 内核 pvr_workqueue: 0% = 0% 用户 + 0% 内核 +sleep: 0% = 0% 用户 + 0% 内核+sleep: 0% = 0% user + 0% kernel TOTAL: 6% = 1% user + 3% kernel + 0% irq

编辑:

你也可以试试这个命令:echo $(adb shell ps | grep com.android.phone | awk '{ system("adb shell cat /proc/" $2 "/stat");}' | awk '{print $14+$15;}')

还:

使用 top :这将显示 cpu 统计信息 top -b -n 1 |grep ^Cpu

使用 ps:这将显示每个进程的 % cpu 使用率。 ps -eo pcpu,pid,user,args | sort -r -k1 | less

编辑2:

根据您的评论和赏金描述(我怎么能猜出哪个线程吃掉了电池?)我发现了一个有趣的页面:

http://ziyang.eecs.umich.edu/projects/powertutor/

如那里所述:

您可以使用 PowerTutor 监控任何应用程序的功耗。

试一试,看看它是否符合您的要求。

最终编辑:

查看 developer.android.com 网站上的 Systrace 文档:

http://developer.android.com/tools/debugging/systrace.html http://developer.android.com/tools/help/systrace.html

如果您已经尝试过,我很抱歉,但这是衡量性能的一种具体方法。

于 2013-06-27T12:09:25.207 回答
-2

使用DDMS和方法分析来获取TraceView

基本上:

  1. 在调试模式下启动您的应用
  2. 在 DDMS 中,在“设备”选项卡中,单击“开始方法分析”
  3. 在您的设备上做一些事情以重新创建您想要监控的条件
  4. 单击“停止方法分析”
  5. 您将获得一个相当详细的图表,其中包含每个线程的执行情况,您可以深入了解

更多细节在这里:http: //developer.android.com/tools/debugging/debugging-tracing.html

免责声明:我只用一个简单的测试应用程序完成了这个,所以我不知道你会从中获得多少里程。它似乎确实比迄今为止描述的更精确,并且不需要root。

在此处输入图像描述

于 2013-06-29T13:49:51.263 回答