2026-05-18 11:10:52 +08:00

5.3 KiB
Raw Blame History

Why

当前 SmsReceive 已经能在部分场景接收并解析验证码短信,但目标设备是小米 12S、澎湃 OS 3、Android 15后台策略比标准 Android 更激进。仅靠 SMS_RECEIVED_ACTION 静态广播不够,需要补齐“开机后自动恢复监听、后台运行可见、系统设置可引导、失败可诊断”的完整方案。

这次需求的重点不是规避系统限制,而是在个人自用 sideload/debug app 的边界内,把 Android 官方后台机制、HyperOS 人工设置、短信广播兜底路径和可验证诊断组合起来。用户也会手动在小米设置中开启“自启动”和“省电策略-无限制”,因此方案应显式利用这个前提。

What Changes

  • 新增小米/Android 15 后台保活规格,覆盖:
    • 开机自启动:注册 BOOT_COMPLETEDLOCKED_BOOT_COMPLETEDMY_PACKAGE_REPLACED,开机后恢复轻量状态并尝试启动保活服务。
    • 通知栏常驻:增加前台服务 + 低打扰常驻通知,用于让进程在后台更可见、更不容易被系统回收。
    • 短信广播链路:保留当前 RECEIVE_SMS + SMS_RECEIVED_ACTION 主路径,增加更清晰的“为什么 onReceive 收不到”的诊断。
    • 服务链路:增加 SmsKeepAliveService,只负责常驻通知、状态心跳和轻量诊断,不在服务内做耗时短信扫描。
    • 收件箱兜底:保留 READ_SMS 最新短信读取、ContentObserver、手动读取和短时轮询用于确认短信已入库但广播未到达的场景。
    • HyperOS 设置引导:提供打开应用详情、忽略电池优化设置、小米后台自启动设置的入口,并在 UI 展示用户需要手动完成的清单。
    • Native/C++ 尝试边界:允许加入 NDK native heartbeat 作为实验诊断,但不把 C++ fork/daemon 作为可靠保活主方案。
  • 明确 Android 15 限制:
    • RECEIVE_SMS 是 dangerous 且 hard restricted 权限,安装来源/安装器 allowlist 可能影响授权。
    • Android 15 对 BOOT_COMPLETED 启动部分类型前台服务有限制,不能把 dataSync/media 等类型当成开机拉起通道。
    • Doze/App Standby 即使加入电池优化白名单也仍会有部分限制,必须用真机验证而不是只看 API 成功。
  • 不直接修改业务代码。后续实现前需要先用 OpenSpec 校验本 change。

Capabilities

New Capabilities

  • sms-background-keepalive: 定义开机广播、前台服务、常驻通知、保活心跳和失败恢复行为。
  • xiaomi-hyperos-background-setup: 定义小米/HyperOS 自启动、省电无限制、电池优化、权限设置入口和用户操作清单。
  • sms-receiver-delivery-diagnostics: 定义 onReceive 不触发时的排查维度包括权限、安装来源、force-stop、开机广播、厂商后台策略、短信是否入库、广播是否被系统限制。

Modified Capabilities

  • sms-code-capture: 后续实现应把短信广播主路径和收件箱兜底路径接入统一诊断来源,明确区分 system_sms_broadcastsms_inbox_observersms_inbox_manualsms_inbox_pollingboot_keepalive
  • sms-permission-diagnostics: 后续实现应补充电池优化、前台服务、开机接收器、HyperOS 设置状态和最近心跳状态。
  • sms-code-validation-workflow: 后续验证应增加重启、锁屏、后台、省电策略、force-stop、开机后第一条短信等设备场景。

Impact

  • 预期后续会修改:
    • app/src/main/AndroidManifest.xml
    • app/src/main/java/com/smsreceive/app/MainActivity.java
    • 新增 BootReceiverSmsKeepAliveServiceKeepAliveNotificationBackgroundSetupGuideKeepAliveStateStore 等 Java 类
    • 可选新增 NDK/C++ heartbeat 实验文件,但默认不作为交付必需项
  • 预期新增权限:
    • android.permission.RECEIVE_BOOT_COMPLETED
    • android.permission.FOREGROUND_SERVICE
    • 视 targetSdk 和实现情况考虑 android.permission.POST_NOTIFICATIONS
    • 视是否直接请求白名单考虑 android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
  • 主要 API 和设置入口:
    • Intent.ACTION_BOOT_COMPLETED
    • Intent.ACTION_LOCKED_BOOT_COMPLETED
    • Intent.ACTION_MY_PACKAGE_REPLACED
    • Context.startForegroundService
    • Service.startForeground
    • PowerManager.isIgnoringBatteryOptimizations
    • Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
    • Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
    • 小米自启动设置入口优先使用显式组件尝试,失败时回退应用详情页或系统设置页
  • 该方案面向个人自用,不承诺 Play Store 合规;但仍不应隐藏通知、不应滥用后台执行、不应上传短信内容。

Validation

  • OpenSpec 文档结构完整,包含 proposal.mddesign.mdtasks.md 和三个 capability spec。
  • 方案必须能解释以下问题:
    • 为什么 onReceive 可能收不到短信。
    • 前台服务能解决什么,不能解决什么。
    • 开机自启动在 Android 15 和 HyperOS 上的真实限制。
    • C++/native 进程为什么只能作为诊断实验,不能作为可靠保活。
  • 代码实现完成后不要求本轮编译,但后续至少需要完成单元测试和真机验证清单。
  • 每次 commit 或 push 前必须检查 diff避免引入非预期 EOF newline 变化。