dumpsys diskstats
読み取りのみパーティションごとの空き容量、ディスク書き込み遅延の実測、そしてキャッシュされたアプリ別の使用量内訳。
- コマンド
- adb shell dumpsys diskstats
- コマンド
- システムサービス(dumpsys)
- リスク
- 読み取りのみ
構文
dumpsys diskstats使用例
dumpsys diskstatsサービスが持っているものすべて。実測分とキャッシュ分の両方。
df -k /data本当に重要なパーティションについて、独立した 2 つ目の空き容量の読み。
出力の読み方
出力例
Latency: 3ms [512B Data Write]
Data-Free: 12345678K / 111222333K total = 11% free
Cache-Free: 1234K / 5678K total = 21% free
App Size: 45678901234
App Data Size: 23456789012
App Cache Size: 3456789012無関係な 2 つの半分が 1 つのダンプに入っています。前半(書き込み遅延と `*-Free:` 行)は呼び出しごとに実測され、`K` は KiB なのでバイトにするには 1024 倍します。後半はバックグラウンドのジョブがだいたい 1 日ごとに更新するファイル由来で、似た名前のフィールドから受ける印象に反してサイズは素のバイトです。ジョブが一度も走っていなければ、後半はまるごと存在しません。
出力フィールド
| フィールド | 意味 |
|---|---|
| Latency: Nms [512B Data Write] | いま /data へ 512 バイト書くのにかかった時間。 |
| <partition>-Free: aK / bK total = c% free | 空きと合計を KiB で、加えて端末自身の整数除算による割合。 |
| <partition>-Error: … | そのパーティションが測れませんでした。ダンプの残りは有効です。 |
| App Size / App Data Size / App Cache Size | キャッシュ側から来た、コード・データ・キャッシュの合計。単位はバイト。 |
| Package Names / App Sizes / App Data Sizes / Cache Sizes | 添字だけで対応する 4 本の並列配列。 |
必要な権限
このダンプが要求する権限は 1 つではなく 2 つです。`DiskStatsService.dump` は `DumpUtils.checkDumpAndUsageStatsPermission` で始まり、これは `android.permission.DUMP` **と** `android.permission.PACKAGE_USAGE_STATS`、それに対応する `android:get_usage_stats` の app-op を求めます。shell は何の苦もなく両方を通ります。マニフェストが両方の権限を宣言していますし、usage-stats のチェックは app-op を見る前に `ROOT_UID`、`SYSTEM_UID`、`SHELL_UID`、`INCIDENTD_UID` を短絡するからです。したがって root も `adb root` も不要で、特に設定の「使用状況へのアクセス」画面に行く必要もありません。権限名を見た人がまず探しに行くのがそこですが、関係ありません。代わりにこのコマンドだけが必要とするのは、書き込める `/data` です。遅延の数値はサービスが貯めていた統計ではありません。`dump` は毎回 `/data/system/perftest.tmp` を作り、非ゼロの 512 バイトを書き、閉じて削除し、その書き込みを `SystemClock.uptimeMillis()` で計ります。つまりこの一族で最も無害に見えるダンプが、実行のたびにファイルシステムに触っているわけです。`df` が即座に返るのに対して、この呼び出しが混んだディスクの後ろで待たされ得るのもそのためで、Android Storage Analyzer がこれをタイマーではなくスキャン 1 回につき 1 度だけ送るのもそのためです。
エラーメッセージの読み解き
| メッセージ | 意味 |
|---|---|
| Test-Error: java.io.IOException: /data/system/perftest.tmp: open failed: EACCES (Permission denied) | 512 バイトのベンチマーク書き込みが失敗したので、この行は `Latency:` の行の隣に出るのではなく、それを丸ごと置き換えます。ダンプの他の部分は影響を受けません。空き容量の行も、キャッシュされたアプリ別の後半も、そのまま続いて信頼できます。失われたのは書き込み遅延の測定だけです。 |
| Data-Error: java.lang.IllegalArgumentException: Invalid stat: bsize=0 avail=0 total=0 | `reportFreeSpace` がそのパーティションを stat できず、数値が入るはずの場所に例外を印字して、そのパーティションについてだけ処理を戻しました。同じ形の行は `Cache-Error`、`System-Error`、`Metadata-Error` としても現れます。`Metadata-Free:` の行が無いのは、大抵は不具合ではなく年式です。tag android-11.0.0_r1 と android-12.0.0_r1 では metadata パーティションはそもそも報告されず、android-13.0.0_r1 から現れます。 |
| Recent Disk Write Speed data unavailable | `storaged` が直近の書き込み速度のベンチマークを問われてゼロを返したので、サービスは `Recent Disk Write Speed (kB/s) = …` の行の代わりにこれを印字しました。ディスクが遅いという意味ではなく、最近誰もベンチマークしていないという意味です。`storaged` にまったく届かない場合は、ここに例外の生テキストが 1 行で出ます。 |
| Permission Denial: can't dump DiskStatsService from from pid=4821, uid=10231 due to missing android.permission.PACKAGE_USAGE_STATS permission | 2 つの権限のうち、後者で落ちています。`DumpUtils` の拒否はどれもそうですが、`from from` の重複は本物の AOSP のテキストで、行は **標準出力** に書かれるので、容量の数値が出るはずだった場所に居座ります。`adb shell` のプロンプトからこれが出たなら、呼び出しが uid 2000 から来ていないということです。`run-as` の中にいないか確認してください。 |
バージョンとメーカーに関する注意
- アプリ別の数値はレコードではなく、独立した 4 本の配列です。1 本が短ければ、欠けた位置より後ろの行は全部別のアプリに紐づきます。4 本の長さが食い違うなら、その表は無価値なので、繋ぎ合わせるのではなく捨ててください。
- これは本当に失敗し得るダンプです。同期的なディスク書き込みと binder 往復をするので dumpsys のタイムアウトに当たり得るし、権限を理由に丸ごと拒否するビルドもあります。
- キャッシュ側は最大 1 日古いです。いまこの瞬間の数字が欲しければ `df` か `du` を使ってください。
これには UI があります
Android Storage Analyzer はこのコマンドを USB 経由で実行し、返ってきたものを解析します。Chromium 系ブラウザだけで、SDK も不要、どこにもアップロードしません。
関連コマンド
dumpsys diskstats と同じ作業で出てくるコマンド。
| コマンド | 何をするか |
|---|---|
| df | マウントされているファイルシステムごとの空きと使用量を報告します。 |
| du | ディレクトリツリーが占めているディスク容量を報告します。 |
| pm trim-caches | 指定した空き容量に達するまで、システムにキャッシュファイルを捨てさせます。 |
| find | ディレクトリツリーを歩いて一致したものを印字します。大きなファイル、空のフォルダ、残骸を探すのに使います。 |
他のシステムサービス(dumpsys)コマンド
| コマンド | 何をするか |
|---|---|
| dumpsys battery | バッテリーサービスの現在の状態:残量、充電状態、健康度、電圧、温度。 |
| dumpsys thermalservice | 端末が発熱で性能を絞っているか、そしてハードウェア層が報告する各温度ゾーンを摂氏で表示します。 |
| dumpsys sensorservice | 端末にあるすべてのセンサーとそのベンダー、type、レート、バッチング。加えて直近の測定値のバッファ。 |
| dumpsys meminfo | どのプロセスがメモリを最も使っているかを、PSS(比例配分したサイズ)で表示します。 |
| dumpsys package | パッケージマネージャが知っているすべて:バージョン、パス、flags、インストール元、ユーザーごとの状態。 |
| dumpsys activity activities | いまどのアプリが前面にいるか、そしてその背後のタスクとスタックの構造。 |
| dumpsys dropbox | クラッシュ、ANR、tombstone を保持するプラットフォームのリングバッファ。root なしで ANR トレースを読む方法です。 |
Web ADB ツール群のパーサを書きながら、AOSP・toybox・カーネルのソースに突き合わせて確認しています。バージョンやメーカーで本当に挙動が変わるところは、世界の半分の端末で間違いになる数値を出す代わりに、そう書いてあります。