验证安卓多进程服务时,先明确要验证的不是单一的“进程还在不在”。安卓应用多进程服务的会话存活验证,至少要分别回答两个问题:服务进程是否存活或重建,以及进程重建后原有业务会话是否仍有效。两者混为一谈,容易把恢复了进程误判成恢复了会话。
先定义“存活”:进程、服务和会话分开看
应用可通过清单中的进程配置,让服务运行在独立进程。进程被系统回收后,服务有机会重新创建,但原进程里的内存对象不会自动保留。若登录凭据或会话状态只放在内存中,重建后可能需要重新读取持久化数据,甚至重新登录。
- 进程存活:记录服务所在进程的进程号、启动时间和重建次数。
- 服务可用:检查绑定或启动后,服务能否响应一次明确的请求。
- 会话有效:用原会话执行受保护的业务请求,并检查服务端是否接受;不要只看本地界面仍显示已登录。
因此,安卓应用多进程服务的会话存活验证应把“进程重建”和“会话恢复”分成两项结果记录。会话有效期、服务端策略和网络状态都会影响结论。
新手怎么选测试方案
| 方案 | 适用场景 | 优缺点 |
|---|---|---|
| 手动场景测试 | 刚搭建验证流程,先确认基本行为 | 容易观察和复现;覆盖范围有限,环境变化要手动记录 |
| 自动化重复测试 | 已有稳定的启动、绑定和请求流程 | 便于比较多轮结果;需要维护设备、网络和测试数据 |
| 系统回收观察 | 重点评估后台运行及进程重建 | 更接近日常使用;系统是否回收进程并不完全可控 |
入门时建议先做手动基线,再扩展到重复测试。绑定服务适合观察客户端与服务的连接及断开;前台服务适用于确有持续用户可见任务的场景,但常驻通知不等于会话必然有效,也不应仅为测试而滥用。进程优先级会影响系统回收倾向,不能把某次未被回收当作稳定保证。
按步骤执行一轮可复现测试
- 固定条件。记录设备型号、安卓版本、应用版本、网络类型、电池限制设置,以及服务是否运行在独立进程。先选一台测试设备即可,之后再增加不同系统版本或厂商设备作对照。
- 建立基线。登录测试账号,启动服务并发出一项能确认成功的请求。记录时间、服务进程号、会话标识的脱敏值和请求结果,避免保存真实令牌。
- 逐项制造变化。先切到后台并等待,再锁屏;随后分别测试断网恢复、停止并重新启动服务,以及系统设置中的停止应用等情形。一次只改变一个条件,避免无法判断是哪一步造成变化。
- 观察重建。使用 Android Studio 的 Logcat 或系统进程信息查看服务进程是否退出、是否重新创建;在日志中标记服务创建、连接、断开及业务请求结果。不要只用应用界面是否还开着来判断。
- 验证会话。进程恢复后,用同一业务请求检查服务端响应。分别记录“进程恢复”“请求成功”“是否要求重新认证”,并在相同条件下重复几轮;新手可先做约 3 至 5 轮探索,发现波动后再扩大次数。
怎样读结果,避免常见误判
如果进程号变化但原业务请求仍成功,说明进程发生重建而会话恢复有效;如果进程仍在但请求提示认证失效,则是会话或服务端有效期问题,不是进程存活问题。若请求失败,同时网络也不可用,应先恢复网络再测,不能直接归因于服务被系统回收。
还要区分正常返回、从最近任务划掉、系统回收和用户在系统设置中强行停止。它们触发的生命周期行为不相同;强行停止尤其不应与普通后台切换混为一类。测试报告应写清触发方式、等待时间、日志证据和服务端响应,不用“后台运行正常”代替结论。
常见问题
设置 START_STICKY 就能保证服务不退出吗?
不能。它影响服务被系统结束后的重启行为,但不保证进程常驻,也不会自动恢复内存中的会话对象。
切到后台几分钟就够了吗?
只能作为一个场景。系统负载、电池策略和设备厂商都会影响回收时机,应同时测试锁屏、网络变化等条件,并记录实际等待时间。
应该把会话令牌写进日志吗?
不应该。使用脱敏标识或仅记录是否存在、是否被服务端接受,避免把凭据写入 Logcat 或测试报告。
怎样判断测试方案已经够用?
至少覆盖基线、后台状态、一次进程重建和会话请求验证,并能从日志复现结论。安卓应用多进程服务的会话存活验证,最终应分别报告进程状态与会话结果,而不是合并成一个“存活”结论。