Repository navigation
Releases: bqj6666/OHSync
Release list
OHSync v1.1.0
把 OPPO 健康(国行版)的数据同步进 Android 原生 健康数据共享(Health Connect)。
⚠️ 本版变更:包名
包名从 io.github.ohsync 改为 io.github.bqj6666.ohsync。
包名变了就是另一个应用,所以升级时:
- 先卸载旧版再装本版
- 旧版写入 Health Connect 的数据仍留在原处,但归属显示为旧应用;本版会在自己名下
重新写入一份 - 想清掉旧数据:装回旧版点一次「清除本应用写入的数据」,或直接在 Health Connect 的
「数据和访问权限」里删除那个来源 - 设置与配对口令不会迁移,本版是全新配置
同步内容
- 步数、距离、活动卡路里、心率、血氧、血压、体重
- 睡眠,含深睡 / 浅睡 / 快速眼动 / 清醒分段
功能
- 自动同步间隔可选(仅手动 / 15 分钟 / 30 分钟 / 1 小时 / 3 / 6 / 12 小时 / 每天),默认 1 小时
- 回填时间范围可选,默认最近 3 个月
- 自动同步走增量,只推上次之后的新数据
- 重复推送幂等,不会产生重复记录
保活(实测结论)
| 方案 | 结果 |
|---|---|
| 普通服务 + 读取端广播唤醒 | 广播被系统入队,但不执行 |
| 普通服务 + AlarmManager 兜底 | 闹钟到点没有反应 |
| 前台服务 | 进程稳定存活 ✅ |
广播与闹钟拉不起 cached 应用是 Android 本身的限制。通知为静音(无声音、无振动、
无角标),可在设置里关闭。
资源占用实测:空闲时 CPU 约 每小时 1.8 秒,内存约 59 MB。
安装
需要 Root + LSPosed,以及可用的 Health Connect。
- 安装本 APK,先打开一次 OHSync
- 在应用内点「去授权」,勾选要授予的健康数据类型
- 在 LSPosed 里启用 OHSync,作用域只勾 OPPO 健康
- 打开一次 OPPO 健康
- 回到 OHSync 点「立即同步」
注意:卸载应用会让 LSPosed 的启用记录与作用域被级联删除,重装后需在 LSPosed 里
重新启用,或重启设备让它重新加载。用同签名覆盖安装(pm install -r)不会丢。
每次安装更新,Health Connect 也会撤销本应用的全部健康权限,重新授权即可。
详见 README。
OHSync v1.0.6
把 OPPO 健康(国行版)的数据同步进 Android 原生 健康数据共享(Health Connect)。
同步内容
- 步数、距离、活动卡路里、心率、血氧、血压、体重
- 睡眠,含深睡 / 浅睡 / 快速眼动 / 清醒分段
本版修复
前台服务根本起不来:改用前台服务时,启动方式仍是 startService,而它必须是
startForegroundService。否则服务记录会存在,但 onStartCommand 不会被调用,
进程也就没有常驻保障 —— 表现就是划掉卡片后同步失效。
现在实测确认:服务 isForeground=true,am kill 后进程仍存活,通知为静音
(无声音、无振动、无角标),可在设置里关闭。
⚠️ 卸载重装的坑
对本项目来说,卸载应用会让 LSPosed 的启用记录与作用域被级联删除
(LSPosed 数据库用的是 ON DELETE CASCADE)。所以卸载重装后:
- 需要在 LSPosed 里重新启用 OHSync 并勾选作用域「OPPO 健康」
- 或者重启设备让它重新加载模块
用同签名覆盖安装(pm install -r)不会丢。另外每次安装更新,Health Connect 都会
撤销该应用的全部健康权限(平台行为),更新后重新点一次「去授权」即可。
保活结论(实测)
| 方案 | 结果 |
|---|---|
| 普通服务 + 读取端广播唤醒 | 广播被系统入队,但不执行 |
| 普通服务 + AlarmManager 兜底 | 闹钟到点没有反应 |
| 前台服务 | 进程稳定存活 ✅ |
广播与闹钟拉不起 cached 应用是 Android 本身的限制,所以前台服务是唯一可靠方式。
资源占用(实测)
- CPU:空闲时约 每小时 1.8 秒
- 内存:约 59 MB(Java 堆 12 MB / Native 堆 15 MB / 代码段 29 MB)
安装
需要 Root + LSPosed,以及可用的 Health Connect。
- 安装本 APK,先打开一次 OHSync
- 在应用内点「去授权」,勾选要授予的健康数据类型
- 在 LSPosed 里启用 OHSync,作用域只勾 OPPO 健康
- 打开一次 OPPO 健康
- 回到 OHSync 点「立即同步」
详见 README。
OHSync v1.0.5
把 OPPO 健康(国行版)的数据同步进 Android 原生 健康数据共享(Health Connect)。
同步内容
- 步数、距离、活动卡路里、心率、血氧、血压、体重
- 睡眠,含深睡 / 浅睡 / 快速眼动 / 清醒分段
本版重点:修复「划掉卡片后不再同步」
逐条试过三种保活方式,结论如下:
| 方案 | 实测结果 |
|---|---|
| 普通服务 + 读取端广播唤醒 | 广播被系统入队,但不执行,进程拉不起来 |
| 普通服务 + AlarmManager 兜底 | 闹钟到点没有反应,进程数始终为 0 |
| 前台服务 | 进程稳定存活,划掉卡片不受影响 ✅ |
广播与闹钟拉不起 cached 应用,是 Android 本身的限制,不是实现问题。所以本版
使用前台服务,代价是一条静音通知(最低重要级别:不响、不震、不显示角标)。
同类项目看起来「无通知也能常驻」,是因为它的功能跑在系统进程里(Xposed 注入到
GMS / 设置),它自己的应用进程其实也经常不在;而 OHSync 的写入必须由自己的进程
完成(Health Connect 按调用方 UID 校验权限),不能照搬。
设置里可以关掉「保持后台运行」——关掉后没有常驻组件,自动同步失效,只能打开应用
手动同步,同时省下这份占用。
资源占用(实测)
- CPU:空闲时约 每小时 1.8 秒
- 内存:约 59 MB(Java 堆 12 MB / Native 堆 15 MB / 代码段 29 MB)
一并修复
- 授权页打不开:补上 Health Connect 必需的用途说明页面声明 —— 缺它授权页会直接
退出,应用也会被显示为「非活跃应用」 - 授权判断永远不成立:补上
WRITE_VO2_MAX(真实权限名不是WRITE_VO2) - 误报未授权:权限判断改用平台层状态,不再被 Health Connect 内部记录误导
- 推送全部失败:force 取配置时曾回退缓存,导致「主进程是否在」被误判为就绪
- 白耗资源:去掉每 5 秒一次的跨进程轮询(它会让应用常驻约 55 MB)
- 重复写入:自动同步改走增量;睡眠会话固定走全窗口(增量会截断跨界会话)
界面
- 重新分区:状态 / 设置 / 同步的数据 / 不同步的数据 / 日志(默认折叠)
- 未授权时置顶提醒
- 可调自动同步间隔(仅手动 ~ 每天)与回填时间范围
- 新增「保持后台运行」开关
安装
需要 Root + LSPosed,以及可用的 Health Connect。
- 安装本 APK,先打开一次 OHSync
- 在应用内点「去授权」,勾选要授予的健康数据类型
- 在 LSPosed 里启用 OHSync,作用域只勾 OPPO 健康
- 打开一次 OPPO 健康
- 回到 OHSync 点「立即同步」
详见 README。
OHSync v1.0.3
把 OPPO 健康(国行版)的数据同步进 Android 原生 健康数据共享(Health Connect)。
本轮修复来自实际使用反馈:划掉卡片后不再同步、权限授权失败、后台资源占用。
同步内容
- 步数、距离、活动卡路里、心率、血氧、血压、体重
- 睡眠,含深睡 / 浅睡 / 快速眼动 / 清醒分段
本轮修复
划掉卡片后不再同步
根因:本机系统不会因为数据接口被访问就去启动一个没在跑的应用,进程被回收后
写入全部失败。改为普通后台服务 + 三条唤醒路径:
- 读取端要推数据前主动发广播唤醒(实时)
- AlarmManager 每 15 分钟兜底
- 开机自启
没有常驻通知,机制与同类项目验证过的做法一致。
授权
- 补上 Health Connect 必需的用途说明页面声明 —— 缺它授权页会直接退出,
应用也会被显示为「非活跃应用」 - 补上
WRITE_VO2_MAX(真实权限名不是WRITE_VO2,漏了会导致"全部已授权"永不成立) - 权限判断改用平台层状态,不再被 Health Connect 内部记录误导
资源占用
- 去掉每 5 秒一次的跨进程轮询(它会让本应用常驻约 55 MB)
- 自动同步走增量,只推上次之后的新数据
- 实测空闲时 CPU 约每小时 0.36 秒
界面
- 重新分区:状态 / 设置 / 同步的数据 / 不同步的数据 / 日志(默认折叠)
- 未授权时置顶提醒
- 可调自动同步间隔(仅手动 ~ 每天)与回填时间范围
- 可关闭「保持后台运行」
睡眠分段的依据
OPPO 的 DBSleepPiece.type 是私有枚举,代码里没有语义定义。映射是与 OPPO 健康
界面逐项对账得出的,不是猜的:
| type | 含义 | 对账依据(实测某晚) |
|---|---|---|
| 0 | 清醒 | 1 段 2 分钟 = 界面「清醒 1 次,2 分钟」 |
| 2 | 深睡 | 7 段 68 分钟 = 界面「深睡 1 小时 8 分钟」 |
| 3 | 快速眼动 | 10 段 119 分钟(24.9%)= 界面 25% |
| 4 | 浅睡 | 18 段 288 分钟(60.4%)= 界面 59% |
安装
需要 Root + LSPosed,以及可用的 Health Connect。
- 安装本 APK,先打开一次 OHSync
- 在应用内点「去授权」,勾选要授予的健康数据类型
- 在 LSPosed 里启用 OHSync,作用域只勾 OPPO 健康
- 打开一次 OPPO 健康
- 回到 OHSync 点「立即同步」
详见 README。
OHSync v1.0.0
把 OPPO 健康(国行版)的数据同步进 Android 原生 健康数据共享(Health Connect)。
同步内容
- 步数、距离、活动卡路里、心率、血氧、血压、体重
- 睡眠,含深睡 / 浅睡 / 快速眼动 / 清醒分段
功能
- 自动同步间隔可选(仅手动 / 15 分钟 / 30 分钟 / 1 小时 / 3 / 6 / 12 小时 / 每天),默认 1 小时
- 回填时间范围可选,默认最近 3 个月
- 自动同步走增量,只推上次之后的新数据
- 重复推送幂等,不会产生重复记录
安装
需要 Root + LSPosed,以及可用的 Health Connect。
- 安装本 APK,先打开一次 OHSync
- 在应用内点「去授权」,勾选要授予的健康数据类型
- 在 LSPosed 里启用 OHSync,作用域只勾 OPPO 健康
- 打开一次 OPPO 健康
- 回到 OHSync 点「立即同步」
详细说明见 README。
实现要点
- 读取在 OPPO 健康进程内完成:复用它自己打开的数据库实例,不复制、不解密 138 MB 主库,不引入额外 SQLCipher 依赖
- 写入在主进程完成:Health Connect 按调用方 UID 校验权限
- 表结构运行时读取:不硬编码表名,OPPO 只改内部实现时仍可用
- Health Connect 没有对应记录类型的 18 类数据(压力、听力健康、鼾声 / OSA、体测评分等)在应用内明确列出,不静默丢弃
睡眠分段的依据
OPPO 的 DBSleepPiece.type 是私有枚举,代码里没有语义定义。本项目的映射是与 OPPO 健康界面逐项对账得出的,不是猜的:
| type | 含义 | 对账依据(实测某晚) |
|---|---|---|
| 0 | 清醒 | 1 段 2 分钟 = 界面「清醒 1 次,2 分钟」 |
| 2 | 深睡 | 7 段 68 分钟 = 界面「深睡 1 小时 8 分钟」 |
| 3 | 快速眼动 | 10 段 119 分钟(24.9%)= 界面 25% |
| 4 | 浅睡 | 18 段 288 分钟(60.4%)= 界面 59% |
注意
每次安装更新,Health Connect 都会撤销本应用的全部健康权限(平台行为)。更新后请重新点一次「去授权」。