## 一、准备阶段 ### A. 项目初始化 - [x] 创建 Flutter package 工程(当前包名:`yx_tracking_flutter`) - [x] 配置 `pubspec.yaml`(已添加 `sqflite`、`path_provider`、`dio`、`path`) - [x] 配置 SDK 最低支持 Flutter / Dart 版本(Flutter `>=3.22.0`,Dart `>=3.3.0 <4.0.0`) - [x] 建立基础目录结构(入口为 `lib/yx_tracking_flutter.dart`,`lib/src/*` 已建立) - [x] 约定统一代码风格(使用 `flutter_lints`) ------ ## 二、Phase 1 开发任务(可用性 + 稳定性) ### 1. 基础模型与配置 - [x] 实现 `AnalyticsConfig`(含 HTTPS 与参数校验) - [x] 实现 `UserInfo` - [x] 实现 `DeviceInfo` - [x] 实现 `Event` & `StoredEvent`(含 payload 序列化/反序列化) - [x] 实现 `TimeUtil`(时间戳 & ISO8601 格式化) - [x] 实现 `Logger`(debug/info/warn/error,debug 开关控制) - [x] 实现 `DeviceUtil`(采集 os/model/screenResolution 的最小实现) ### 2. 存储层(EventStorage + Sqflite) - [x] 抽象接口 `EventStorage`(含 init/insert/fetchBatch/delete/count/trim/updateRetryCount/dispose) - [x] 实现 `SqfliteEventStorage`(建表、索引、CRUD、trim、retryCount 更新) - [x] 封装事件反序列化(`Event.fromPayload` / `Event.fromJson`) - [x] 稳定性修补:`fetchBatch` 会删除解析失败的坏数据,避免队列被卡死 ### 3. 网络层(ApiClient) - [x] 封装 `HttpClient`(基于 Dio,支持超时与自定义 headers) - [x] 实现 `ApiClient.sendBatch`(调用 `/AddEventListLog`) - [x] 状态码与异常模型(`ApiException` 区分可重试/不可重试) ### 4. 核心逻辑(AnalyticsCore + Scheduler) - [x] 实现 `Scheduler`(`Timer.periodic` + start/stop) - [x] 实现 `AnalyticsCore.init`(校验配置、采集设备、初始化存储/网络、启动调度) - [x] 实现 `track` 主流程(构造事件、入库、trim、达到 batchSize 触发 flush) - [x] 实现 `flush`(互斥、防并发、批量发送、重试与退避) - [x] 稳定性增强(重试退避、异常兜底、坏数据清理) - [x] Phase 2 已接入(ConfigManager、Validator、配置周期刷新、release 校验标记)\n- [x] 实现 `IsolateEventStorage`(默认启用,后台 Isolate 执行 IO)\n- [x] 实现生命周期监听(`bindLifecycleObserver`,后台/销毁时自动 flush) ### 5. Facade 对外接口(company_analytics.dart) - [x] 暴露 `Analytics` Facade(入口文件:`lib/yx_tracking_flutter.dart`) - [x] 已提供 `init/track/setUser/setDeviceInfo/flush/setDebug/dispose` - [x] 调试 API:`cachedEventCount/cachedRecentEvents/refreshConfig/reportMetricsNow` - [x] `addInterceptor(...)` 已实现(Phase 3) ### 6. Phase 1 测试任务 - [x] 基础单测已存在(配置校验、事件序列化/反序列化) - [x] `EventStorage` 行为测试已覆盖(trim、fetchRecent、retryCount 更新等契约测试) - [x] `AnalyticsCore.track/flush` 成功与失败重试路径测试已覆盖 - [x] 已完成 mock 集成测试与压力测试(断网恢复补发、track 1 万次稳定性) ------ ## 三、Phase 2 开发任务(配置化 + 校验 + 调试) ### 1. 配置模型 & 持久化 - [x] 定义 `SystemInfo / EventDefinition / TagDefinition / SystemDimInfo` - [x] 使用 sqflite 同库缓存配置(表:`config_cache`) - [x] 已实现 `saveSystemDimInfo / loadSystemDimInfo` ### 2. ConfigManager - [x] 已实现 `ConfigManager`(持有 `currentConfig`、支持缓存加载与拉取) - [x] 已接入 `GET /GetSystemAllDimInfo?system_code=...` - [x] 已在 `AnalyticsCore.init` 中异步拉取(失败不影响埋点) - [x] 周期刷新已补齐(定时器按 refreshInterval 拉取) ### 3. Validator(事件校验) - [x] 已实现 `Validator`(依赖 `ConfigManager`,输出 `ValidationResult`) - [x] 已在 `AnalyticsCore.track` 中接入校验并打印 errors/warnings - [x] Release 模式已补充校验标记(写入 `_sdk_invalid_event/_sdk_missing_tags/_sdk_type_error_fields`) - [x] “严重 error 阻断发送”的策略开关已实现(`blockOnValidationError`) ### 4. 调试增强 - [x] `Logger` 已具备 debug/info/warn/error 级别与 debug 开关 - [x] 关键路径日志已接入(init/track/flush/validator/config) - [x] 已提供 Demo 调试界面(`example/`) - [x] Demo 已支持:缓存条数、最近事件摘要、Track Demo Event、Flush Now、Refresh Config ### 5. Phase 2 测试任务 - [x] 配置拉取测试已覆盖(正确/错误 JSON、刷新跳过、缓存保持) - [x] 校验行为测试已覆盖(未知事件、缺失必填、类型不匹配) - [x] “配置失败不影响发送”的降级路径已覆盖(无配置仍可 track/flush) ------ ## 四、Phase 3 开发任务(监控 + 策略 + 插件) ### 1. 自监控埋点 - [x] 已在 `AnalyticsCore` 中增加统计字段(sent/failed/retry/dropped、平均延迟、窗口时间) - [x] 已在 flush 成功 / 失败 / 删除 / 丢弃等位置更新计数 - [x] 已实现指标上报(定时器 + 内部事件 `SDK_METRICS_SEND / SDK_METRICS_QUEUE`) - [x] 已提供调试入口:`Analytics.reportMetricsNow()` ### 2. 策略控制(采样与开关) - [x] 已在 `SystemDimInfo` 中增加策略字段(`SdkStrategy / EventStrategy`) - [x] 已在 `ConfigManager` 中解析并缓存策略 - [x] 已在 `AnalyticsCore.track` 入口接入策略(全局开关 / 事件开关 / 采样率) ### 3. 插件(拦截器)机制 - [x] 已定义接口 `AnalyticsInterceptor`(`beforeSend / afterSend`) - [x] 已在 `AnalyticsCore` 中维护拦截器列表并实现 `addInterceptor(...)` - [x] 已在 flush 前调用 `beforeSend`(支持返回 null 拦截事件) - [x] 已在 flush 后调用 `afterSend`(成功/失败均回调) - [x] 已做异常隔离(拦截器异常不会影响主流程) - [x] 已内置 `CommonTagsInterceptor`(自动追加 `_sdk_version/_platform`) ### 4. Phase 3 测试任务 - [x] 自监控事件测试已覆盖(`reportMetricsNow` 生成 `SDK_METRICS_*` 事件) - [x] 策略测试已覆盖(全局关闭、事件关闭、采样率) - [x] 拦截器测试已覆盖(追加 tag、拦截事件、异常隔离、afterSend 回调) ------ ## 五、交付物与文档清单 - [x] SDK 源码(Flutter package) - [x] 单元测试代码(关键路径已覆盖;覆盖率统计报告需单独产出) - [x] 集成 Demo App(示例项目,含 Debug 页面) - [x] 文档:README(使用说明 + 调试/拦截器/指标能力) - [x] 文档:设计说明(`2.Flutter 埋点 SDK 设计方案(独立 Dart 实现).md`)