HyperDuo

把状态栏里的 Wi-Fi、移动信号、电量 合并成一个仿 iPhone「Duo」风格的三合一图标。

HyperDuo 在真实状态栏里的效果

HyperDuo 是一个 LSPosed 模块,只作用于系统界面(com.android.systemui)。开启后,原本分开的 Wi-Fi 图标、信号格与电池图标被替换成一个整体字形:外圈是电池环(缺口在下方,按电量点亮), 环里是 Wi-Fi 弧线(弧数跟随真实信号强度),底部是移动信号点,环内是电量数字(充电 时变成闪电,快充为琥珀色)。

所有元素都能单独开关,尺寸和颜色可以按自己的状态栏习惯微调,改完立即生效,无需重启。 关掉其中任何一项,对应的系统原生图标都会回到原本的位置——每个开关都是「用三合一的画法」与 「用系统原本的画法」之间的切换,而不是简单地少画一笔。

效果预览

六种典型状态:充电、快充、正常、无 Wi-Fi、省电、危险

从左到右:充电、快充、正常、无 Wi-Fi(显示网络类型)、省电、危险。这套预览也内置在设置界面顶部, 会跟着你的设置实时变化。

要求

  • 系统:HyperOS / MIUI
  • Android:10 及以上(API 29+)
  • 框架:支持 libxposed API 102 的 LSPosed,例如 LSPosed 2.2.0-it(7890)
  • 作用域:系统界面(com.android.systemui)

目前只在 小米 14 · HyperOS 4 · Android 17(API 37) 上做过完整验证。其他 HyperOS / MIUI 机型 理论可用;状态栏内部实现不同时,对应功能会自动跳过并写下日志,不会崩溃。

安装

  1. 从 Releases 下载最新的 HyperDuo-*.apk 并安装。

    包名已更换:从 1.4 起是 io.github.yixing233.hyperduo(1.3 及更早是 com.hyperduo.trio)。 包名变了就是另一个应用,无法覆盖升级:请先卸载旧版(设置会一起清掉),再安装新版。

  2. 打开 LSPosed 管理器 → 模块 → 启用 HyperDuo。
  3. 在模块的作用域里勾选 系统界面。
  4. 重启系统界面让模块生效。

安装后桌面会出现 HyperDuo 图标,点开即可;也可以在 LSPosed 管理器里点击模块进入。

几个亮点

字形画在独立窗口里。 状态栏窗口只有约 43dp 高,三合一要完整显示需要更高,超出的部分过去会被 窗口边界直接裁掉。「独立窗口绘制」默认开启:字形被画进一个只属于它自己的小窗口(不接收触摸), 完整可见,不再被状态栏高度截断;代价是图形下半部分会露在状态栏背景之外。下拉通知栏、进最近 任务、应用启动动画、全屏应用隐藏状态栏、充电动画岛接管时,独立窗口都会先让位、由状态栏内的绘制 路径顶上,状态栏恢复静止后再回来。关掉开关即回到原来的状态栏内绘制。

双卡分两排画。 打开「双卡信号」后改成上下两排信号点,上排是卡一、下排是卡二。圆环样式下 两排点正好落在圆环的两个缺口里:上排把 12 点钟的缺口张到与底部开口等宽。圆环顶部只有一个缺口, 占用顺序是「双卡 → Wi-Fi 弧 → 环内网络类型」,都不满足时圆环闭合成整圆;只有环内充电闪电 (需同时开启「充电时显示闪电」)排在最前。信号电平与系统状态栏取同一个来源(MIUI 的 getMiuiLevel()),不会出现「系统满格、这里少一格」。

信号也可以画在环外。 把「信号位置」改成环外,移动信号就从圆环底部挪到电池图标旁,和原生 信号格同一个位置。此时打开「堆叠信号」,模块自己接管那一处读数:四条高度递增的圆头柱表示一张 卡,下方一排圆点表示另一张卡;双卡还能再打开「仅显示上网卡」。关闭「堆叠信号」则把移动信号 整体交还系统原生信号格。环外读数的大小由「环外信号大小」单独控制,按 dp 而不是百分比——默认 15dp 正好与图标同高,且不随状态栏那一行(下拉控制中心时会变高)变化。读数离电池的间距也能用 「环外信号间距」调整,它是会占位的边距——调大时读数远离电池、原生图标同时让出同样宽度, 不会压到旁边的图标上。

「5GA」里的 A 会小一号。 网络类型以 A 结尾时(5GA、4GA 之类),末尾的 A 按一个独立比例缩小、 底边与主字对齐,默认 65%(照着参考图量的),环内环外都生效。环外网络类型标签左右两条边距也能 分别调,想让它离图标近一点或远一点都可以。

