实时读懂手机的 CPU、GPU、电池与温度。
纯只读 · 不写系统节点 · 免 root 可用 · 读不到的数据如实显示
真机实拍 · 中兴天机 A41 Ultra(骁龙 8 Gen1 / Adreno 730)· 截图未作修饰
Mio 澪 是一款安卓硬件参数与性能监控应用。它把设备能够读到的硬件信息,尽可能完整、准确地呈现出来:CPU 每核频率与占用、GPU 负载与频率、电池电压电流功率与健康度、几十路热区温度与散热动作、内存与传感器。
界面遵循浅色 iOS 风格,以卡片分组组织信息,曲线与数字使用同一套换算口径。设计目标是克制:不炫技、不堆叠装饰,让数据本身成为视觉主体。
只读。 不写任何系统节点,不修改任何设置,不申请与功能无关的权限。它只读取,不干预。
免 root 可用。 安装后即可读取电量、内存、传感器以及多数机型的 CPU 频率与占用。安装 Shizuku(非 root,一次性授权)后,热区温度、CPU 占用、充电器输入侧电压电流进一步开放。
读不到的如实显示。 无法读取的项显示「–」并说明原因与授权入口,不使用 0 代替。监控工具的价值建立在数据可信之上,这一条不作妥协。
澪是应用的角色形象,作为人格化点缀融入界面,而非信息主体:7 张分页立绘固定立于内容区右侧,卡片为半透明材质,角色从卡片下自然透出;另有 5 种表情差分用于弹窗与空态,10 页新手引导由她依次说明权限边界与各页面内容,部分说明文字亦以她的口吻撰写。立绘均为透明底 PNG,并处理过边缘白边与裁切问题。
设置页把外观分成两组相互独立的选项:配色只换颜色,角色整组更换(立绘 + 表情 + 配色)。先挑角色、再用配色微调,两者不会互相覆盖;新手引导整篇也会跟随当前角色与配色变化。
角色美术素材属于第三方版权物,不随本仓库分发。自行准备同名图片放入
app/src/main/res/drawable-nodpi/即可启用对应角色;素材缺失时该角色不会出现在设置里,已选中的也会自动回落默认角色。
每核当前频率与占用;依据 cpufreq 动态分簇并区分超大核、性能核、能效核(各有专属标识色);总占用曲线;频率档位驻留(time_in_state,反映一段时间内 CPU 在各频率上的停留比例);governor 与各簇频率上限;/proc/loadavg。
占用曲线、频率(MHz)与核心温度。自动识别高通 Adreno、ARM Mali、联发科 GED 三类节点并逐级回退,适配不同平台时无需修改代码。
电量、充放电状态、电压、电流、功率;充电器协商上限;健康度、设计容量与学习容量、循环次数、开路电压、截止电压、充入电量、充电限流档位;24 小时容量趋势;按当前功率估算的充满与续航时间。
功率口径经过多轮真机校准:充电时优先采用适配器输入侧的 V×I,而非电池侧,避免同一时刻两处数值不一致;充电类型判定不依赖单一标志位。
分别给出最高结温、平均温度与外壳(手感)温度——三者口径不同,结温必然高于外壳,混合统计会得到错误结论。此外提供距温度红线的余量、当前生效的热缓解动作(哪一项在降频、降至第几档)、按 CPU / GPU·NPU·内存 / 射频·充电·外壳 三组的热区列表,以及 84 格热图。
部分机型的 thermalservice 中存在恒定值、哨兵值或根本不是温度的"僵尸热区",它们会占据列表、个别还会把最高结温顶高。应用按非温度节点、哨兵值(内核以 −273 °C 表示传感器不存在)、以及连续 45 次采样波动不超过 0.3 °C(按显示精度判定,而非"逐位相同")三类规则剔除,并在统计中一并排除。在测试机上显示热区由 81 个降至 37 个,留下的是真正在变化的读数。
内存与 Swap 明细;加速度、陀螺仪、磁力计、光线、距离等真实物理量;并可直接读取系统的 Thermal HAL,获得分类温度(CPU / GPU / 电池 / 外壳 / 电压 / 电流 / 电量 / NPU)与热状态等级。
两部安卓设备安装同一应用,即可分别担任被监控端与监控端。
- 被监控端:前台服务每秒采集数据,通过 mDNS 广播,在局域网内推送
- 监控端:自动发现并连接,支持同时观察多台设备;每台设备展示 CPU 各核频率、结温、电量、HAL 分类温度、内存 / GPU / 充电等信息,可下钻至单设备详情页查看历史曲线
- 传输范围:仅限局域网点对点,不经过任何外部服务器,无需账号
被监控端内置常驻通知、开机自启与 JobScheduler 兜底,并针对 OPPO、vivo、小米、华为、三星等品牌提供逐项的后台保活设置引导。
| 档位 | 可读取范围 |
|---|---|
| 免提权(默认) | 电量、电池温度与电压、内存、传感器、部分 GPU 占用、多数机型的 CPU 频率 |
| Shizuku(推荐,无需 root) | 热区温度、散热动作、CPU 占用、充电器输入侧电压电流、更多 sysfs 节点 |
| Root | 个别被 SELinux 限制的节点(例如部分机型的 Adreno GPU 频率) |
未授权时相关卡片显示空态并提供授权入口,不影响其余功能。
- 配色预设:内置 6 套(晴空蓝 / 薄荷青 / 雾天青 / 暖奶米 / 浅草 / 紫藤),设置页即时切换。每套都按对比度取值——强调色压得住顶栏白字,卡片与页面底保持可分辨的亮度差,次级文字不低于 4.5:1;顶栏徽章、按钮、选中态的文字跟随主题前景色,浅色主题下不会出现白字看不清。
- 玻璃效果三档:
完整(半透明 + 顶部高光 + 光泽柔化,Android 12 及以上使用 RenderEffect)/简约(更实、叠加层更少、功耗更低)/关闭(全实色卡片)。切换即时生效。 - 触感反馈:底部导航与卡片按下均有震动,强度分轻 / 中 / 重三档;设置页提供按键,按住可持续震动、松手即停,便于直观比较。
- 动效规范:全局采用单一缓动曲线与统一时长(按下 130ms、松开 240ms、导航指示器 280ms、数值 320ms)。导航指示器平滑移动;卡片按下轻微收缩、阴影与明度同步下沉,抬起平滑恢复。
- 内容层级:文字与图表始终位于最上层,模糊仅作用于其下的材质层,不会影响内容清晰度。
- 数值过渡:CPU 占用、温度、内存等高频变化数值采用插值滚动,避免逐秒跳变。
- 无障碍:跟随系统「关闭动画」设置,开启时所有动效直接切换。
设置页可导出 CSV,分三段:META(时刻、机型、版本)、RAW(内核原始单位、零换算、附来源节点路径)、RENDERED(与界面一致的换算值及所属页面)。UTF-8 BOM 编码,全字段引号转义,写入设备「下载/Mio」目录并保留最近 5 份。
保留 RAW 段的目的,是便于他人核对口径而非仅接受结论。
首次启动提供 10 页使用引导。
# 需 JDK 17 与 Android SDK 34
./gradlew assembleDebug
# 产物:app/build/outputs/apk/debug/app-debug.apk| 语言 / UI | Kotlin 2.0.21 · Jetpack Compose(Material 3) |
| 构建 | AGP 8.7.3 · Gradle 8.10.2 · JDK 17 |
| 支持范围 | minSdk 26(Android 8.0)· targetSdk 34 |
| 架构 | 单 Activity + Compose;ViewModel 配合细粒度 StateFlow;硬件读取采用分层回退的 Reader |
| 网络 | 仅局域网:mDNS(NSD)服务发现 + TCP 长连接 |
实现要点
- 统一采集口径:本机界面与被监控端调用同一个
SnapshotCollector,两端数据与换算完全一致。 - 批量提权读取:单条 shell 命令取回热区、频率、loadavg、散热状态等,每帧跨进程往返由 11 次以上降至 1 次。
- 不写死机型:SoC、GPU、热区、电源节点均按平台探测并逐级回退。
- 细粒度订阅:各卡片仅订阅自身所需数据,数值未变不触发重组;滚动上下文使用动态
compositionLocal,避免滚动时整页重组。 - 启动与回前台:先输出电量与内存的轻快照,再补充需授权的数据;回前台只合并不回退,不会短暂显示「需要授权」。
- 只读:需要写权限才能获取的数据无法读取。
- GPU 频率:个别机型(如中兴天机 A41 Ultra)对应用与 shell 均拒绝该节点访问,需 Root。
- 触感强度:少数机型的厂商 HAL 不提供振幅接口,此时「轻 / 中 / 重」只能通过时长与波形区分。
- 后台保活:被监控端已内置多重保活与厂商设置引导,但仍需在系统层面放行。
- 语言:目前仅提供简体中文,文案尚未抽取为字符串资源。
本机监控完全离线。双模式仅在局域网内向用户自有设备传输数据,不经过服务器,不采集也不上传任何个人信息。CSV 仅写入本机存储。




