2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
storaged の実装
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
Android 8 では、Android ネイティブ デーモンである storaged
のサポートが追加されています。このデーモンは、Android デバイスでストレージ指標を収集して公開します。
- 日次ディスク統計については、
storaged
は定期的に /sys/block/mmcblk0/stat
(eMMC ストレージ デバイス)または /sys/block/sda/stat
(eMMC 以外のデバイス)を解析します。
- eMMC の寿命については、
storaged
は /d/mmc0/mmc0:001/ext_csd
(使用可能な場合)を解析します。
- アプリ I/O ブレーミングについては、
storaged
は /proc/uid_io/stats
を定期的に走査し、解析されたデータを保持します。このデータには、実行中のアプリだけでなくすべてのアプリのデータが含まれます。dumpsys
で storaged
を呼び出すと、アプリ I/O の使用状況をバグレポートに記録できます。
ディスク統計(中断したディスク統計を含む)と eMMC 情報は Android イベントログに記録されます。このログは、プラットフォーム チェックイン サービスによって収集されます。
storaged
オペレーションは自動的に行われ、全面的に Android フレームワークによって処理されるため、実装作業は不要です。このページでは、storaged
(新しいインターフェースを含む)の設計と、それを使用してカーネルから I/O ステータスを取得する方法について説明します。
storaged の設計
アカウントと権限の柔軟性を維持するために、storaged
は uid ごとの I/O 情報を返すカーネル モジュールとして実装されます(標準の proc/PID/io
は使用しません)。各 I/O リクエストの未加工の I/O データは、カーネル task_struct
に継続的に保存され、更新されます。カーネルは、プロセスが終了する時点をトラッキングして、最後の storaged
ポーリング イベントで発生する I/O の使用を見逃さないようにします。
フレームワークから uid フォアグラウンド / バックグラウンド スイッチを通知されたとき、または storaged
デーモンがレポートをリクエストしたときに限り、モジュールは未加工データを読み取って処理します。その時点で、モジュールはフレームワークおよび storaged
デーモンと通信するために、カーネルからファイルノードをエクスポートします。
storaged
が導入する /proc/uid_io/stats
インターフェースは、システム内の UID ごとに I/O ステータスのリストを返します。リストの形式は次のとおりです。
<uid>: <foreground read bytes> <foreground write bytes> <foreground read chars> <foreground write chars> <background read bytes> <background write bytes> <background read chars> <background write chars>
- 読み取り / 書き込みバイトは、ストレージ デバイスからの I/O イベントです。
- 読み取り / 書き込み文字(これもバイト単位)は、読み取り / 書き込みシステムコールによってリクエストされるデータです。
カーネルから I/O ステータスを取得する
カーネルから I/O 使用量をダンプするには、storaged
コマンドを使用して、-u
オプションを指定します。
コマンド: storaged -u
コマンド出力形式: name/uid fg_rchar fg_wchar fg_rbytes fg_wbytes
bg_rchar bg_wchar bg_rbytes bg_wbytes fg_fsync bg_fsync
注: この出力は proc/uid_io/stats
の出力に似ています。これは、storaged
が /proc/uid_io/stats
からのデータを処理して独自のデータを生成するためです。
出力例:
com.google.android.backuptransport 2269 60 0 0 1719845663 143912573 149065728 184180736
com.android.vending 2170 60 0 0 219904796 38693092 174436352 18944000
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-07-27 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-07-27 UTC。"],[],[],null,["# Implement storaged\n\nAndroid 8 adds support for `storaged`, an Android native daemon that\ncollects and publishes storage metrics on Android devices.\n\n- For daily diskstats, `storaged` periodically parses `/sys/block/mmcblk0/stat` (eMMC storage devices) or `/sys/block/sda/stat` (non-eMMC devices).\n- For eMMC lifetime, `storaged` parses `/d/mmc0/mmc0:001/ext_csd` (if available).\n- For app I/O blaming, `storaged` periodically traverses `/proc/uid_io/stats` and maintains parsed data, which includes data from all apps (not just running apps). `dumpsys` can call `storaged` to log the app I/O usage in a bug report.\n\nDiskstat (including stalled diskstats) and eMMC information is logged to the\nAndroid event log, where a platform checkin service collects the logs.\n\n`storaged` operations occur automatically and are handled entirely by the Android\nframework, so you don't need to do any implementation work. This page\ndescribes the design of `storaged` (including new interfaces) and how to use it to\nget I/O status from the kernel.\n\nstoraged design\n---------------\n\nFor accounting and permission flexibility, `storaged` is implemented as a kernel\nmodule that returns per-uid I/O information (instead of using standard\n`proc/PID/io`). Raw I/O data for each I/O request continues to be\nstored and updated in kernel `task_struct`, and the kernel keeps\ntrack of when a process exits so it doesn't miss I/O usage that occurs from the\nlast `storaged` polling event.\n\nThe module reads raw data and processes it only when the framework notifies it\nof a uid foreground/background switch or when the `storaged` daemon requests a\nreport. At that time, the module exports a file node from kernel for\ncommunication with framework and `storaged` daemon.\n\n`storaged` introduces the `/proc/uid_io/stats` interface, which returns\na list of I/O stats for each UID in the system. The format is: \n\n```\n\u003cuid\u003e: \u003cforeground read bytes\u003e \u003cforeground write bytes\u003e \u003cforeground read chars\u003e \u003cforeground write chars\u003e \u003cbackground read bytes\u003e \u003cbackground write bytes\u003e \u003cbackground read chars\u003e \u003cbackground write chars\u003e\n```\n\n- read/write bytes are I/O events from a storage device.\n- read/write chars (also in bytes) are data requested by read/write syscalls.\n\nGet I/O status from the kernel\n------------------------------\n\nTo dump I/O usage from the kernel, use the `storaged` command with\nthe **`-u`** option.\n\nCommand: `storaged -u`\n\nCommand output format: `name/uid fg_rchar fg_wchar fg_rbytes fg_wbytes\nbg_rchar bg_wchar bg_rbytes bg_wbytes fg_fsync bg_fsync`\n\n**Note:** This output is similar to the output for\n`proc/uid_io/stats`. This is because `storaged` processes data from\n`/proc/uid_io/stats` and generates its own data.\n\nExample output: \n\n```\ncom.google.android.backuptransport 2269 60 0 0 1719845663 143912573 149065728 184180736\ncom.android.vending 2170 60 0 0 219904796 38693092 174436352 18944000\n```"]]