自 2025 年 3 月 27 日起,我们建议您使用 android-latest-release
而非 aosp-main
构建 AOSP 并为其做出贡献。如需了解详情,请参阅 AOSP 的变更。
实现 storaged
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
Android 8 添加了对 storaged
(一个 Android 原生守护程序,可在 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
,以在 bug 报告中记录应用 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 使用情况,请使用带有 -u
选项的 storaged
命令。
命令: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 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-07-27。
[null,null,["最后更新时间 (UTC):2025-07-27。"],[],[],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```"]]