ByteScope

Android System Monitor

コア別の負荷とクロック、すべてのサーマルゾーン、実測スループット、プロセス表——1 秒ごとに、ケーブルから直接。

すべての値はあなたのブラウザが USB ケーブル越しに読み、このタブから出ません。端末に何もインストールせず、測定値もアップロードしません——このページの背後にサーバーはありません。

ブラウザの対応を確認中…

このツールについて・FAQ・関連ツール

このツールについて

Android 端末を Chromium ブラウザに USB でつなぐと、このページがその計器盤になります。60 秒スパークライン付きの CPU 全体、コアごとの負荷バーとライブクロック、端末が公開しているすべてのサーマルゾーン、PSS 上位アプリつきのメモリ、リアルタイムのネットワークとディスクのスループット、最も忙しい 10 プロセス、そして止めて CSV で書き出せる記録。端末には何もインストールせず、何もアップロードしません——このページはサーバーを持たない静的ファイルで、タブを閉じればすべての数値は消えます。

「空きメモリ」で言いたかった数字は MemAvailable のほう

12 GB 積んだ端末で空きが数百 MB と表示される——Android のこの有名な光景と、そこから生まれたすべてのタスクキラーアプリは、同じ誤解の上に立っています。MemFree は「まったく何にも使われていない」メモリで、健全な Linux カーネルではこの数字は小さいのが正しい姿です。残りはページキャッシュと回収可能な slab が持っていて、使われていないメモリは無駄なメモリだからです。MemAvailable は「新しい確保がいま実際にどれだけ取れるか」というカーネル自身の見積もり——空きメモリに、スワップせずに回収する用意があるものを足したもの——で、人間が「空き RAM」と言うときに指しているのはこちらです。このページはどこでもこれを使い、そう明記します。報告できない古いカーネル(Linux 3.14 より前)では従来の free+cached 推定に落ち、バーには estimated と書きます。下のアプリ別の並びは PSS で、専有ページに加えて他と共有しているページの按分を数えるので、合計が全体と一致しないのは意図どおりです。

コア別クロックと、クラスタに名前を付けない理由

各コアが自分の行を持ちます。/proc/stat 由来の負荷バー、ライブの scaling_cur_freq、そしてそのコア*自身*の cpuinfo_min_freqcpuinfo_max_freq に対する目盛りです。最後の一点が big.LITTLE 端末で表を読めるものにします——小コアの 1.8 GHz は全開、同じ 1.8 GHz でも大コアならアイドルなので、共通の軸で描けば正反対のことを示してしまいます。コアは周波数上限でまとめます。それがクラスタを物理的に分けている性質で、しかもシリコンの定数だからです。表示は「クラスタ 0 · 上限 1.80 GHz」で、「little」「big」「prime」とは呼びません。あれはマーケティングの名前で、対応は SoC と世代で変わり、自信ありげに間違ったラベルを出すのは正直な上限値より悪いからです。各行の governor(schedutilwalt、OEM 独自名)はそのまま出します。自分のシェル出力と突き合わせるためのものだからです。

スロットリングの段階と、温度が実際に奪うもの

サーマル帯はカーネル生の /sys/class/thermal/thermal_zone*/temp で、隣のバッジは Android のサーマルサービス自身が返す NONE / LIGHT / MODERATE / SEVERE / CRITICAL / EMERGENCY / SHUTDOWN です。これはこのページの言葉ではなくフレームワークの言葉で、具体的な意味があります。MODERATE からシステムはアプリに負荷を下げるよう求め始め、SEVERE ではベンチマークが何を望もうと CPU と GPU のクロックが落とされます。それが起きる普遍的な温度はありません——トリップポイントは端末ごと・ゾーンごとに OEM のサーマル HAL が決めるので、表面 42 °C で絞る端末も 48 °C まで回す端末も、どちらも正常です。できるのは、どのゾーンが先に上がるか、それに合わせてクロックがどれだけ速く落ちるかを見ることです。端末はほぼ同一のゾーンを 90 個公開することもあるので、このページは系統ごとに 1 本と、必ず全機で最も熱い 1 本を監視し、いくつ中いくつを見ているかをタイルに書きます。

このページもそのグラフに載っています

コンピュータをコンピュータで測るのは無料ではありません。自分のコストを隠す監視ページは、まさにそれが示すべきものについて嘘をついています。ここでは 1 tick がファイルごとではなく **1 本**のまとめたシェルコマンドで、サーマルの一斉取得は毎秒ではなく一度だけ、top は 10 秒に一度(toybox が %CPU の差分を出すために内部で 250 ms 眠るから)、そして全実行プロセスに binder を投げて各自に smaps を歩かせる dumpsys meminfo は 30 秒に一度でオフにもできます。同時に飛んでいるコマンドは常に 1 本だけです。シェルを 2 本並べても実時間は半分にならず、同じ瞬間の fork の嵐が倍になるだけだからです。タブが背面に回れば、すべて 10 秒に 1 本まで落ちます。それでも、本気のベンチマーク中の端末では、見えている数値の 1〜2 % は測定側のものだと考えてください。

