Skip to content

fix(android): stop dataSync foreground service crash loop - #22

Merged
Disdjj merged 6 commits into
mainfrom
fix/android-background-runtime-timeout
Aug 28, 2026
Merged

fix(android): stop dataSync foreground service crash loop#22
Disdjj merged 6 commits into
mainfrom
fix/android-background-runtime-timeout

Conversation

@Disdjj

@Disdjj Disdjj commented Aug 28, 2026

Copy link
Copy Markdown
Member

概要

  • Android 15+ dataSync foreground service 配额耗尽时,在 onTimeout() 中立即 stopSelf()
  • 将服务重启策略从 START_STICKY 改为 START_NOT_STICKY,避免重建无法恢复 JS/device connection 的空服务,以及额度耗尽后的二次启动异常。
  • 新增静态契约测试,锁定 timeout 自停与非 sticky 策略。
  • 将 Expo SDK 57 / React Native 及相关原生、测试依赖对齐到官方兼容 patch,恢复完整 release gate。
  • 准备 Preview 0.0.12:package/App version、Android versionCode、iOS buildNumber、CHANGELOG 和验证脚本已同步。
  • 同步 llmdoc 的 Android 后台运行边界与依赖版本事实。

根因

Android 16 / targetSdk 36 的现场日志显示:

  1. dataSync FGS 达到 Android 15+ 同类型滚动 24 小时内 6 小时后台预算;
  2. 服务未实现 Service.onTimeout(int, int),触发 ForegroundServiceDidNotStopInTimeException
  3. 原有 START_STICKY 在额度仍耗尽时尝试重建服务,又触发 ForegroundServiceStartNotAllowedException

服务本身只显示可见通知、辅助提高进程优先级,不承载 JS runtime、WebSocket 或命令执行,因此 sticky 重建不能恢复连接。

能力、权限与平台差异

  • 能力变化:没有新增远程能力;仅修复 Android 后台运行辅助服务的退出/重启策略。
  • 权限变化:无。继续使用既有 FOREGROUND_SERVICEFOREGROUND_SERVICE_DATA_SYNC
  • Android:timeout 后按平台要求停服,不再进入崩溃/重启循环。
  • iOS:没有对应 foreground service,业务语义不变。
  • 安全边界:该修复不增加后台预算,也不声称息屏、Doze、force-stop 或进程回收后可靠可达。durable mailbox + opaque APNs/FCM wake 仍由上游 TokenRollAI/tool-bridge#117 跟踪。

验证证据

本地锁定 Node 22.23.1、pnpm 11.21.0、Java 17:

  • pnpm install --frozen-lockfile:通过
  • pnpm verify:release-tag v0.0.12:通过
  • pnpm verify:通过,79 suites / 367 tests
  • pnpm verify:doctor:21/21 checks 通过
  • pnpm peers check:通过
  • pnpm audit:dependencies:无 high/critical;1 个 moderate
  • pnpm build:android:preview:通过
    • package:ai.tokenroll.toolbridgemobile.preview
    • versionName/versionCode:0.0.12 / 12
    • 内含 assets/index.android.bundle
    • APK v2 签名验证通过(内部 debug test key)
    • 本地 SHA-256:f2d2e14cec2dbf6261e332666fcc8a79304e913de2018a14bc94c741d3011826
  • llmdoc validate:通过,仅有既存文档行数 warning

未验证:

  • 本机没有完整 Xcode,iOS simulator build 交由 PR/main CI 门禁;
  • 当前没有在线 ADB 设备,尚未补 Android 锁屏、Doze、6 小时配额耗尽的真机回归;
  • Preview 仍不是 production signer、AAB/IPA 或商店发布证据。

Tag 与发布

合并到 main 且 main verify 成功后,auto-release-preview 会从 package version 创建 annotated v0.0.12,复用 verified APK artifact 并发布 GitHub Pre-release。tag 不在 PR 分支提前创建,也不会移动已有 tag。

回滚

  • 合并前:关闭 PR 即可。
  • 合并后:revert merge commit;不要移动或复用已发布的 v0.0.12 tag。
  • v0.0.12 已发布后需要代码回滚,应以新的 patch version 重新走 verify/tag/Preview 流程。

@Disdjj
Disdjj merged commit f978275 into main Aug 28, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant