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システム、できればルート化されていないデバイスを指します。一方Androidは、Javaの高度なプロファイリング手法を提供します=アプリケーション、ネイティブコード(C++)のツールは制限されています。topコマンドのAndroidは、の統計を表示できますシステムで実行されているすべてのスレッド、JavaスレッドとC++スレッドの両方。次の質問に役立つ答えを探しています。
私のアプリは、バックグラウンドで非アクティブのときに2%のCPUを使用しますが、0.1%未満である必要があります。走ったらtop -t
、プロセスに属する15個のスレッドすべてで0%を取得します(一部のスレッドはJavaスレッド、たとえばMain、UIスレッド、その他はJVMに接続しないpthreadです)。どうすればよいですか。どのスレッドがバッテリーを消費すると思いますか?
この予期しないアクティビティについてさらに詳しく知りたいと思います。Androidは、Javaスレッドの TraceView のような優れたヘルパーを提供します。ネイティブコード用のツールに関する洞察は高く評価されます。
投稿では言及していませんが、コメントでは、プロセスごとではなく、スレッドごとにCPU使用率が本当に必要であると述べています。
十分に正確なツールが見つからない場合は、 /proc/[pid]/task/[ThreadName]
のマニュアルページ で説明されているように、/proc
を直接調べることができます。これにより、実行が開始されてから「クロックティック」で消費された合計CPU時間が得られます。これよりも優れた解像度を取得することは、おそらく困難または不可能です。
編集
OPのコメントによると、関連情報を一覧表示するコマンドは次のとおりです。
adb Shell cat /proc/${pid}/task/*/stat | awk -F\ '{print $1, $14}'
これは、デバッグホストへの正しい/proc
ファイルをcat
sします。デバッグホストは小さなawk
プログラムを実行して、pid
とuser time
の列を出力します。 Perl
が使用できない場合は、cut -d " " -f1,14
またはawk
の類似のものを簡単に使用して列を取得することもできます。
これを試して:
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シェルbusyboxトップ
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
( ここ から取得)
別の情報からこの情報を取得しました スレッド :
3)CPU情報の取得
〜$ adb Shell dumpsys cpuinfo
出力:
負荷:0.08/0.4/0.64 CPU使用量42816msから34683ms前: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%カーネル+スリープ:0%= 0%ユーザー+ 0%カーネル+スリープ:0%= 0%ユーザー+ 0%カーネル合計:6%= 1%ユーザー+ 3%カーネル+ 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
EDIT2:
あなたのコメントと賞金の説明(どのスレッドがバッテリーを消費しているのかをどうやって推測できますか?)に実際に、私は興味深いページを見つけました:
http://ziyang.eecs.umich.edu/projects/powertutor/
そこに述べられているように:
PowerTutorを使用して、任意のアプリケーションの消費電力を監視できます。
インスタンスに対してこれを試して、要件を満たしているかどうかを確認してください。
最終編集:
Developer.Android.comサイトのSystraceドキュメントを確認してください。
http://developer.Android.com/tools/debugging/systrace.htmlhttp://developer.Android.com/tools/help/systrace.html
すでにお試しいただいている場合は申し訳ありませんが、それがパフォーマンスを測定する具体的な方法の1つです。