ByteScope

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 permission2 つの権限のうち、後者で落ちています。`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 も不要、どこにもアップロードしません。

Android Storage Analyzer を開く

関連コマンド

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・カーネルのソースに突き合わせて確認しています。バージョンやメーカーで本当に挙動が変わるところは、世界の半分の端末で間違いになる数値を出す代わりに、そう書いてあります。

よくある質問

adb shell のコマンドはどう実行しますか?

端末で開発者向けオプションと USB デバッグを有効にし、ケーブルを繋いだうえで、platform-tools を入れた機械から adb shell <コマンド> を実行します。adb shell だけを実行すれば対話プロンプトが出て、接頭辞なしで打てます。スクリーンショットのようにバイナリを出力するコマンドでは adb shell ではなく adb exec-out を使ってください。素のシェルサービスは端末を割り当て、それが改行のバイトを書き換えてデータを壊します。

adb shell のコマンドに root は必要ですか?

このリファレンスにあるものには不要です。すべて shell ユーザーとして動き、自分の Android ユーザー向けのパッケージ管理、ほとんどの dumpsys サービスの読み取り、設定プロバイダへの書き込み、入力の注入、共有ストレージの読み取りができます。root が必要なのはこのリファレンスがあえて避けていること、つまり他のアプリのプライベートデータの読み取り(debuggable なビルドに対する run-as を除く)、システムパーティションへの書き込み、/data/anr の直接読み取りです。

自分の端末では出力が違って見えるのはなぜ?

Android のバージョンか、メーカーのどちらかです。一部のフラグやフィールドは特定のリリースから入ったもので、それはコマンドごとに注記しています。残りはメーカーによる改変で、いちばん影響が大きいのは dumpsys です。ダンプはデバッグ出力で、そのテキストはサービスの作者が最後に印字した内容そのもの、しかもメーカーはそれを変えて自分の変更をバックポートします。フィールドは位置ではなく名前で読み、見慣れない形は失敗ではなく差分として扱ってください。

端末ではなくブラウザから実行できますか?

多くのコマンドは可能です。このサイトの Web ADB ツール群は、Chromium 系のデスクトップブラウザから WebUSB で端末と話し、SDK のインストールも不要、どこにもアップロードしません。各ページは、該当するツールがあればそこへリンクしています。知っておく価値のある制限が 2 つあります。ADB インターフェイスを保持できるプログラムは同時に 1 つだけなので、デスクトップの adb server は先に止める必要があります。そして adb forward と adb reverse はブラウザでは一切動きません。

打つより押したい場合は、Web ADB Toolkit がこの種のコマンドをブラウザから USB 経由で実行します。あるいは全コマンドを見る。