Fix cached reminder recovery and retain pre-reconcile idle diagnostics

This commit is contained in:
david1465833828
2026-10-28 17:46:33 +08:00
parent 93bcfd534c
commit dc71e411e9
13 changed files with 350 additions and 6 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
# Android 首版验证记录
当前版本为0.7.8+32,点按放大、外溢及柔软材质见[本次记录](tpschedule-0.7.8-dock-bloom.md)。构建31的移动中Q弹、牵拉及减薄见[本次记录](tpschedule-0.7.8-dock-drag.md)。构建30的点按/方向弹动及乳白材质见[本次记录](tpschedule-0.7.8-dock-spring.md)。构建29的Dock弹性与Android平板验证见[本次记录](tpschedule-0.7.8-dock-tablet.md)。构建28的通知权限恢复、通道初始化及真实后台触发见[通知记录](tpschedule-0.7.8-notification-permissions.md)。Dock乳白透光材质见[优化记录](tpschedule-0.7.8-dock-refinement.md)。本科/研究生HTML反馈及签名、备案信息见[0.7.8功能记录](tpschedule-0.7.8-validation.md)。应用更新检查与后台说明见[0.7.6记录](tpschedule-0.7.6-updates.md)。本科考试兼容的验证见[0.7.5记录](tpschedule-0.7.5-validation.md)。两例真实课表缺失字段问题待新页面定位。本科接入记录见[0.7.0记录](tpschedule-0.7.0-validation.md)。下文为首版历史记录。
当前版本为0.7.8+33,提醒恢复与待机诊断见[本次记录](tpschedule-0.7.8-reminder-idle.md)。构建32的点按放大、外溢及柔软材质见[本次记录](tpschedule-0.7.8-dock-bloom.md)。构建31的移动中Q弹、牵拉及减薄见[本次记录](tpschedule-0.7.8-dock-drag.md)。构建30的点按/方向弹动及乳白材质见[本次记录](tpschedule-0.7.8-dock-spring.md)。构建29的Dock弹性与Android平板验证见[本次记录](tpschedule-0.7.8-dock-tablet.md)。构建28的通知权限恢复、通道初始化及真实后台触发见[通知记录](tpschedule-0.7.8-notification-permissions.md)。Dock乳白透光材质见[优化记录](tpschedule-0.7.8-dock-refinement.md)。本科/研究生HTML反馈及签名、备案信息见[0.7.8功能记录](tpschedule-0.7.8-validation.md)。应用更新检查与后台说明见[0.7.6记录](tpschedule-0.7.6-updates.md)。本科考试兼容的验证见[0.7.5记录](tpschedule-0.7.5-validation.md)。两例真实课表缺失字段问题待新页面定位。本科接入记录见[0.7.0记录](tpschedule-0.7.0-validation.md)。下文为首版历史记录。
日期:2026-10-13。测试环境:Flutter 3.47.7 / Dart 3.13.5 / JDK 17;Android 16 API 36,Pixel 7 模拟器,1080×2400。首版版本 0.1.0+1,包 ID com.example.hepan_everyday,最低 Android 7.0(API 24)。
+43
View File
@@ -0,0 +1,43 @@
# 0.7.8+33:长时间后台提醒排查与恢复
日期:2026-10-28。问题设备为 vivo X200 Pro / Android 16。用户确认通知、精确提醒、自启动、关联启动和后台高耗电均已允许;没有重启或划掉应用,只是几小时或半天未打开后漏提醒。此前通知总开关关闭的问题已恢复,本次不能沿用那个结论。
## 已复现并修复的程序问题
提醒协调原先只比较插件中的缓存 ID 和内存中的课程指纹。如果系统 PendingIntent 已丢失而插件缓存仍在,同一个应用进程会跳过重新登记。回归测试先复现“应重新登记但没有登记”,修复后通过:相同课程、时间、提醒内容下,只要系统触发信息缺失,也会重新安排。
新增只读原生检查,使用和 flutter_local_notifications 22.3.2 一致的显式 Receiver、ID 和 immutable 标记,通过 FLAG_NO_CREATE 查询,不创建替代触发任务。检查失败不阻断原有安排流程。PendingIntent 存在本身不证明 AlarmManager 中仍有有效任务,更不能证明已投递;不存在则可作为恢复依据。
## 诊断保留
- Activity 创建时,在 Dart 自动恢复前记录插件课程缓存数量、现存/缺失触发信息数量,以及超过预计提醒时间两分钟的缓存数量。
- 暖启动/返回前台时,先检查全部缓存,再删除已过期提醒;有异常的摘要保留在当前 Activity 中,供随后“检查提醒”复制。避免恢复动作覆盖现场。摘要不跨 Activity 重建持久保存。
- “检查提醒”先记录检查前的状态,再协调和读取检查后状态。
- 增加系统待机分组、Doze 状态、最近一次进程退出原因/时间、启动前停止状态和仍显示的最近课程通知时间。API 不支持或系统拒绝读取时保留未知值。
- 复制出的报告不包含课程名称、教师、教室、提醒 ID、帐号、密码、Cookie 或原始错误正文。诊断只在用户主动复制后对外提供。
进程退出原因不能单独证明强行停止;当前待机分组也可能已因打开应用恢复为活跃。已消失的通知无法用“仍显示的最近通知时间”判断是否曾投递。过期缓存也可能来自时间设置变更等情况,不能直接认定厂商丢弃任务。
## 验证
- Flutter 全量 326 项测试通过;静态分析无问题;正式 APK 构建通过。
- Android 原生 JUnit 两项通过:只读计数、去重、排除测试 ID 和空列表;不输出课程 ID。
- 新增回归覆盖:缓存和指纹相同但触发丢失时重建;暖启动过期记录在取消前检查;原生返回 ID 限定于请求范围;可选检查失败不阻断;诊断字段白名单与检查顺序。
- 正式 33 包安装至 Android 16 API 36 专用模拟器。仅向测试设备加入两条合成课程缓存,未登记对应系统任务,其中一条已过期。启动自动清理后,“检查提醒”仍显示缺失 2 条、过期 1 条,待发送 0 条,证明恢复前信息得以保留。
- 正式 33 包通过应用内“10 秒后台测试”,Home 后强制进入深度 Doze,并设置 rare 待机分组(40)。系统记录确认存在精确 RTC_WAKEUP,随后实际收到 id=-1002、tag=hepan-test 的通知。测试后恢复模拟器待机与电池状态。
- 前序正式 32 包还验证过普通进程被杀后由原生 Receiver 唤起投递,以及设备真正重启后未打开应用即恢复并投递。它们是基础原生路径的证据,不能替代 vivo 真机长待机复测。
- 独立审查未发现需要修复的缺陷;审查指出的暖启动证据缺失已补上并以回归验证。
本地验证日志位于 .tools/033-*.log、033-audit-result.xml、033-idle-*.txt;测试使用合成数据,不进入公开源码包。
## 使用与边界
同签名覆盖安装 0.7.8+33,打开一次以安排当前课程提醒。若之后几小时未打开又漏提醒,请进入“我的 → 课表设置 → 检查提醒 → 复制提醒诊断”,将报告和漏提醒的大致时间提供给开发者。可以正常打开应用,新诊断会尽量保留自动恢复前的证据。
本轮修复的是已复现的恢复判断错误,并增加取证能力。尚未在 vivo 真机复现几小时后的失效,不能声称已确定或彻底解决该手机上的根因。未添加常驻前台服务、持续后台计时器或厂商私有接口。
## 平台依据
[Android 定时提醒](https://developer.android.com/develop/background-work/services/alarms)说明系统闹钟可独立于进程生命周期运行;[Android 15 停止状态行为](https://developer.android.com/about/versions/15/behavior-changes-all)说明强行停止与 PendingIntent 取消的关系。[待机分组](https://developer.android.com/topic/performance/appstandby)及[电源资源限制](https://developer.android.com/topic/performance/power/power-details)用于解释诊断字段;不据此推断本机已经触发某项限制。
包名 com.tpschedule.app、原签名密钥/证书、公钥和备案号蜀ICP备2025169276号-5A保持。0.5.4 软著登记冻结材料和旧版本产物保持。用户的服务器无需为本次提醒修复更新代码;更新后台发布时使用版本 0.7.8、构建号 33。