- 删除 VerificationCodeParser 及相关测试,短信捕获和推送不再解析验证码 - 飞书推送改为只发送短信原文,时间戳格式化为可读日期 - 移除主界面"只推送验证码"开关和"调试时上传完整短信正文"选项 - 移除"保存轮询间隔"按钮,开启轮询时自动保存间隔(未输入默认1秒) - 按钮文字从"开始1秒轮询验证码"改为"开始短信轮询" - 删除"打印最近30条短信"功能及相关 SmsInboxReader.logRecentMessages - SmsInboxReader 用 RecentSmsResult 替换 RecentCodeResult - FeishuWebhookConfigStore.Config 移除 filterVerificationCode/sendFullBodyDebug - 修复代码缩进不一致问题
71 lines
5.2 KiB
Markdown
71 lines
5.2 KiB
Markdown
## Why
|
||
|
||
当前 `SmsReceive` 已经能在部分场景接收并展示短信原文,但目标设备是小米 12S、澎湃 OS 3、Android 15,后台策略比标准 Android 更激进。仅靠 `SMS_RECEIVED_ACTION` 静态广播不够,需要补齐“开机后自动恢复监听、后台运行可见、系统设置可引导、失败可诊断”的完整方案。
|
||
|
||
这次需求的重点不是规避系统限制,而是在个人自用 sideload/debug app 的边界内,把 Android 官方后台机制、HyperOS 人工设置、短信广播兜底路径和可验证诊断组合起来。用户也会手动在小米设置中开启“自启动”和“省电策略-无限制”,因此方案应显式利用这个前提。
|
||
|
||
## What Changes
|
||
|
||
- 新增小米/Android 15 后台保活规格,覆盖:
|
||
- 开机自启动:注册 `BOOT_COMPLETED`、`LOCKED_BOOT_COMPLETED`、`MY_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_broadcast`、`sms_inbox_observer`、`sms_inbox_manual`、`sms_inbox_polling`、`boot_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`
|
||
- 新增 `BootReceiver`、`SmsKeepAliveService`、`KeepAliveNotification`、`BackgroundSetupGuide`、`KeepAliveStateStore` 等 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.md`、`design.md`、`tasks.md` 和三个 capability spec。
|
||
- 方案必须能解释以下问题:
|
||
- 为什么 `onReceive` 可能收不到短信。
|
||
- 前台服务能解决什么,不能解决什么。
|
||
- 开机自启动在 Android 15 和 HyperOS 上的真实限制。
|
||
- C++/native 进程为什么只能作为诊断实验,不能作为可靠保活。
|
||
- 代码实现完成后不要求本轮编译,但后续至少需要完成单元测试和真机验证清单。
|
||
- 每次 commit 或 push 前必须检查 diff,避免引入非预期 EOF newline 变化。
|