两种排布、两种重心。 「三合一样式」可以换成矩形:左右两列信号点夹住中间内容,底部是一条 电量条。打开「电量数字居中」则把数字放大到环心,Wi-Fi 弧缩到顶部缺口,充电时改用缺口里的小闪电。

电池旁边还能看充电功率和温度。 「充电功率」显示的是电池自身电流的幅值 × 电压,也就是真正充进 电池的功率——随电量升高会逐渐变小,刻意不取充电器协商的最大档位;电流的正负号各家平台不一致 (本机充电时答负数),所以只取幅值。没接充电器时这一段直接不显示 (而不是显示 0W)。「电池温度」取整到整摄氏度,不接充电器一样显示。两项默认都关、开关各自 独立,共用电池图标旁的同一处位置,且一项占一行:只开一项就只显示那一项,两项都开则上下两行 显示。读数以「环外网络类型字号」为基准:只开一项时与环外标签一样大,两项都开时按电池图标的 高度自适应缩小,让两行合起来不高于一个图标;空间实在太窄时会在基准字号的六成处封底,此时两行 会略微高过图标一点,而不会缩到看不清。这个基准之上还有「读数整体尺寸」可以整体放大或缩小 (60 – 150%),以及「读数字重」调它们的笔画粗细(100 – 900);两项设置都只作用于这两项读数, 只开一项时也照常生效。

整个字形也能整体缩放。 「图标整体尺寸」把三合一字形作为一个整体缩放(60 – 100%), 描边、弧线与数字按同一比例一起变,字形始终居中。它只能往小缩:系统给电池图标预留的框只有 约 28dp × 20dp,100% 已经是这个框允许的最大值,再大只会画到框外去。

两项读数的字号与字重也能单独调。 在自适应字号之上还有「读数整体尺寸」(60 – 150%,可大 可小)整体缩放这两项读数,「读数字重」(100 – 900)调它们的笔画粗细。

颜色跟着状态走。 低电量、充电、危险电量可以分别为深色底和浅色底各设一套颜色,优先级是 危险电量 → 低电量 / 省电 → 充电 → 前景色;底纹与未激活的信号点跟随状态栏本身的前景色。

全部设置项与默认值见主仓库说明。

常见问题

改完设置需要重启系统界面吗?

不需要,模块通过框架的远程配置通道实时接收变更,改完立刻重绘。如果确实需要重启(例如刚装上模块、 或系统界面状态异常),设置里提供了重启入口,它需要 root 授权。

状态栏完全没有变化?

依次确认:模块已在 LSPosed 中启用 → 作用域勾选了「系统界面」→ 已经重启过系统界面。显示「已激活」 但图标没变,通常就是作用域没勾选。若三者都满足仍无效,请检查是否还有别的状态栏模块在改同一区域。

升级后设置全没了、LSPosed 里还多出一个同名模块?

包名换了(com.hyperduo.trio → io.github.yixing233.hyperduo),Android 会当成两个不同的应用: 旧版不会自动升级、旧设置不会迁移、LSPosed 里两条并列。卸载旧的那条,只留新版即可。

打开「双卡信号」后还是只画一排点?

两排点需要三个条件同时成立:手机确实是双卡、两张卡都读到了电平、并且没有在画环内充电闪电。 任何一条不满足就回退成单排(当前上网卡)。注意抑制它的不是"在充电"而是"画闪电"——若「充电时 显示闪电」是关的,插着充电器时两排点照样会画出来。

几个已知限制

  • 「关了 Wi-Fi 弧还在」:不会。Wi-Fi 的有无有实时采样兜底;但信号等级依赖系统界面内部 的资源名解析,个别固件改走别的绑定路径时,弧线可能只显示为不点亮(不会崩溃)。
  • 切换「显示移动信号点」后没有马上变化:信号点只在信号等级变化时刷新。系统界面在移动视图淡出后 仍报告「可见」,模块无法从中判断开关状态,需等下一次信号变化或重启系统界面。
  • 字号调大后字形被裁切:系统给电池图标预留的区域是固定的(28dp × 20dp),几何参数只改变绘制 内容、不改变预留尺寸。极端值下字形可能超出可用范围,调小一点即可。

支持

致谢

设置界面基于 Compose + Miuix 实现 MIUI 风格。

Releases

1.6.12

Stable

10/13/2026, 2:46:33 PM

