Skip to content

Releases: bqj6666/OHSync

OHSync v1.1.0

Choose a tag to compare

@github-actions github-actions released this 05 Oct 08:59

把 OPPO 健康(国行版)的数据同步进 Android 原生 健康数据共享(Health Connect)。

⚠️ 本版变更:包名

包名从 io.github.ohsync 改为 io.github.bqj6666.ohsync。

包名变了就是另一个应用,所以升级时:

  1. 先卸载旧版再装本版
  2. 旧版写入 Health Connect 的数据仍留在原处,但归属显示为旧应用;本版会在自己名下
    重新写入一份
  3. 想清掉旧数据:装回旧版点一次「清除本应用写入的数据」,或直接在 Health Connect 的
    「数据和访问权限」里删除那个来源
  4. 设置与配对口令不会迁移,本版是全新配置

同步内容

  • 步数、距离、活动卡路里、心率、血氧、血压、体重
  • 睡眠,含深睡 / 浅睡 / 快速眼动 / 清醒分段

功能

  • 自动同步间隔可选(仅手动 / 15 分钟 / 30 分钟 / 1 小时 / 3 / 6 / 12 小时 / 每天),默认 1 小时
  • 回填时间范围可选,默认最近 3 个月
  • 自动同步走增量,只推上次之后的新数据
  • 重复推送幂等,不会产生重复记录

保活(实测结论)

方案 结果
普通服务 + 读取端广播唤醒 广播被系统入队,但不执行
普通服务 + AlarmManager 兜底 闹钟到点没有反应
前台服务 进程稳定存活 ✅

广播与闹钟拉不起 cached 应用是 Android 本身的限制。通知为静音(无声音、无振动、
无角标),可在设置里关闭。

资源占用实测:空闲时 CPU 约 每小时 1.8 秒,内存约 59 MB。

安装

需要 Root + LSPosed,以及可用的 Health Connect。

  1. 安装本 APK,先打开一次 OHSync
  2. 在应用内点「去授权」,勾选要授予的健康数据类型
  3. 在 LSPosed 里启用 OHSync,作用域只勾 OPPO 健康
  4. 打开一次 OPPO 健康
  5. 回到 OHSync 点「立即同步」

注意:卸载应用会让 LSPosed 的启用记录与作用域被级联删除,重装后需在 LSPosed 里
重新启用,或重启设备让它重新加载。用同签名覆盖安装(pm install -r)不会丢。
每次安装更新,Health Connect 也会撤销本应用的全部健康权限,重新授权即可。

详见 README。

OHSync v1.0.6

Choose a tag to compare

@github-actions github-actions released this 05 Oct 07:21

把 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。

  1. 安装本 APK,先打开一次 OHSync
  2. 在应用内点「去授权」,勾选要授予的健康数据类型
  3. 在 LSPosed 里启用 OHSync,作用域只勾 OPPO 健康
  4. 打开一次 OPPO 健康
  5. 回到 OHSync 点「立即同步」

详见 README。

OHSync v1.0.5

Choose a tag to compare

@github-actions github-actions released this 05 Oct 07:07

把 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。

  1. 安装本 APK,先打开一次 OHSync
  2. 在应用内点「去授权」,勾选要授予的健康数据类型
  3. 在 LSPosed 里启用 OHSync,作用域只勾 OPPO 健康
  4. 打开一次 OPPO 健康
  5. 回到 OHSync 点「立即同步」

详见 README。

OHSync v1.0.3

Choose a tag to compare

@github-actions github-actions released this 05 Oct 06:34

把 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。

  1. 安装本 APK,先打开一次 OHSync
  2. 在应用内点「去授权」,勾选要授予的健康数据类型
  3. 在 LSPosed 里启用 OHSync,作用域只勾 OPPO 健康
  4. 打开一次 OPPO 健康
  5. 回到 OHSync 点「立即同步」

详见 README。

OHSync v1.0.0

Choose a tag to compare

@github-actions github-actions released this 05 Oct 04:14

把 OPPO 健康(国行版)的数据同步进 Android 原生 健康数据共享(Health Connect)。

同步内容

  • 步数、距离、活动卡路里、心率、血氧、血压、体重
  • 睡眠,含深睡 / 浅睡 / 快速眼动 / 清醒分段

功能

  • 自动同步间隔可选(仅手动 / 15 分钟 / 30 分钟 / 1 小时 / 3 / 6 / 12 小时 / 每天),默认 1 小时
  • 回填时间范围可选,默认最近 3 个月
  • 自动同步走增量,只推上次之后的新数据
  • 重复推送幂等,不会产生重复记录

安装

需要 Root + LSPosed,以及可用的 Health Connect。

  1. 安装本 APK,先打开一次 OHSync
  2. 在应用内点「去授权」,勾选要授予的健康数据类型
  3. 在 LSPosed 里启用 OHSync,作用域只勾 OPPO 健康
  4. 打开一次 OPPO 健康
  5. 回到 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 都会撤销本应用的全部健康权限(平台行为)。更新后请重新点一次「去授权」。