MiFitnessAdAway

Remove ads from Xiaomi Mi Fitness (Xiaomi Sports & Health, com.mi.health/com.xiaomi.wearable 3.0+). A modern LSPosed module built with libxposed API 102.

Remove ads from 小米运动健康 (com.mi.health/com.xiaomi.wearable 3.0+) - 现代 libxposed API 102 模块。

What it removes / 移除内容

  • Splash ads / 开屏广告
  • Home health tab promotion cards / 首页健康页推广卡片
  • Device tab promotion cards / 设备页推广卡片
  • Device red dots (bottom nav "Device" tab + home "System settings" entry) / 设备红点(底部"设备"tab + 首页"系统设置"入口)
  • Sport tab carousel & operation cards (below "training index") / 运动页轮播卡与运营卡(训练指标以下)
  • Mine tab VIP membership card & doctor consultation card / 我的页 VIP 会员卡与健康问诊卡
  • Health detail pages consultation cards (Sleep / Heart rate / SpO₂ / Stress) / 健康详情页问诊卡片(睡眠 / 心率 / 血氧 / 压力)
  • Sleep research / improvement cards / 睡眠研究 / 改善卡片
  • Weight page personalized plan card / 体重页个性化减重方案栏
  • Trial watchface auto-export (re-ID'd, third-party import) + cleanup protection + configurable export location (Download / Documents + subfolders) / 试用表盘自动导出(换新 ID,第三方导入)+ 防删除保护 + 导出位置可自定义(Download / Documents + 子目录)
  • App update dialog ("Update available" prompt) / 应用更新弹窗("发现新版本"提示)
  • Band ↔ phone DND sync restored on Android 15+ / Android 15+ 恢复手环 ↔ 手机勿扰同步
  • VIP promo popup ("会员限时低价福利" / "抢先购买", shipped unverified) / 会员推广弹窗("会员限时低价福利"/"抢先购买",未验证发布)

A built-in grouped-card settings UI with 17 toggles is included (dark/light theme aware). Groups follow the page each switch belongs to, collapse by tapping a group title, and a top card shows the enabled-count summary together with the master switch; dependent switches dim while the master is off. 内置分组卡片式设置界面(17 个开关,跟随系统深浅色)。分组按开关所属界面划分,点标题可收起/展开,顶部卡片为启用数摘要 + 总开关;总开关关闭时依赖它的开关自动置灰。

Requirements / 要求

  • LSPosed ≥ 2.1.1 (Zygisk) / KernelSU
  • com.mi.health/com.xiaomi.wearable 3.0+ (each hook installs independently; missing entry points on a version are skipped gracefully)

Build / 构建

gradle assembleRelease

Requires Gradle 9.5.1, AGP 9.2.1, JDK 17, compileSdk 37.

License

Apache License 2.0

Releases

v1.3.0

Stable

9/16/2026, 12:56:54 PM

v1.3.0 (versionCode 32)

English

New: configurable export location
The watchface export folder is no longer fixed to Download/ — a new "Export location" row in the Watchface card opens a dialog where a relative path is entered, e.g. Download/表盘导出 or Documents/2026/面孔. Multi-level and Chinese names are fine, and Reset to default restores Download.

  • Allowed first-level folders are Download and Documents. This is not our choice: MediaStore rejects anything else for third-party apps (Primary directory X not allowed for content://media/external/file; allowed directories are [Download, Documents]), so other roots fall back to Download with a warning instead of failing mid-export.
  • Deduplication is now location-aware: after the folder changes, previously exported faces are no longer considered exported, so they can land in the new folder — this also removes the old "changed the folder but no file appeared" trap.
  • When the location changes, a dialog asks whether already-exported faces should be re-exported to the new location; the re-export starts the next time the "Mine" page is opened.
  • Writes go through the MediaStore Files collection, so no storage permission is needed, and notification/Toast text now reports the real destination.

Verified on device (Android 16): after switching to Documents/faces, a real 4.25 MB trial face was exported as 蜘蛛侠超感大眼_190917425583.bin in the new folder; an unsupported root was rejected and fell back to Download instead of throwing.

中文

新增:导出位置可自定义
表盘导出目录不再固定为 Download/ —— 「表盘」卡片新增「导出位置」一行,点开可填相对路径,例如 Download/表盘导出Documents/2026/面孔。支持多级与中文,「恢复默认」回到 Download

  • 首级目录只允许 DownloadDocuments。这不是我们的取舍:MediaStore 对第三方 App 只放行这两个(系统报错原文 Primary directory X not allowed for content://media/external/file; allowed directories are [Download, Documents]),所以其他首级目录会带提示回退 Download,而不是导出中途失败。
  • 去重改为按位置判定:换目录后,之前导出的表盘不再算"已导出",能正常落到新目录 —— 顺带修掉以前"换了目录却没文件"的坑。
  • 改位置时会问是否把已导出的表盘重新导一份到新位置;选「重新导出」后,下次打开运动健康「我的」页即开始。
  • 写入走 MediaStore Files 集合,全程免存储权限;通知/Toast 文案会显示真实落盘位置。

真机验证(Android 16):切到 Documents/faces 后,一张 4.25 MB 的真实试用表盘成功导出为 蜘蛛侠超感大眼_190917425583.bin;填了系统不允许的根目录时被拒绝并回退 Download,不再抛错。

Full changelog: docs/CHANGELOG.md

Assets

1

v1.2.0

Stable

9/14/2026, 4:11:09 PM

v1.2.0 (versionCode 31)

English

New: Band ↔ phone DND sync restored on Android 15+
The official sync silently stopped working on Android 15 and later: ZenUtils.isSupportZenMode() returns false outright when SDK_INT >= 35, and registerZenListener / unRegisterZenListener / postSetZenMode are all gated by it — so neither direction ran, and the DND entry in device settings went dead with it. A new toggle (16 → 17, default off) turns this back on:

  • ZenUtils.isSupportZenMode is allowed to return true, so the whole chain works again
  • after FitnessApp.onCreate, the zen_mode content observer is re-registered (unregister first, so it does not stack up) — the app's own registration happens before the gate is lifted, so it never took effect
  • the sync switch itself is held on: reads of DeviceSettingsPreference.isZenModeOpen(did) return true, and writes that try to turn it off are swallowed
  • once at startup the band's rules are pulled back (getDeviceZenRules), which is what makes the band-to-phone direction work

Verified on device (Redmi K70 Ultra / Android 16 / Mi Fitness 3.59.1): phone → band follows, and band → phone follows as well.

Note

  • Mi Fitness must be granted notification-policy access (DND access) in system settings; the module only hints about it, since the permission is enforced by the system.
  • The band-to-phone direction is pulled once at app startup: changing DND on the band reaches the phone after the next Mi Fitness launch. Phone-to-band is instant (driven by a content observer).

中文

新增:Android 15+ 上恢复手环 ↔ 手机勿扰同步
官方同步在 Android 15 及以后悄悄失效了:ZenUtils.isSupportZenMode()SDK_INT >= 35 时直接返回 false,而 registerZenListener / unRegisterZenListener / postSetZenMode 全都被它门控——于是两个方向都不再工作,设备设置里的勿扰入口也一起失效。新增开关(16 → 17 个,默认关闭)把它恢复:

  • 放行 ZenUtils.isSupportZenMode 返回 true,整条链路重新生效
  • FitnessApp.onCreate 之后重新挂上 zen_mode 内容观察者(先 unRegister 再 register,避免重复叠加)——App 自己那次注册发生在放行之前,等于没生效
  • 同步开关保持开启:读 DeviceSettingsPreference.isZenModeOpen(did) 恒为 true,试图关闭的写入被吞掉
  • 启动时主动拉取一次手环侧规则(getDeviceZenRules),这是"手环 → 手机"方向能生效的关键

真机验证(Redmi K70 至尊版 / Android 16 / 运动健康 3.59.1):手机 → 手环跟随正常,手环 → 手机同样跟随正常。

说明

  • 需要在系统设置里给运动健康授予「勿扰访问权限」;该权限由系统校验,模块只做提示、不代揉。
  • 手环 → 手机方向在 App 启动时拉取一次:在手环上改勿扰后,下次启动运动健康即同步到手机;手机 → 手环是即时的(内容观察者驱动)。

Full changelog: docs/CHANGELOG.md

Assets

1

v1.1.0

Stable

9/10/2026, 3:57:11 PM

v1.1.0 (versionCode 30)

English

Major: settings UI redesign
The settings page is rebuilt from a flat 19-row list into grouped cards, so a switch is found by the page it belongs to instead of by scrolling:
Master (own card, with the "enabled x/11" summary) · Splash & popups · Mine · Sport · Device · Health detail · Watchface · Other.
Groups collapse/expand by tapping their title and the state is remembered. While the master switch is off, every switch that depends on it is dimmed and not tappable, so "I enabled a page switch but ads are still there" can no longer happen. No new dependency, no resource files — still plain platform views.

Removed: three switches that did nothing
"Home health promotion cards", "Device promotion cards" and "Announcement banner" were declared in settings but never read by any hook (banner clearing is gated by the master switch only, because the banner getter carries no page context). Switch count: 19 → 16.

Note: VIP promo popup still unverified
The popup fix shipped in 1.0.9 (MembershipDialogManager.showMembershipExpiredFaceDialog skipped, caller's dismiss callback preserved for the birthday-medal flow) is included here as-is. It is server-driven and cannot be reproduced on demand, so it remains unverified on device.

中文

重要:设置界面重构
设置页从一列 19 行平铺列表改成分组卡片,按「它属于哪个界面」找开关,而不是一路滑:
总开关(单独一张卡,带「已启用 x/11」摘要)· 开屏与弹窗 · 我的页 · 运动页 · 设备页 · 健康详情页 · 表盘 · 其他
点分组标题即可收起/展开,折叠状态会记住。总开关关闭时,所有依赖它的开关变灰不可点——"我开了单页开关怎么还有广告"这类困惑不会再出现。不引入任何新依赖、不加资源文件,仍是原生 View 手写。

移除:三个无效开关
「首页健康界面推广卡片」「设备界面推广卡片」「公告 banner」三个开关只存在于设置页,hook 侧从未读取。开关数 19 → 16。

说明:会员推广弹窗仍未验证
1.0.9 交付的弹窗拦截在本版原样包含;该弹窗由服务端下发、无法按需复现,故仍未真机验证。

Full changelog: docs/CHANGELOG.md

Assets

1

v1.0.9

Stable

9/10/2026, 2:09:32 PM

v1.0.9 (versionCode 29)

English

New: VIP promo popup removal
The full-screen membership marketing popup ("会员限时低价福利" / "腕上时尚" / "抢先购买", reported in issue #8) is now skipped via a new toggle (18 → 19, default on). The chain is MainActivity.dealWithMedal()MembershipHelper.showVipExpiredFaceDialog()MembershipDialogManager.requestMembershipExpiredFaceDialog()showMembershipExpiredFaceDialog(); blocking the last step means the popup never appears. The caller's dismiss callback is still invoked, so the birthday-medal flow it continues is left intact. Only this automatic chain is blocked — the user-initiated purchase dialog (showMembershipDialog, opened by tapping "开通会员") is untouched.

Note: not verified on device
This popup is server-driven and only appears on schedule, so the fix could not be reproduced and verified locally. It ships as-is in 1.0.9: if the popup still shows after a few days, please reopen issue #8 with a screenshot.

中文

新增:会员推广弹窗去除
全屏会员营销弹窗("会员限时低价福利"/"腕上时尚"/"抢先购买",issue #8 报告)新增开关去除(18 → 19 个,默认开启)。链路为 MainActivity.dealWithMedal()MembershipHelper.showVipExpiredFaceDialog()MembershipDialogManager.requestMembershipExpiredFaceDialog()showMembershipExpiredFaceDialog(),拦最后一步即弹窗不出现。同时仍回调调用方的 dismiss 回调,保证它继续拉取的生日勋章流程不受影响。只拦这条自动链路——用户主动点"开通会员"的购买弹窗(showMembershipDialog)不受影响。

说明:未在本机验证
该弹窗由服务端下发、按时机触发,无法在本机复现验证,1.0.9 按现状发布。若过几天仍会弹出,请在 issue #8 附截图重开。

Full changelog: docs/CHANGELOG.md

Assets

1

v1.0.8

Stable

9/9/2026, 3:52:47 PM

v1.0.8 (versionCode 28)

English

New: International app support
com.xiaomi.wearable (overseas edition) is now in scope alongside com.mi.health: package gates, watchface cache path and resource lookup all resolve per-package. Hooks fail soft per entry point, so unsupported screens on either app are skipped gracefully (contributed by @cloudskytian, PR #5).

Fixed: Sleep research leftovers
Follow-up hardening of the RN title-scan: marker fix ("21 天" has a space), whole-card locating and chain gap-fill now handle cards nested deep in containers. Native hooks kept for older versions.

Build: CI autofix
gradle build goes green again (missing notification permission for the export notifier, PR #6) and GitHub Actions now builds on every push/PR automatically (PR #7).

中文

新增:国际版支持
com.xiaomi.wearable(海外版)与 com.mi.health 同入作用域:包名门控、表盘缓存路径、资源查询全部按包动态解析。hook 逐入口失败隔离,不支持的页面优雅跳过(@cloudskytian 贡献,PR #5)。

修复:睡眠研究卡残留
RN 标题扫描后续打磨:标记修正("21 天"中间有空格)、整卡定位、链式填白,专治嵌在深层容器里的卡。原生钩保留给老版本。

构建:CI 修好
gradle build 重新变绿(导出通知缺权限,PR #6),GitHub Actions 此后每次推送/PR 自动构建(PR #7)。

Full changelog: docs/CHANGELOG.md

Assets

1

v1.0.7

Stable

9/9/2026, 2:36:17 PM

v1.0.7 (versionCode 27)

English

New: Weight plan card removal
The "个性化减重方案" whole card on the Weight page is now removed via a new toggle (17 → 18, default on). The page is React Native (YRNCFragment) with server-driven copy, so removal is a title-text view-tree scan on the shared RN host — no stable data hook exists.

Improved: Stress consult card
The Stress page consult card ("健康问诊") is covered by the existing health-consult toggle: same data-layer binder was already blocked, plus its static fallback content is now removed by the same RN title-scan (page-gated by "了解压力", no new toggle).

Fixed: Sleep research cards on 3.59.0
The Sleep page moved to React Native in 3.59.0, silently disabling the v1.0.2 native hooks — research/improvement cards reappeared. They are now removed by the same RN title-scan under the existing sleep-cards toggle (native hooks kept for older versions).

中文

新增:体重减重方案栏去除
体重页"个性化减重方案"整卡新增开关去除(17 → 18 个,默认开启)。该页为 RN 页(YRNCFragment)、文案服务端下发,走共用 RN 宿主标题文本扫描,无稳定数据接口。

改进:压力问诊卡
压力页问诊卡("健康问诊")纳入原有健康问诊开关:数据层同 binder 早已拦截,静态兜底内容改走同套 RN 标题扫描(以"了解压力"限域,不新增开关)。

修复:3.59.0 睡眠研究卡复活
3.59.0 睡眠页迁入 RN,原生钩静默失效,研究/改善卡重现。现改走同套 RN 标题扫描(沿用睡眠卡片开关,原生钩保留给老版本)。

Full changelog: docs/CHANGELOG.md

Assets

1

v1.0.6

Stable

9/6/2026, 2:22:19 PM

v1.0.6 (versionCode 26)

English

New: App-update popup removal
The "Update available" dialog (AppUpgradeUtil.showUpdateDialogIfNeed) is now skipped via a new toggle (16 → 17, default on). Background version check still runs, and manual update check on the Mine page is unaffected.

Change: version-agnostic support
The 3.58.0-only wording is dropped: every hook installs independently with isolated failure, so the module runs on com.mi.health 3.0+ and degrades gracefully where a version's entry points differ. No version checks in code, no version lock in scope.

Cleanup: Dead-code audit
Full audit (unused-method scan, imports, comments): no dead code — the tree was already clean after the v1.0.4 cleanup and v1.0.5 refactor.

中文

新增:应用更新弹窗去除
"发现新版本"弹窗(AppUpgradeUtil.showUpdateDialogIfNeed)新增开关去除(16 → 17 个,默认开启)。后台版本检查照常跑,"我的"页手动检查更新不受影响。

变更:版本通杀
去掉仅 3.58.0 的说法:每个 hook 独立安装、失败隔离,com.mi.health 3.0+ 均可运行,某版本入口有差异时优雅降级。代码无版本判断,作用域无版本锁定。

清理:无用代码审计
全量审计(无用方法扫描、import、注释):无死代码——v1.0.4 清理 + v1.0.5 重构后本就干净。

Full changelog: docs/CHANGELOG.md

Assets

1

v1.0.5

Stable

9/4/2026, 2:27:51 PM

v1.0.5 (versionCode 25)

English

New: Export explanation dialog
Turning on "Watchface auto-export (experimental)" now pops up a short guide: what auto-export does (re-ID'd 12→19Download/, third-party import, cleanup protection, exported-cache auto-cleanup, Toast/notification results) plus step-by-step usage. It shows only when the switch is manually flipped on — reopening settings never pops it again.

Note
The export switch stays off by default; all existing ad-removal and export features unchanged. v1.0.3 users should still upgrade (v1.0.3 keeps every trialed face in cache; fixed since v1.0.4).

中文

新增:导出说明弹窗
打开「表盘自动导出(实验)」时弹出说明:导出的作用(换新 ID 12→19 → Download/、第三方导入、防删除保护、缓存自动清理、Toast/通知反馈)+ 分步用法。只在手动打开时弹一次,重进设置页不再打扰。

其他
导出开关默认关闭;原有去广告与导出功能不变。1.0.3 用户建议升级(1.0.3 缓存堆积问题自 1.0.4 起已修复)。

Full changelog: docs/CHANGELOG.md

Assets

1

v1.0.4

Stable

9/4/2026, 11:36:49 AM

v1.0.4 (versionCode 24)

English

Highly recommended for v1.0.3 users: v1.0.3 keeps every previously trialed face in cache, so stale downloads pile up and eat storage; v1.0.4 wipes them.

Improved: Exported cache cleanup
Exported face cache is now removed whole-directory on the next scan after export (previously: only resource.bin older than 5 minutes), so only the just-downloaded face stays cached. Snapshot-based matching plus 60-second handoff and 15-minute push guards prevent deleting files mid-download or mid-transfer.

Cleanup: Dead code removal
Removed unused parameter plumbing in the export chain and an unused import; no behavior change besides the cleanup upgrade above.

Code
All existing ad-removal and export features unchanged.

中文

强烈推荐 1.0.3 用户更新:1.0.3 会把之前试用过的表盘一直留在缓存里,越堆越多占空间;1.0.4 会把它们清掉。

改进:已导出缓存清理
已导出表盘缓存改为导出后下次扫描即整目录删除(之前:仅删超 5 分钟的 resource.bin),缓存里只留本次下载的。快照匹配 + 60 秒交接保护 + 15 分钟推送保护,不误删正在下载/传输的文件。

清理:无用代码
清理导出链路上无用的参数传递与无用 import;除上述清理升级外无行为变化。

其他
原有去广告与导出功能保持不变。

Full changelog: docs/CHANGELOG.md

Assets

1

v1.0.3

Stable

9/4/2026, 2:26:30 AM

v1.0.3 (versionCode 23)

English

Update notice: this version keeps every previously trialed face in cache, which piles up over time — please upgrade to v1.0.4, which wipes them.

New: Trial watchface auto-export
After a trial download finishes, the cached resource.bin is automatically re-ID'd (12→19 prefix swap, same length) and written to Download/ under its Chinese face name (e.g. 蜘蛛侠超感大眼_190917425583.bin), ready for third-party import (verified with AstroBox on Xiaomi Smart Band 10 Pro). Every scan reports via Toast/notification; already-exported faces are never exported twice.

New: Cleanup protection
Exported IDs (19-prefix range) are filtered out of the server-side unavailable-face cleanup list before deletion runs; if the list becomes empty the cleanup is skipped entirely, so sideloaded faces survive app sync instead of being removed. Normal cleanup for other faces is untouched.

New: Exported cache auto-cleanup
Exported resource.bin files older than 5 minutes are auto-removed (descriptions/previews kept, app UI unaffected); if any push happened within the last 15 minutes the whole cleanup is skipped to never delete a file mid-transfer.

New: Settings toggle
One new toggle in the settings UI, 15 → 16 (default off): "Watchface auto-export (experimental)".

Code
All existing ad-removal features unchanged.

中文

更新提示:此版本会把之前试用过的表盘一直留在缓存里,越用堆得越多,请升级到 v1.0.4 清理。

新增:试用表盘自动导出
试用下载完成后,缓存的 resource.bin 自动按"12→19"规则换新 ID(等长),以表盘中文名写入 Download/(如 蜘蛛侠超感大眼_190917425583.bin),供第三方软件导入(已在小米手环 10 Pro + AstroBox 真机验证);每次扫描经 Toast/通知告知结果,已导出的不再重复导出。

新增:防删除保护
导出 ID(19 号段)在删除前从服务端清理名单中摘除,名单空了整单跳过,第三方刷入的表盘同步不再被删;其他表盘的正常清理不受影响。

新增:已导出缓存自动清理
超 5 分钟的已导出 resource.bin 自动删除(描述/预览保留,App 显示不受影响);15 分钟内有过推送则整单跳过,防删正在传的文件。

新增:设置开关
设置界面新增 1 个开关(默认关闭),15 → 16 个:「表盘自动导出(实验)」。

其他
原有去广告功能保持不变。

Full changelog: docs/CHANGELOG.md

Assets

1

v1.0.2

Stable

8/31/2026, 3:35:25 PM

v1.0.2 (versionCode 22)

New: Health detail pages consultation cards - PingAn Health consultation cards on Sleep/Heart rate/SpO2 pages removed (data-layer), AntBoy AI interpretation card removed.
New: Sleep research/improvement cards - sleep-apnea research / sleep-health research / 21-day improvement-plan cards on Sleep page removed.
New: Device red dots - bottom-nav Device tab dot and home System settings entry dot removed.
New: Settings toggles - 12 to 15 toggles.
Code cleanup; existing features unchanged. Docs updated.

新增:健康详情页问诊卡片 - 去除睡眠/心率/血氧页面平安健康问诊卡与蚂蚁阿福 AI 解读卡。
新增:睡眠研究/改善卡片 - 去除睡眠页睡眠呼吸暂停研究、睡眠健康研究、21 天改善计划卡。
新增:设备红点 - 去除底部"设备"tab 与首页"系统设置"入口红点。
新增:设置开关 - 12 增至 15 个。
代码清理;原有功能保持不变。文档更新。

Assets

1

v1.0.1

Stable

8/30/2026, 7:48:55 AM

v1.0.1

Changelog / 更新日志

  • New: Hide launcher icon toggle — hide the module launcher icon instantly (no restart needed); the settings page stays reachable from LSPosed.
  • 新增:隐藏桌面图标开关 — 即时隐藏模块桌面图标(无需重启);隐藏后仍可从 LSPosed 打开设置页。
  • Settings UI now has 12 toggles (master / per-page ad toggles / anti-detection / debug log / hide icon).
  • Code cleanup; all existing ad-removal features unchanged.

Assets

1

v1.0

Stable

8/30/2026, 2:16:35 AM

v1.0

MiFitnessAdAway - Remove ads from Xiaomi Mi Fitness (com.mi.health 3.58.0).

  • Splash / home / device / sport / mine promotion cards removed
  • Built-in settings UI (11 toggles, dark/light theme aware)
  • Anti-hook detection

Assets

1