新增

  • 状态栏性能读数:充电功率与电池温度(默认都关,各自一个开关,都在「常规」页)。
    • 充电功率取的是电池自身的电流 × 电压,也就是真正充进电池的功率,会随电量升高逐渐变小;
      刻意不取充电器协商出来的最大档位——那个数字在功率已经掉下来之后仍然不动。不足 10W 保留一位
      小数。没接充电器时不显示这一段,而不是显示 0W(0W 是一个读数,而没接充电器是「没有这个
      读数」)。
    • 电池温度取整到整摄氏度。温度是电池自己的属性,不接充电器同样显示。
    • 两项共用同一处位置,且一项占一行:只开一项就只显示那一项,两项都开则上下两行显示。字号以
      「环外网络类型字号」为基准,两项都开时按电池图标的高度自适应缩小,让两行合起来不高于一个图标;
      空间实在太窄时会在基准字号的六成处封底,此时两行会略微高过图标一点,而不会缩到看不清。
  • 「图标整体尺寸」(尺寸页,60 – 100%):整个三合一图标相对状态栏给定框的百分比,默认 100%。
    状态栏的框只有约 20dp 高,所以只能缩小、不能放大;100% 就是系统给多大画多大。缩小时描边、圆弧
    与文字按同一比例一起缩,形状不变。
  • 「读数整体尺寸」(尺寸页,60 – 150%):两项读数在自适应大小之上的百分比,默认 100%。这是
    「自适应字号」之上的最后一次缩放,乘在每一种答案上,所以只开一项的读数也有可见效果。
  • 「读数字重」(尺寸页,100 – 900,默认 700):两项读数文字的笔画粗细。它独立于「数字字重」与
    「网络类型字重」,改它不会连带把旁边的 5G 标签一起加粗。
  • 圆环顶部缺口的占用顺序改为「双卡 → Wi-Fi 弧 → 环内网络类型」:缺口只有一个位置,此前是各个
    占位者各自判断,会出现「双卡排让开了、Wi-Fi 弧也没画、缺口空着」这种谁都没占的情况。现在按上面
    的顺序仲裁,只有环内充电闪电能压过双卡排。锁定「充电时显示闪电」关掉时,闪电交还系统绘制,缺口
    也就重新腾给双卡排(此前是按「正在充电」判断的,插着电但闪电关掉时缺口会白白空着)。

修复

  • 充电功率不再长期显示 0.0W:此前把负的 current_now 当成「正在放电」折成了 0,而这台机器
    充电时回的就是负数——实测 USB 供电、状态 charging、charge_counter 同时在涨的情况下,连采
    8 次全是 -115000 … -204000 µA。于是每一个真实的充电电流都被判成 0,状态栏一直停在 0.0W,只有
    采样抖动恰好落在正值时才闪出一次真数。电流的正负号各家平台不一致,现在只取幅值;答不出来仍返回
    「未知」而不是 0,真零仍是真零。
  • 读数旁边的原生图标不再频繁横移:功率大约每秒更新一次,此前每一次更新都会让电池旁预留的宽度
    重新算一遍,MIUI 的整排原生图标就跟着左右滑一下(用户报告「功率数字的变化会导致左侧图标位置
    跳动」)。根因在拆卸路径:removeOutTypeLabel / removePerfLabel 的第一步都是先把预留交还,
    排在「到底有没有挂东西」的判断之前,而这两个方法每次同步都会跑(环外网络类型默认关闭,
    「根本没有标签」是常态路径),视图为空时直接返回、不再重新预留——于是图标行的 padding 每轮
    107 → 0 → 107 地乒乓,整排图标横移 107px 再弹回。现在两个方法只负责移除自己那一个视图,预留
    宽度交给唯一的权威去算,它按实际在屏的视图求和、总和为零时自己交还。

优化

  • 精简了设置页的描述文字:「常规」页与「尺寸」页每一行的说明都压缩到一两句,去掉了重复解释
    开启方式与显而易见的后果的部分,把「为什么这样设计」这类内容留在文档里。
  • 「读数整体尺寸」与新增的「读数字重」放在「尺寸」页的整体尺寸小节,与「图标整体尺寸」相邻——
    它们和描边粗细、字号是一类东西(都是数字),而一页开关不是滑杆该待的地方。