タブを開いたままにする理由が記録機能です。開始して、負荷試験なりゲームなりアップロードなりを走らせ、停止すれば、すべての系列を 1 つの表として持ち帰れます——表計算なら CSV、スクリプトを書くなら JSON。どちらもこのタブで作られ、アップロードされません。列は開始を押した時点で固定されるので、途中でコアがオフラインになっても空セルが並ぶだけで、幅の違う行が混ざったファイルにはなりません。失敗した測定は空セルであって、0 ではありません。ここから先は、Web ADB ハブに残りの道具一式があり、電池ページは同じパックを 1 Hz でサイクル数と容量まで読み、ストレージ解析はこのページが I/O しか見せない中身を見せてくれます。

よくある質問

Android でアプリがどれだけメモリを使っているか見るには?

メモリタイルの PSS 上位を見てください。proportional set size を最も多く抱えている 5 プロセスを並べたもので、Android 自身が「何を kill するか」を決めるときに使う数字です。PSS はアプリ専有のページを全額、他プロセスと共有しているページはその按分だけ数えます——3 つのアプリが 30 MB のライブラリを共有していれば、それぞれ 10 MB です。だからこの列の合計は端末の総量と一致しませんし、だからこそ「このアプリは自分にいくらかかっているか」の単一の数字としては最も公平です。下のプロセス表の RSS はまた別の測定で、共有ページを写像しているプロセスすべてに全額を課すので、合計は端末の搭載量をはるかに超えます。どちらも端末に何もインストールせず USB 経由で読んでいます。

スマホの CPU 使用率 100% は悪いことですか?

それ自体は悪くありません。数秒間 100 % なのは、頼んだ仕事をしている端末です——動画のデコード、シェーダのコンパイル、アプリのインストール。全開で早く終わらせるほうが、だらだら続けるより電池を*使わない*ことのほうが多いくらいです。問題は、そのあとどうなるかです。画面に何も出ていないのに 100 % が続くなら、動くべきでないものが背後で動いていて、それはプロセス表が名指しします。温度が上がりスロットリングのバッジが `NONE` から動きながらの 100 % なら、クロックが引き下げられて 60 % のときより遅くなる直前です。そして全部閉じてもアイドルに戻らない 100 % は、wakelock を握ったアプリの典型的な兆候で、プロセス表とヘッダー行の前面アプリを見れば普通は 1 分かかりません。

Android 端末は何度でスロットリングしますか?

単一の数字はありません。数字を出す人は自分の端末の値を引用しています。トリップポイントは端末ごと・ゾーンごとにメーカーのサーマル HAL が決めます。表面温度はおおむね 39 °C から 45 °C のどこかで効き始め、SoC 内部のゾーンは筐体よりずっと高く、充電には CPU より厳しい独自の上限があります。移植できるのは*形*のほうです。どのゾーンが先に上がるか、バッジが `NONE` → `LIGHT` → `MODERATE` と動くか、負荷は平らなままコア別クロックが落ちていくか。最後の組み合わせ——負荷は張り付き、クロックは低下——が熱によるスロットリングで、絶対温度が何を示していようとこれは曖昧さがありません。

ここのネットワークの数字が Android のデータ使用量画面と合わないのはなぜ?

数えているものが違います。このページは `/proc/net/dev`、つまり起動からのインターフェース別バイトカウンタを読み、実在のインターフェースを合計しつつ loopback とトンネル系は意図的に除外します——VPN は同じペイロードを二重に運び(`wlan0` で一度、`tun0` でもう一度)、USB テザリングならこのデバッグセッション自身を数えてしまうからです。どのインターフェースを合計したかはタイルに明記してあるので確認できます。Android のデータ使用量画面はまったく別の会計です。アプリ別・回線種別に帰属させ、独自の請求サイクル境界を当て、カーネルが見ているすべてを数えるわけでもありません。どちらも間違いではありません。「いま実際に電波を通っているのは何か」に答えるのはカーネルの数字のほうです。

書き出した CSV は何に使えますか?

1 秒 1 行の横長の表で、先頭にミリ秒タイムスタンプ、UTC の ISO タイムスタンプ、経過秒の列が並びます。だから Excel、Numbers、`pandas`、R にそのまま読み込め、整形は要りません。よくある使い方は、ゲームやベンチマークを 10 分回してクロックと温度を重ね、スロットリングが始まった秒を特定する。2 つのファームウェアで同じ作業をさせて CPU 秒を差分する。電池の減りが怪しいときに記録しっぱなしにして、前面アプリの列と電力の列を突き合わせる。失敗した測定のセルは空で、0 ではないので、平均が黙って下に引っ張られることはありません。記録は 1800 行——30 分——で止まり、末尾ではなく先頭を残します。負荷試験ではベースラインのほうが持っている価値があるからです。