把散落在若干个小模块里的澎湃 OS(HyperOS)补全功能,收进一个 LSPosed 模块、一套开关面板。
一个 APK、一份作用域列表、一次重启,就能同时拿到状态栏、通知、控制中心、锁屏、 多任务窗口等各处的小修小补 —— 不必为每个小功能各装一个模块、各配一次作用域、各重启一遍。
| 项 | 内容 |
|---|---|
| 基准平台 | 澎湃 OS 4(Android 16) |
| 技术栈 | libxposed API 102 + miuix(HyperOS 风格 Compose UI) |
| 当前版本 | 0.2.2(versionCode 10) |
| 作用域 | 19 个宿主进程(见 META-INF/xposed/scope.list) |
| 功能条目 | 96 条,全部默认关闭 |
| 许可 | AGPL-3.0 |
| 下载 | Releases(由 CI 自动发版) |
- 将双击状态栏息屏升级为自定义单击、双击动作,支持跟随系统、禁用、通知面板、 控制中心、息屏、截屏、返回、桌面、最近任务、小爱识屏、小爱、小窗和回到页面顶部。
- 保留旧开关与配置兼容性,默认仍为单击跟随系统、双击息屏。
- 统一确认单击和双击,拦截原生双击及对应的延迟单击滚动,避免息屏与回到顶部同时触发。
- 保留子控件和长按下拉处理,关闭功能或进入安全模式时恢复原生动作。
- 全量 1076 项本地单元测试通过;已覆盖安装测试包,各动作的实际效果仍需真机验收。
- 适配 OS3 的统一多应用音量调节样式,修复替换勿扰按钮后的缩放方向与回弹跟随。
- 新增 OS3 / OS4 单行融合设备:四台显示四台,超过四台显示前三台与原生更多设备入口。
- 修复仅开启不同签名覆盖时,本包已有权限及权限组声明仍被拦截的问题。
- 迁入 HyperCeiler 的 V1 旧签名恢复分支,保留完整多签名与证书轮换历史。 沿用旧签名需同时开启覆盖安装与禁用软件包管理器签名验证,仅处理 V1 验签失败的可信更新包。
- 全量 1042 项本地单元测试通过;设备上的安装与交互效果仍需实际验收。
这些功能原本各自是一个独立模块:每一个都要单独安装、单独在 LSPosed 里启用、单独配作用域。 功能本身都很小,但模块数量一多,维护成本(跟进每个上游、每个 ROM 版本、每次都重启)就盖过了功能价值。
本模块把它们聚合到一处,并共用同一套基础设施:
- 统一的开关面板:按作用域收纳,找不到的靶子只记日志不报错,不会因为一个功能失效而拖垮整页。
- 统一的安全底线:默认全关、不认识的宿主一概不碰、注入侧不许抛异常,外加两级逃生门(见「防砖」)。
- 统一的工程约束:设置键就是功能 id,加一个功能只改一处目录,界面、搜索、存取自动跟上。
下面的分组与应用内的面板分组一一对应(见 core/FeaturePanels.kt)。全部条目默认关闭。
- 解锁通知重要程度 —— 长按通知调整渠道重要程度;菜单可跳应用设置或对应渠道
- 移除通知数量限制 —— 不因单应用通知过多自动清除旧通知
- 自动展开指定应用通知 —— 自动展开通知内容和固定悬浮通知
- 自动收起展开的悬浮通知 —— 展开后按设定时间结束悬浮显示,不删除通知
- 禁止自动折叠通知 —— 阻止自动折叠,并移除长按菜单的「收纳到更多通知」
- 修复勿扰模式下通知提示 —— 开启勿扰时抑制系统界面的通知声音、振动和提示灯
- 亮屏时静音 —— 亮屏时禁止通知发出提示音
- 禁用透明模式 —— 禁止横屏通知使用透明背景
- 更多应用通知栏下拉打开小窗 —— 放宽通知下拉打开小窗的应用限制
- 管理系统应用通知 —— 放宽系统应用及不可屏蔽渠道的编辑限制
- 解锁指定应用焦点通知 —— 放宽选定应用的焦点通知显示限制
- 优化焦点通知背景混色 —— 调整焦点、普通通知与媒体的原生模糊混色,分别适配深浅主题
- 隐藏强提醒 —— 阻止外部强提醒命令新建临时灵动岛提示
- 灵动岛媒体布局 —— 独立调整灵动岛展开媒体的布局与操作图标
- 灵动岛媒体字号 —— 独立调整标题、艺术家与播放时间字号
- 灵动岛媒体进度条 —— 为独立媒体面板调整原生粗细或绘制波浪、直线
- 灵动岛媒体背景 —— 为原生主视图及过渡视图独立配置封面、配色和氛围光
- 媒体卡片进度条 —— 原生粗细、波浪线、直线与彗星样式,保留原生操作
- 媒体卡片始终深色模式 —— 原生媒体背景与文字使用深色配色,保留系统材质
- 媒体卡片自定义背景 —— 封面拼色、模糊封面与两种渐变,普通通知中心卡片限定
- 媒体卡片布局 —— 调整专辑封面、操作顺序和标题间距
- 媒体卡片字号 —— 分别设置标题、艺术家和播放时间字号
- 解锁媒体卡片自定义操作 —— 显示应用提供但被系统屏蔽的媒体操作
- 解除窗口模糊机型分级限制 —— 保留实际模糊能力与系统开关,仅放宽高端图形机型分级
- 面板头部渐变模糊 —— 在设备支持时独立使用原生通知中心与控制中心头部渐变
- 通知中心显示天气 —— 在日期或横屏时间旁显示本机天气,可附带地区
- 亮度与音量百分比 —— 拖动时顶部浮层,或复用控制中心原位数值
- 单行融合设备 —— OS3 / OS4 固定一行,四台完整显示,超过四台保留原生更多设备入口
- 隐藏控制中心编辑按钮 —— 从新版控制中心列表中移除编辑入口
- 隐藏控制中心运营商名称 —— 只隐藏运营商区域,保留隐私提示
- 隐藏网络监控提示 —— 隐藏新旧控制中心底部的设备管理与网络监控提示行
- 点击磁贴后自动收起 —— 发出可用磁贴点击请求后,请求系统收起面板
- 解锁旧版控制中心 —— 解除强制使用新版控制中心,遵循系统样式设置
- 经典控制中心布局 —— 分别设置横竖屏行列数和折叠磁贴数量
- 补全磁贴列表 —— 在编辑页补充极暗等系统磁贴,并按所选样式提供 5G 开关
- Google 服务磁贴 —— 在磁贴编辑器添加独立的 Google 服务启停入口
- 传送门磁贴 —— 通过原生接口切换传送门,长按打开设置
- 原生阳光模式磁贴 —— 切换系统阳光模式偏好,保留原生亮度与传感器策略
- 静音模式 —— 一键静音全部音频输出,可随时解除
- 隐藏快捷开关标签 —— 隐藏控制中心磁贴上的文字标签
- 手电筒亮度控制 —— 开启手电筒后,拖动控制中心亮度条即可调手电筒亮度
- 极暗磁贴图标替换 —— 使用向下箭头图标,保留系统状态与操作
- 磁贴高级材质 —— 为小磁贴和卡片的原生混色路径接入高级材质资源
- 圆角矩形磁贴 —— 调整普通背景小磁贴的圆角半径
- 已启用小磁贴颜色 —— 分别设置普通背景和通用矢量图标颜色
- 已启用卡片磁贴颜色 —— 分别设置普通卡片背景,以及图标与文字颜色
- 自定义卡片磁贴列表 —— 调整普通卡片顺序与数量,保留原生 VoWiFi 生命周期
- 原生音量面板 —— 使用系统界面内置音量面板,不禁用小米插件组件
- 音量面板使用默认主题 —— 在三个原生音量材质判断点使用默认主题条件
- 隐藏折叠音量面板底部按钮 —— 折叠时隐藏静音和勿扰按钮,保留展开入口
- 长按展开音量条 —— 静止按住折叠音量条后请求原生展开
- 统一多应用音量调节样式 —— 统一按钮与官方展开面板内的多应用音量样式,补充 OS3 适配与替换按钮动画跟随(实验性)
- 原生关机菜单 —— 使用系统界面内置关机菜单,保留系统确认与限制
- 隐藏快捷窗口按钮 —— 仅隐藏窗口顶部圆点,保留原触摸区域
- 禁用快捷窗口菜单 —— 阻止顶部圆点新建快捷窗口菜单
- 禁用无极窗口手势 —— 关闭无极手势入口,保留其他窗口操作
- 隐藏小窗底部提示条 —— 隐藏自由小窗提示条并取消其预留高度
- 状态栏图标 —— 设置系统图标的显隐与显示位置
- 交换 WIFI 与移动网络位置 —— 在原生图标列表发布前调整信号组顺序
- 原生通知图标 —— 使用通知自带的单色图标
- 截屏时隐藏状态栏 —— 截图不显示时间、电量和通知图标
- 电池自定义 —— 调整电量百分比样式与位置
- 状态栏电池信息 —— 在左侧时钟旁显示温度、电流与电池侧估算功率
- 移动网络 —— 调整信号显示逻辑与各类网络图标
- 移动网络类型显示 —— 设置类型显示逻辑、独立文字及字号与位置
- 双排移动网络图标 —— 将双卡信号合并显示,可调整样式与位置
- 自定义移动网络类型文本 —— 替换信号旁的网络类型文字,不改变网络制式
- 网速指示器 —— 调整网速样式、单位与刷新间隔
- 时钟指示器 —— 调整各处时钟格式、双行排列、字号与位置
- 自定义状态栏点击动作 —— 分别设置空白处单击、双击动作,双击息屏不再同时滚动到顶部
- 双击锁屏空白处息屏 —— 仅在锁屏状态下响应空白区域双击
- 解除通知限制 —— 允许更多通知在锁屏显示
- 解锁后保留通知 —— 解锁后保留通知,再次锁屏仍可见
- 隐藏锁屏底部解锁提示 —— 隐藏上滑、点击或按键解锁的操作提示
- 隐藏锁屏勿扰提示 —— 隐藏锁屏通知计数旁的勿扰提示,保留通知计数
- 锁屏时隐藏状态栏 —— 隐藏锁屏顶部状态栏,不影响解锁后
- 禁止显示 "已通过蓝牙设备解锁" Toast —— 仅隐藏蓝牙解锁成功的提示
- 锁屏壁纸亮灭屏动画 —— 分别调整普通锁屏壁纸变亮与变暗的时长
- 锁屏左侧快捷入口 —— 左下角按钮:保持原生、隐藏,或改为手电筒
- 隐藏锁屏右侧快捷入口 —— 隐藏右下角按钮(默认相机),并阻止该侧点击和滑动启动
- 锁屏快捷按钮背景模糊 —— 在原生快捷图标后添加独立圆形背景,不改点击区域
- 锁屏充电信息 —— 在原生充电提示下显示电池电流、电压、估算功率与可选温度
- 允许第三方锁屏使用生物识别 —— 放宽第三方锁屏的人脸与指纹能力判断
- PIN 密码键盘乱序 —— 随机排列锁屏 PIN 数字键,保持按键内容与输入一致
- 手势提示线 —— 隐藏横条,或调整粗细、颜色、位置与宽度;保留原生手势
- 关闭旋转建议 —— 隐藏导航栏附近的旋转建议按钮
- 旋转锁定保护 —— 强行停止应用后仍保留方向锁定
- 壁纸取色修复 —— 让动态主题色跟随壁纸更新
- 自定义莫奈主题色 —— 使用指定颜色生成系统深浅色主题
- 解锁原生剪贴板编辑浮窗 —— 复制内容后显示 Android 原生剪贴板浮窗
- 截图自动写入剪贴板 —— 截图保存后自动复制到剪贴板
- 剪贴板读取崩溃修复 —— 避免设备互联读取无效图片时崩溃
- 接收文件索引冲突修复 —— 绕过残留媒体索引,使用备用文件名接收
- 系统 Toast 背景模糊 —— 为普通 Toast 添加独立模糊背景,保留原生动画
- NFC 卡面自定义 —— 替换小米智能卡的卡面图片
- 通行密钥修复 —— 修复凭据管理器无法打开或列表为空
底栏三页:
- 首页 —— 按作用域(被注入的宿主应用)收纳成入口行。每行带宿主的真实图标、 「已启用 n / m」,以及未安装时的明确标注。点进去是该作用域下的功能开关。 系统框架(system_server)第一、系统界面第二,其后依次为截屏、设备互联、小米互传和小米智能卡。
- 设置 —— root 权限检测、批量启用/关闭、恢复默认设置。
- 关于 —— 模块状态、开源致谢、日志与紧急停用。
功能按面板分组呈现(上一节的分组就是界面上的分组)。只有一个开关的功能直接在列表中操作; 包含子选项、参数、图片或附加配置的功能保留二级入口,搜索结果采用同一规则。
每个功能只在界面上出现一次。 通行密钥同时在系统设置、安全中心、扫描器和系统框架里生效,
但它只显示在系统框架下面 —— 同一个开关在四个入口里各出现一遍,用户只会以为那是四件事。
归属规则:功能 scopes 列表里第一个宿主就是它的入口,所以主宿主写在最前;
跨宿主的完整清单在功能详情页的「生效范围」里如实列出。
每个作用域页面的右上角是「让改动生效」按钮(全页仅此一个)。开关的值是宿主进程启动时 读进内存的,所以改完必须让宿主重新读一遍;这个按钮就是做这件事的。
模块不再支持热重载:自动热重载已关闭,框架热重载请求会被拒绝。更新模块或修改设置后, 请重启对应宿主进程。系统框架只能随设备重启生效,需要用户明确确认;模块不会自动重启设备。
结束进程需要 root(结束别人的进程要 KILL_ANY_PROCESS 级别权限,普通应用拿不到),
失败时界面会如实说明是「没有 su」「授权被拒」还是「超时」—— 这三者的补救动作完全不同。
「设置」页有一项 root 检测,可以先把这件事查清楚。
app/src/main/resources/META-INF/xposed/scope.list:
com.android.systemui 状态栏 / 通知 / 控制中心 / 锁屏 / 窗口 / 手势横条
system 通行密钥、旋转锁定等系统服务侧修复
com.android.settings 通行密钥的默认凭据提供方、通知重要程度跳转
com.miui.securitycenter 通行密钥的配置保护
com.xiaomi.scanner 通行密钥的扫描器调用方
com.miui.tsmclient NFC 卡面
com.miui.screenshot 截图自动复制到剪贴板
com.milink.service 剪贴板读取崩溃保护
com.miui.mishare.connectivity 小米互传接收文件索引冲突修复
com.miui.misound 分应用音量面板数据源
staticScope=true:作用域由模块自己声明,用户在 LSPosed 里加不了作用域之外的包。
模块界面应当至少打开过一次(让模块脱离 stopped 状态)。
默认关闭,入口为 小米互传 → 接收文件索引冲突修复。必须在接收文件的手机上
安装模块、启用 LSPosed 的 com.miui.mishare.connectivity 作用域、打开开关并让改动生效。
只在发送端打开不能修复接收端的存储问题;重启互传进程前请结束正在进行的传输。
故障形态是:Download/MiShare/base.apk 不存在,但 MediaStore 仍有同路径记录;
原生接收器创建文件得到 EEXIST,随后发送端显示通用失败。并非所有重名文件都失败,
也不是发送端文件管理器改名就一定能解决。
模块采用更保守的自动规避:在接收器把路径交给回调和原生层之前,只读检查该路径。
仅当文件确实不存在、媒体库仍有记录时,选择例如 base (HE-0123456789ab).apk 的备用名,
再次检查文件系统和媒体库均未占用后交还宿主。保留扩展名,按 UTF-8 的 255 字节上限裁剪过长主文件名。
不清媒体库、不申请额外权限、不创建占位文件、不修改文件内容,也不主动覆盖已有文件。
运行要求 Android 11+,不按小米互传的版本名或版本号限制启用;当前使用从
3.4.1 / 30401、5.4.2_20260923_1315 / 50402 核对出的两组接收调用目标,按完整方法签名成对匹配。
仅处理当前用户主存储的 Download/MiShare 直接子文件,其他保存目录与其他调用方保持原行为。
索引查询无权限、状态不明或候选耗尽时也保留原行为。
两个默认关闭、可独立使用的开关:
- 截屏 → 截图自动写入剪贴板:解锁截图应用的原有自动复制逻辑。 不校验截图应用版本号,改为核对目标类与方法签名;目标不匹配时跳过并记录日志。
- 设备互联 → 剪贴板读取崩溃修复:在
FileUtil.isAvailableUri(Uri, Context)捕获媒体状态、权限与 I/O 异常,将不可读图片判为不可用。可独立配合西米露使用。
截图原实现会在输出流关闭和 MediaStore 发布之前写入剪贴板,此时图片仍为 IS_PENDING=1。
本模块不强行清除媒体状态、不放宽权限,而是异步等待 IS_PENDING=0 且 IS_TRASHED=0
后才复制;最多等待 15 秒,失败或超时跳过。
卡面列表来自钱包实际加载过的图片,不扫描钱包的全部私有目录。更新模块后,让「小米智能卡」 作用域的改动生效,再进入钱包的卡片列表或卡面页;回到模块的卡面自定义页面查看,必要时下拉刷新。
钱包 Hook 在自己的进程里读取本地图片并生成缩略图,通过仅接受钱包 UID 的 Provider 回传模块;
模块直接读取自己的缓存,不使用 su 跨 UID 读取钱包文件。当前按原始卡面地址分别保存替换图片,
每个条目点击右侧图片选图,长按已选择的图片清除此卡的替换映射。
作用域里有 system(system_server),所以「最坏情况」是开机循环。五层防线:
① 默认全关(最重要的一层)。 所有布尔功能主开关默认关闭,读不到设置或设置类型错误也按关闭处理。 NFC 卡面为配置型功能,保留只读采集 Hook,不属于布尔主开关;未配置时不替换卡面。
这一层有一条容易写错的细节:功能有主开关与子项两级,而有的 hook 点是直接按子项 id 判断的。
子项默认值是「开」(主开关一打开,子项就该全部生效),于是只读子项那个键就会在用户从没进过界面的
情况下读出 true。HookSettings.isOn 因此在内部强制「子项必须同时满足所属功能的主开关」。
② 不认识的宿主一概不碰。 每个功能装 hook 前先确认宿主对不对:
系统界面侧的功能要求存在 miui.os.Build(即确实是小米 ROM);通行密钥的靶子
RequestSession / IntentFactory 是 AOSP 类,在类原生系统上挂它们会把凭据会话
错误地指向 Google GMS —— 那属于「修出一个原本不存在的故障」。
目标类/方法找不到时一律「记日志 + 跳过」,绝不报错。
③ 异常保护。 HookRuntime.hook 对每次宿主调用保存结果:模块前置处理出错时调用原方法一次,
后置处理出错时保留原结果(含 void/null),不重放宿主副作用。宿主自己抛出的异常按原语义传回。
API 102 使用 PASSTHROUGH,模块错误由自己的保护层处理。
④ 逃生门(恢复模式可用)。 万一真进了开机循环,系统进不去 → 模块界面和 LSPosed Manager 都打不开,界面上的「停用」按钮恰好够不着。所以提供两个不需要开机即可生效的标记, 任何一个成立,所有 hook 一律不装:
# 方式一:属性(需要 root,persist. 前缀保证重启后仍生效)
adb shell su -c 'setprop persist.sys.hyperextend.disabled 1'
# 方式二:文件
adb shell touch /data/local/tmp/hyperextend.disabled
adb shell mkdir -p /sdcard/HyperExtend && adb shell touch /sdcard/HyperExtend/disable
撤销:属性设回 0 并删除已设置的文件标记,重启即可。属性读失败时不安装 Hook;
文件标记在部分 SELinux/存储环境不可读,优先使用 root 属性方式。不需要卸载模块、不需要清 LSPosed 数据。
框架启动保护是另一条独立的持久标记,别把它和上面那条混为一谈:
persist.sys.hyperextend.disabled 管的是「所有宿主一律不装」,而
persist.sys.hyperextend.framework_disabled 由 BootLoopGuard 在系统框架连续重启时自己 arm,
只停用系统框架(并连带停用系统界面),清掉前一条不会解掉它。恢复时把该属性设回 0:
adb shell su -c 'setprop persist.sys.hyperextend.framework_disabled 0'
并删除状态文件 /data/system/hyperextend_bootguard,重启即可恢复系统框架;系统界面随后会自动跟上。
两条标记各写各的,任何一条读到 1 或读不出来,对应一侧就不装 Hook。
⑤ 安全模式与自动防砖。 在「设置 → 故障排查 → 安全模式」按宿主查看图标、包名和开关。 开关开启表示停用该宿主的模块功能,不清空功能配置;关闭需要确认,随后重启对应宿主(系统框架需重启设备)。
system_server 与 SystemUI 分别记录启动,首次启动不算重启;同一五分钟窗口内三次重启(第四次启动)
触发持久保护。框架启动保护仍同时禁止 SystemUI;SystemUI 独立保护只停用自身。
其他宿主可手动停用,或在被保护的 Hook 执行异常时自动停用。状态采用同目录临时文件、同步写入后替换;
坏文件、IO 失败和异常时钟均跳过 Hook。正常运行或重启不能自行解除已触发的保护。
异常先保存在宿主私有目录,再异步报告模块;模块前台收到时弹窗,后台事件留到下次打开,不从后台拉起界面。 已修改的界面和已注册的异步监听仍可能需要重启才能完全清理。系统框架启动保护触发时,先恢复系统框架并重启设备, 再恢复被连带保护的系统界面。
实现见 hook/BootLoopGuard.kt 与 hook/KillSwitch.kt。
桌面原生原型不等同于上述保护。 原型入口已接只读安全预检:检查配置快照、
现成本地熔断状态和两种时钟。独立持久化后端与受控武装/残留恢复事务已有离线故障测试,
持久化启动事务已经接入原型入口;受控武装/残留恢复仍没有接入,也没有生产授权方。
普通配置通道的恢复令牌固定为 0,不借用框架或其他宿主的恢复令牌;
原生预检与独立启动事务也拒绝非零恢复令牌,不只依赖发送端自律。
防砖一致性审计现已含完整链路验证器(从导出入口可达性、快照用途门禁、提交控制流、
安装支配、失败阻断、安装点唯一性与分支极性),并已按 49 条假绿路径逐条加固与回归;
可达性用三值常量求值加语句级分析,if constexpr (false)、宏恒假条件、
常量 switch 不匹配分支、无 break 的死循环之后等都算执行不到。
门禁、提交守卫与安装许可判定要无条件支配其后环节:早退必须自身可达、
真分支必然终止且真的跳过安装;安装点必须落在必然执行的位置,提交结果在守卫前
被改写也不算数;三处守卫的极性改用符号化蕴含判定,被额外合取条件削弱的写法不再翻绿。
实测结构接线已通过离线审计;真实设备上的安全、并发和代码页验收仍未完成,缺口如实保留。
桌面主开关也不授权初始化、解除熔断或清理残留文件,专用恢复流程尚未实现。
即使计算结果正常,
仍保留持久化阻断与安装阶段锁;防砖已确认=false、安装许可=false。
普通构建不打包此原型。细节与离线测试见 app/src/main/cpp/README.md。
不必自己编译:每次推送 main 后 CI 都会跑单测并打包 release APK(见 Actions 工件),
当 app/build.gradle.kts 里的 versionName 变化时,CI 自动建 v<版本号> 标签并
发到 Releases。直接装那里的
app-release.apk 即可,与本地 :app:assembleRelease 的产物同源同签名,可直接覆盖安装。
./gradlew :app:assembleRelease
发布用 release,不要用 debug。 模块的 dex 会被注入宿主进程(SystemUI、system_server),
debug 构建既没有 R8 压缩也不做优化,往每个宿主进程里塞一份几 MB 的未压缩 dex,
表现为「启用模块后整机发卡」;模块界面本身也会明显迟滞。release 走 R8,
app/proguard-rules.pro 里保住了入口类与 provider。
要求:
- JDK 17
- Android SDK:
compileSdk 37/minSdk 26/targetSdk 35 local.properties里的sdk.dir指向本机 Android SDK
依赖里有一处是硬约束:io.github.libxposed:api 必须是 compileOnly。
它以及全部宿主类型都只存在于被注入的进程;打成 implementation 会让模块进程里
加载到一份假的 API 实现(或直接 NoClassDefFoundError)。
所有宿主类型一律走反射(见 hook/Reflect.kt),不要 import。
app/src/main/
├── java/io/github/YGHFv/HyperExtend/
│ ├── HyperExtendApplication.kt 模块 App 进程:接上框架服务、投影设置
│ ├── core/
│ │ ├── FeatureCatalog.kt 功能目录 —— 界面的唯一数据源(功能 → 作用域)
│ │ ├── ScopeCatalog.kt 作用域目录 —— scope.list 在界面上的化身
│ │ ├── FeaturePanels.kt 面板分组 —— 功能一览里那些标题
│ │ ├── OpenSourceProjects.kt 开源致谢清单
│ │ ├── FrameworkBridge.kt 框架服务(XposedService)的唯一持有者
│ │ └── ModuleLog.kt 日志(logcat + 内存环形缓冲,两个进程各一份)
│ ├── config/HyperSettings.kt 模块侧设置读写(本地 prefs 权威 + 投影给框架)
│ ├── ui/ 主界面(miuix / Compose),只在模块进程中运行
│ └── hook/ 被注入进程里的一切
│ ├── HyperXposedEntry.kt 入口(java_init.list 指向它)
│ ├── HookDispatcher.kt 按宿主包名分派功能
│ ├── HookRuntime.kt 挂 hook 的统一出口(失败绝不冒泡)
│ ├── KillSwitch.kt / BootLoopGuard.kt 紧急停用与自动防砖
│ ├── Reflect.kt / DexScan.kt 宿主反射 / 类名兜底扫描
│ └── feature/ 按宿主分目录的功能实现
└── resources/META-INF/xposed/ module.prop / scope.list / java_init.list
FeatureCatalog.kt 与 ScopeCatalog.kt 之间的双向引用(功能声明它在哪些作用域里,
作用域反查它有哪些功能)是刻意的:界面两个方向都要用,而两份都是纯数据、无副作用。
加功能时只改 FeatureCatalog.kt,加宿主时只改 ScopeCatalog.kt。
本模块的大量功能是参考、移植与重实现上游项目的成果。各功能的具体来源与许可逐条保留在
core/FeatureCatalog.kt、core/StatusBarFeatures.kt、core/SystemUiFeatures.kt
与对应源码头部;功能详情页的「来源 / 许可」也如实列出,改实现时不要删掉。
项目级致谢(见 core/OpenSourceProjects.kt):
| 项目 | 说明 | 链接 |
|---|---|---|
| HyperCeiler | 控制中心、状态栏、锁屏、通知等大量功能的参考实现 | https://github.com/ReChronoRain/HyperCeiler |
| Cemiuiler | HyperCeiler 的前身,多项功能的原始出处 | https://github.com/Cemiuiler-Development-Team/Cemiuiler |
| Miuix | 界面使用的 HyperOS 风格 Compose 组件库 | https://github.com/compose-miuix-ui/miuix |
| libxposed API | 模块框架接口 | https://github.com/libxposed/api |
| MIUINativeNotifyIcon | 原生通知图标功能的参考实现 | https://github.com/fankes/MIUINativeNotifyIcon |
| Android Notification Icon Project | 通知小图标的处理思路 | https://github.com/BetterAndroid/android-notification-icon-project |
| HyperWallpaperMonet | 壁纸取色修复的参考实现 | https://github.com/PengDingkang/HyperWallpaperMonet |
| HyperVolumeANC | 分应用音量入口的参考实现 | https://github.com/zhhhyyyyyy/HyperVolumeANC |
| HyperPasskey | 通行密钥修复的参考实现 | https://github.com/Howard20181/HyperPasskey |
| DIY NFC | NFC 卡面自定义的参考实现 | https://github.com/Xposed-Modules-Repo/com.zhizi42.diymiuicard |
| AndroidX | 应用侧依赖 | https://github.com/androidx/androidx |
| Android Open Source Project | 系统行为与 API 依据 | https://source.android.com |
本模块整体采用 AGPL-3.0(见 LICENSE)。
- 开关拨了没反应:先看「关于」页里的「框架服务」是否已连接。 未连接 = 设置推不到注入侧(LSPosed 未启用模块,或模块不在作用域里)。 已连接的话,多半是宿主进程还没重新加载 —— 进对应作用域页,点右上角那个按钮。
- 某个功能不生效:看「已捕获异常」是否为 0,再看日志里对应 feature 那一行是
hook installed还是hook target missing(后者说明这个 ROM 版本上靶子的类/方法名变了)。 - 重启按钮报「没能执行 su」:设备没有 root,或者本应用还没被授权。 在 root 管理器(Magisk / KernelSU / APatch)里给「澎湃补全计划」授权后重试。
- 注入侧的日志:模块界面只能看到模块自身进程的日志。SystemUI / system_server 的日志在 logcat 里,
按标签过滤:
adb logcat -s HyperExtend。