一个 Xposed 模块,用于实时监控 Android 设备的前台应用切换,并自动同步到 Sleepy 服务器,用于个人在线状态的展示。
重要:本项目部分代码使用AI技术生成,请您谨慎使用。
- 🔍 实时应用监控 - 无缝监控前台应用程序切换
- 🌐 自动上报 - 将应用状态自动报告到 Sleepy 服务器
- 🔋 电池追踪 - 实时获取设备电量百分比和充电状态
- ⚙️ 灵活配置 - 用户友好的设置界面,支持自定义服务器
- 📱 应用信息 - 获取并显示当前前台应用的详细信息
- 🎵 媒体状态上报 - 可选功能,将当前播放的媒体(标题/艺术家)作为独立设备上报,可自定义设备 ID 与显示名称
- 📝 日志系统 - 内置多级别日志,便于调试和问题排查
在主界面的「媒体状态上报」区域可以:
- 开关此功能(默认关闭)
- 自定义媒体状态上报使用的设备 ID 和显示名称(与常规设备状态相互独立,可在 Sleepy 页面上显示为单独的一项)
- 选择获取媒体播放状态的方式:
| 方式 | 说明 | 是否需要额外授权 |
|---|---|---|
| 自动(推荐) | 根据检测到的 Android 版本和系统 UI(ROM)厂商,自动在「系统钩子」和「通知监听」两种方式中选择最合适的一种(不自动选择 Dumpsys Shell) | 视结果而定 |
| 系统钩子 | 通过 Xposed 钩子在 system_server 进程内直接调用 MediaSessionManager 获取,零配置 |
否 |
| 通知监听 | 使用标准 NotificationListenerService API,在应用自身进程内运行,跨 ROM 兼容性最好 |
是(需在设置中手动授权一次,可点击应用内按钮直达) |
| Dumpsys Shell | 通过解析 dumpsys media_session 命令输出获取,思路参考自 Magisk 版 Sleepy 脚本,作为兼容性/调试备用方案 |
否(复用系统钩子权限) |
选择「自动」时,模块会检测当前设备是否为 MIUI/HyperOS、ColorOS、FuntouchOS/OriginOS、EMUI/MagicUI、One UI、Flyme 等定制系统:
- 接近原生 / AOSP 的系统 → 推荐系统钩子(无需额外操作)
- 检测到重度定制系统 → 推荐通知监听(这类系统通常对后台/系统级调用有更多限制,通知监听是官方标准方案,兼容性更好)
如果选择「通知监听」方式,请点击应用内的「授予通知访问权限」按钮,在系统设置中为 SleepyXposed 开启通知访问权限后功能才会生效。
- 优化 UI 交互
- 优化日志系统
- 增加锁屏检测
| 要求 | 版本/说明 |
|---|---|
| Android | 7.0 (API 24) 或更高 |
| Xposed/LSPosed | 已安装并激活 |
| 权限 | Root 访问权限 |
| 网络 | 互联网连接(用于上报数据) |
从 GitHub Actions 下载最新的预编译 APK 文件:
- 进入 Actions 页面
- 选择最新的成功运行
- 下载
app-release.apk文件 - 在设备上安装 APK
# 克隆仓库
git clone https://github.com/RhenCloud/SleepyXposed.git
cd SleepyXposed
# 构建 APK
./gradlew assembleRelease
# 使用 adb 安装(可选)
adb install app/build/outputs/apk/release/app-release.apk启动应用后,进行以下配置:
| 字段 | 说明 | 示例 |
|---|---|---|
| 服务器地址 | Sleepy 服务器地址 | https://your-sleepy.com |
| 服务器密钥 | Sleepy 认证密钥 | your-secret-key-here |
| 设备 ID | 唯一标识此设备 | android-phone-1 |
| 字段 | 说明 | 默认值 |
|---|---|---|
| 显示名称 | 在 Sleepy 页面显示的名称 | 设备型号 |
| 启用上报 | 是否启用数据上报 | 禁用 |
点击 "保存配置" 按钮保存设置。
- 打开 Xposed/LSPosed 管理器
- 找到 "SleepyXposed" 模块
- 启用 该模块
- 在作用域中勾选 "系统框架"
- 重启设备
- 打开 SleepyXposed 应用
- 检查日志栏,查看是否有活动日志
- 访问 Sleepy 服务器页面,验证设备是否在线并显示当前应用
release 构建会读取项目根目录下的 keystore.properties。你可以先复制 keystore.properties.example,然后把真实信息填进去:
storeFile=release.jks
storePassword=你的密钥库密码
keyAlias=你的别名
keyPassword=你的密钥密码把对应的 release.jks 放在项目根目录,或者把 storeFile 改成你的实际路径。配置完成后运行 ./gradlew assembleRelease,生成的 APK 就会使用该签名。
如果要让 GitHub Actions 产出签名版 release APK,需要在仓库 Secrets 中配置以下内容:
ANDROID_KEYSTORE_BASE64
ANDROID_KEYSTORE_PASSWORD
ANDROID_KEY_ALIAS
ANDROID_KEY_PASSWORD
其中 ANDROID_KEYSTORE_BASE64 是 keystore 文件经过 base64 编码后的内容。workflow 会在非 PR 构建时自动恢复密钥并生成签名版 release 包。
adb logcat | grep "SleepyXposed"| 问题 | 解决方案 |
|---|---|
| 应用未上报数据 | 1. 检查 "启用上报" 是否打开 2. 验证网络连接 3. 检查日志是否有错误信息 |
| 连接超时 | 1. 验证服务器地址是否正确 2. 检查网络连接 3. 确认防火墙设置 |
| 模块不工作 | 1. 检查 Xposed/LSPosed 是否启用 2. 验证设备是否已重启 3. 查看 Xposed 日志获取错误信息 |
| 电量信息不显示 | 确认设备未禁用电池状态权限 |
如果你正在运行自己的 Sleepy 服务器,可以按照以下格式集成数据:
curl -X POST https://your-server.com/api/device/set \
-H "Content-Type: application/json" \
-d '{
"secret": "your-secret-key",
"device_id": "android-phone-1",
"current_app": "com.example.app",
"app_name": "Example App",
"battery": 85,
"charging": true
}'- 语言: Kotlin, Java
- 框架: Android Framework, Xposed Framework
- 网络: OkHttp
- 异步: Kotlin Coroutines
- UI: Android Material Design
- 密钥安全:服务器密钥存储在本地 SharedPreferences 中,建议使用 Android Keystore 进一步加密
- 网络安全:建议使用 HTTPS 与服务器通信
- 权限最小化:模块仅请求必要的权限
- 隐私保护:应用信息仅用于本地显示和服务器上报,不做其他用途
Sleepy 是一个个人在线状态和应用展示项目:
- 官方地址: sleepy-project/sleepy
- 官方演示站点: sleepy.wyf9.top
- RhenCloud的个人站点: sleepy.rhen.cloud
本项目采用 MIT 许可证。详见 LICENSE 文件。
欢迎提交 Issue 和 Pull Request!
- GitHub Issues: RhenCloud/SleepyXposed/issues
- Email: i@rhen.cloud
感谢以下社区及项目的支持:
- LSPosed
- Sleepy
- 图标来源:SiiWay Icons - Sleepy(由 @NtKrnl32 和 @XiaoYuan151 制作)