说明

  • 两项读数默认关闭,什么都不开时状态栏与之前完全一致。
  • 真机已验证:功率读数在插着充电器时显示真实瓦数(1.3W / 0.6W / 4.52 KB/s 旁),不再停在
    0.0W;连续 14 帧截图里左侧原生图标钉死在同一位置,而同一个窗口内读数文本在 5 个值之间变化。
  • 回归验证:九条断言脚本全部通过(含 perf-layout 76 条、battery-presence 44 条、
    glyph-scale 17 条),其中两条新加的源码契约专门锁住上面那个「抢先交还」的写法,防止它被改回来。
  • 已知问题(与本模块无关):锁屏状态栏里的耳机与辅助电池图标不跟随反色。把模块整个关掉之后重启
    系统界面,这两个图标依然是白的,所以这不是本模块引起的行为;设备上该耳机电量图标由第三方模块
    moe.chenxy.huaweipods 绘制。若你也在用类似模块,可以往那个方向排查。

Assets

1

1.6.11

Stable

10/6/2026, 6:01:49 PM

修复

  • 锁屏上的原生信号图标不再与三合一重复显示:锁屏那一行的原生 5G / 信号 / Wi-Fi 图标此前
    折叠不掉,会和模块画的字形并排出现(用户报告「锁屏状态下显示状态栏异常」)。原因是折叠发生在
    那一行配置完成之前——系统在挂载之后还会重新配置并重新布局这一行,把折叠结果撤销;而且
    隐藏只施加了一次,系统自己把图标放回来之后就再没人管。现在在系统的配置回调之后再折叠,并且
    把模块自己绘制的槽位交给系统的忽略列表,让每次重新布局都跳过它们。
  • 关闭 Wi-Fi 后圆环弧线即时消失:此前关掉 Wi-Fi,圆环里的 Wi-Fi 弧线会残留,要重启系统界面
    才更新。根因是模块判断「Wi-Fi 在不在场」的依据会漏事件(Wi-Fi 广播来自特权组件,普通注册方式
    收不到),而且某次查询异常会让断开状态整个丢失。现在改为直接查询系统状态、并加了低频兜底复查,
    即使漏掉事件也能自行恢复。
  • 「独立窗口绘制」开关现在即时响应:此前点这个开关功能会立刻生效,但开关自己不动,要点
    别的开关才跟着变。原因是设置页比较快照时漏比了这一个字段,导致系统认为「值没变」而不刷新界面。
  • 独立窗口绘制的字形不再被状态栏窗口盖住:开启后字形有时画了却看不见(状态栏右上角空白)。
    系统另有一个覆盖整条状态栏的窗口与模块的窗口处在同一层,后加的会盖住先加的;现在改用层次更
    高的窗口类型,不再被覆盖。

说明

  • 感谢社区贡献者 @aodianjun 与 @L-aros:本轮四项修复中三项来自他们的 PR,另一项是其中的关联改动。
  • 真机已验证:关闭 / 打开 Wi-Fi 时圆环样式即时更新。
  • 真机已验证(日志层面):锁屏折叠所依赖的配置回调与忽略列表均已正常生效(钩子装上、槽位已交给
    系统忽略)。肉眼锁屏截图尚未复核,请在锁屏时留意一下;若仍有原生图标残留,欢迎回报。

Assets

1

1.6.10

Stable

10/5/2026, 5:40:51 PM

修复

  • 修复图标反色:状态栏、控制中心等多行会同一帧被系统染成相反的颜色(浅色桌面上的
    状态栏要白色、紧邻的控制中心要黑色),此前模块只记一个全局色槽,谁最后染色就由谁说了算,
    于是画出来的三合一图标与旁边 MIUI 图标颜色相反(用户报告「图标反色」)。现在染色按
    行归属,各取各的颜色。
  • 修复环外网络类型与环外信号重叠:环外模式下,「4G / 5G」等类型标签会被画在堆叠信号读数
    上面(用户报告「网络类型和移动信号重叠了」)。原因是两者都被放到同一个参照边上——标签本该
    贴着读数摆放,却和读数一样贴到了原生图标行的边缘,于是完全重合。现在标签以读数为锚点,
    两者在预留的空隙里并排站好。
  • 修复环外类型外侧边距不生效:有环外读数时,标签朝外那条边距(out_type_margin_left /
    _right 中背对电池的那条)没有计入为原生图标预留的宽度,把它调大时图标不会让位。现在两条
    边距都会被预留;默认值下预留宽度与之前一致,外观不变。
  • 修复环外字号 dp 换算口径:字号改为按屏幕密度换算,滑杆设定的 dp 真实生效。

调整

  • 环外网络类型字号范围调整为 8–26dp,默认 14dp:此前短暂出现过的 40–80dp 是对报告的误读
    ——用户实际看到的是标签与读数重叠,不是字号太小。现在回到能稳稳待在状态栏行内的区间。

