Skip to content

About

No description, website, or topics provided.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Repository files navigation

澎湃补全计划 · HyperExtend

把散落在若干个小模块里的澎湃 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 自动发版)

0.2.2 更新

  • 将双击状态栏息屏升级为自定义单击、双击动作,支持跟随系统、禁用、通知面板、 控制中心、息屏、截屏、返回、桌面、最近任务、小爱识屏、小爱、小窗和回到页面顶部。
  • 保留旧开关与配置兼容性,默认仍为单击跟随系统、双击息屏。
  • 统一确认单击和双击,拦截原生双击及对应的延迟单击滚动,避免息屏与回到顶部同时触发。
  • 保留子控件和长按下拉处理,关闭功能或进入安全模式时恢复原生动作。
  • 全量 1076 项本地单元测试通过;已覆盖安装测试包,各动作的实际效果仍需真机验收。

0.2.1 更新

  • 适配 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 背景模糊 —— 为普通 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 秒,失败或超时跳过。

NFC 卡面列表

卡面列表来自钱包实际加载过的图片,不扫描钱包的全部私有目录。更新模块后,让「小米智能卡」 作用域的改动生效,再进入钱包的卡片列表或卡面页;回到模块的卡面自定义页面查看,必要时下拉刷新。

钱包 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。

About

No description, website, or topics provided.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages