跑这份清单一次,每条 ✅ / ❌ + 备注。任何 ❌ 都 block release 直到修复或 在 RELEASE.md 显式 acknowledge。
跨 v0.6 → v0.9 大量改动 + AGP / Compose / Gradle 大版本跳跃 + targetSdk 35→36,只 Roborazzi 模拟器测过;真机 QA 是 release 前最关键一步。
- 设备:___(型号 / Android 版本 / 屏幕尺寸)
- 时间:___
- 版本:v___(versionName)build ___(versionCode)
-
adb install -r app-release.apk成功 - launcher 图标显示正确(不是默认 Android 机器人)
- 启动 app 不崩,OpenFileScreen 显示,顶部 TopAppBar 显示 app name + 版本号
- 卸载后重装,previously-loaded keylog 不残留
- 「打开 PCAP 文件」按钮 → SAF 文件选择器
- 选一个 5-50MB PCAP(建议 Wireshark 样例 / PCAPdroid 真实抓包)→ 三联视图
- 选一个 PCAPng 文件 → 看到「PacketScope 暂不支持 PCAPng」明确错误
- 选一个 > 500MB 文件 → 看到「文件大小 ... 超过 500 MB」明确错误
- 选一个非 PCAP 文件(mp4 / pdf)→ 看到「解析失败」错误,不崩
- FrameList 列表能滚到底(10k+ 包)
- 点列头排序:时间 / 协议 / 长度 / Info 都能切升降序
- 点 frame 进 FrameDetailScreen,协议树默认全收缩
- ⊞ / ⊟ 一键展开 / 收缩工作
- 点字段高亮对应 hex 字节(黄色背景)
- Payload section 显示,⤢ 全屏按钮可点
- 长按字段 → 全屏 FieldDetailDialog
- Dialog 内打开搜索 → 输入关键词 → ↑/↓ 跳转 → 命中行滚到视口
- 顶栏
?按钮打开「过滤语法」帮助 dialog - 点协议名 / 完整示例直接填回输入框
- 点参数 atom (
host <IP>) 只插前缀,光标停末尾 - 输入
tcp and port 80过滤数变化 - 故意输错
host→ 看到本地化错误提示
- 顶栏「会话」按钮进 ConversationsScreen
- 卡片按字节降序,显示 TCP / UDP 徽章
- 点 conversation 卡片进详情屏
- 详情屏 stats 卡片显示双向 packets / bytes / duration
- TCP conversation 有「跟随 TCP 流」按钮 → FollowStreamScreen
- FollowStreamScreen 显示 N 个 segment 卡片
- 顶栏搜索按钮打开 SearchHeaderBar
- 跨段搜索:输入关键词命中多段,↑/↓ 跳到正确段 + 段内行
- 长按选区跨行 / 跨段复制 OK
- OpenFileScreen「加载 SSLKEYLOGFILE」选 keylog 文件
- 状态行显示「已加载 N 个 session keys」
- 「清除」按钮工作,状态行消失
- 打开含 TLS 流量的 PCAP(keylog 匹配的)→ TLS 层下挂解密结果 Field
- 加载第二份 keylog → 状态行 sessionCount 更新(旧 keys 不残留)
- OpenFileScreen「监听 PCAPdroid」→ 端口输入 dialog(默认 1234)
- 输入合法端口 → 监听 → 顶栏 source 行变「实时 :1234」
- PCAPdroid 设 UDP Exporter Collector =
127.0.0.1Port = 1234 → 开抓 - frames 实时进列表,每 32 帧通知刷新
- 「清空」按钮只清 frames 不停 listener
- 按返回 → 「停止监听?」确认 dialog
- 确认 → 通知消失,回 OpenFileScreen
- PCAPdroid 抓包停止 → 长按 PCAP → 分享 → 选 PacketScope
- PacketScope 自动打开,显示三联视图
- frame 列表 Info 列显示
[app名]前缀(来自 PCAPdroid trailer)
- OpenFileScreen 右上 overflow(三点 icon)→ 「关于」
- AboutScreen 显示 launcher icon / app_name / tagline / 版本号 (versionName + versionCode)
- Source 段 4 个 link 全部能跳浏览器:源代码 / 许可证 / 第三方依赖 / 隐私政策
- Related projects: PCAPdroid 链接跳转 emanuele-f/PCAPdroid
- 「检查更新」按钮 → 浏览器打开 GitHub Releases /releases/latest
- 「反馈问题」按钮 → 浏览器打开 issues 页
- Overflow 「反馈问题」(OpenFileScreen 直接路径)也工作
- 系统切英语 → 重启 app → UI 全英文,无中文残留(TopAppBar / About / 错误消息)
- 系统切简体中文 → 重启 → UI 全中文,无英文残留
- 系统切其它语言(日文)→ UI fallback 英文
- 各 screen 旋转屏幕,state 不丢
- 切后台 → 等 30 秒 → 切回,state 保留
- 实时监听模式切后台 → 通知保持 → 切回 frames 继续
- 实时监听模式通知小图标显示正常(不是默认下载图标)
- 通知 action「停止监听」点击有效
- 系统设置 → 应用 → 通知 → channel 名「实时监听」(locale 对应)
- 200MB PCAP 加载 < 30 秒
- 50k 包 filter 实时输入无明显卡顿
- hex dump 展开后滚动流畅
adb shell dumpsys meminfo io.github.packetscope.debug 读 heap 档案:
- 200 MB PCAP 加载后 Dalvik Heap < 200 MB(v1.1 lazy 改造后 raw bytes 不入 heap,仅元数据 + indices)
- Native Heap 反映 mmap 占用(应能看到 ≈ PCAP 文件大小的 mmapped region),证明 zero-copy 视图生效
- 1 GB PCAP 打开 < 5 秒 + 不 OOM(LAZY-005 上限提升后必测)
- 连续打开 5 个不同 PCAP,旧 mmap 立即释放——
procrank/dumpsys meminfo看 PSS 不累积增长(LAZY-003 PcapHandle 验收)
操作步骤:
adb shell dumpsys meminfo io.github.packetscope.debug | head -40
# 关注两段:
# App Summary → Java Heap (Dalvik) + Native Heap
# Mappings → mmap 字节数
期望档案(200 MB PCAP):
- Dalvik Heap ≈ 50-150 MB(layers / fields / indices;跟帧数线性,跟单 帧字节数无关)
- Native Heap + mmap ≈ 200 MB(OS paging 按需,cold cache 时较低)
- 没有任何 logcat ERROR / FATAL 输出
- StrictMode(dev build)无 ANR / disk I/O on main thread 告警
- memory profile 无 leak(打开 / 关闭 PCAP 反复 10 次 heap 稳定)
跑 QA 时顺手存图,命名:
01-frame-list.png(B 段)02-frame-detail.png(C 段)03-conversations.png(E 段)04-follow-stream.png(F 段)05-filter-help.png(D 段)06-streaming.png(H 段)
复制到:
docs/screenshots/—— README 引用fastlane/metadata/android/en-US/images/phoneScreenshots/—— F-Droidfastlane/metadata/android/zh-CN/images/phoneScreenshots/—— F-Droid 中文
- 全 ✅,release 放行
- 有 ❌:___(issue 编号 / 描述)→ 修复后重跑相关段
签字:___(reviewer 姓名 / 日期)