Assets

1

1.6.9

Stable

10/5/2026, 12:20:46 PM

新增

  • 充电超级岛出现时保留三合一:此前岛弹出、电池被系统临时藏起时,模块会把三合一让位(Wi-Fi
    交还、信号改画到环外)。现在改为拒绝这次让位——电池保持原位、三合一照常绘制,岛在它旁边
    显示,Wi-Fi 与原生图标都不再交接。(采用 issue #9 报告者 L-aros 的方案,他在自己设备上验证过
    效果并提交了 PR #10。)

修复

  • 锁屏与下拉通知栏的原生 5G 不再与三合一重复(issue #7、#3):锁屏那一行与下拉头部用的是
    另一套容器,模块此前只折叠状态栏自己那一套,所以那两处的原生信号图标与「5G」标签一直和三合一
    同屏。现在锁屏链上的容器也参与折叠。
  • 深浅色切换时图标反色更跟手(issue #2 的残留):模块改为直接听取系统给图标上色的那次调用,
    而不是隔一拍去读状态栏的字段——返桌面、切深浅色时三合一与整行图标同步变色。
  • 环外网络类型字号恢复原始大小(huoyan1231 报告):上一版把该字号从像素改为 dp 存储时,
    从未调过该滑块的安装拿到的是一个固定默认值,只在特定屏幕密度上等于原来的 32px;其他密度
    的设备升级后字号就变小了。现在默认值按设备的实际密度折算,升级前后物理大小完全一致。

说明

  • 以上前三项来自社区报告与 PR(#7/#9/#10/#11 的作者 aodianjun、L-aros),已在开发文档中记录
    出处与设计取舍。

Assets

1

1.6.8

Stable

10/5/2026, 12:23:48 PM

新增

  • 独立窗口绘制(PR #1,作者 aodianjun):状态栏窗口本身只有约 43dp 高,三合一要完整显示
    需要更高,超出的部分过去会被窗口边界直接裁掉——这不是布局能修的,裁切发生在窗口层。现在打开
    「独立窗口绘制」开关(默认开启),三合一会被画进一个只属于它自己的小窗口:大小跟随电池图标、
    不接收任何触摸,因此完整可见,不再被状态栏高度截断;状态栏里你放在左边的其他内容不受任何影响。
    代价是图形下半部分会露在状态栏背景之外。关掉开关即回到原来的状态栏内绘制(超出部分按状态栏窗口
    裁剪)。

    配套的安全逻辑:下拉通知栏、进最近任务、应用启动动画、全屏应用隐藏状态栏时,独立窗口都会先让位
    (此时状态栏内的绘制路径接管,字形不会闪没),状态栏恢复静止后窗口再回来;充电动画岛接管
    状态栏时窗口同样隐藏,岛让位后恢复。已知小瑕疵:浅色模式下从深色状态栏的界面(如某些应用)返回
    桌面时,窗口里的字形可能短暂保持深色,下一次变色动画跟上是正常的。

    另有诊断增强:锁屏上原生信号图标若与三一同屏出现(issue #7,排查中),调试日志会记录该容器
    的视图链,报告者发日志即可定位。

修复

  • 重启后原生「5G」溢出到三一旁边(issue #9):冷启动时模块可能在用户配置送达前(实测约
    2.6 秒)先按默认配置布局,预留宽度为 0,原生 Wi-Fi / 信号图标全宽显示;用户「开关一下就好了」
    正是开关强制了重读。现在安装后 5 秒、20 秒各做一次延迟重读,快照真正变化才走正常通知路径重新
    折叠——正常启动只多付两次比较。

Assets

1

1.6.7

Stable

10/5/2026, 12:23:44 PM

修复

  • 充电超级岛下环外读数压在原生图标上(1.6.6 的回归)。电池被岛临时隐藏时,环外读数与标签
    的横向基准仍取「电池左边缘」,而系统此时已把原生图标行整体右移让位——读数因此落在比图标行末端
    偏左一个电池宽的位置,正好盖在被右移过来的网速 / 信号图标上。现在横向基准改为图标行自身
    的边缘
    :这是两种状态下都正确的基准,也正是为读数预留的那条条带收尾的地方。普通(非岛)状态
    下这两个基准是同一个像素
    ,所以日常外观完全不变。
  • 接管条件收紧:岛只改变信号画在哪里,不改变你是否要它。因此关掉「显示移动信号点」的
    用户,岛上原生信号图标会留在原地,不会被模块顶掉;开着信号的用户,岛上才由环外读数接管。

Assets

1