UOTA 升级与域名分发
本页描述两个并存的业务:渠道定向的UOTA版本升级,以及终端启动时取得服务域名和UOTA安装包的分发。它们都使用Task独立库ik_yudao_task,但不是同一张版本表,也没有已证明的表间一一同步关系。
渠道版本升级
运营创建task_uota_detail时先从infra文件服务读取包名和版本并保存,再建立渠道关联。终端查询更新时,Task从客户端上下文或device接口获取渠道,以“包名+渠道”查最新版本,检查status=1且服务端版本高于终端版本后返回文件及安装参数。is_system_app、install_path、is_auto_start解释包应如何安装/启动,而不是任务是否启用。
| 表 | 业务角色 | 关联与约束 |
|---|---|---|
task_uota_detail | 可下发的UOTA版本定义,含文件ID、包名、版本、安装参数 | infra_file_id逻辑关联infra文件;仅id主键,无包名版本唯一索引 |
task_flow_uota_channel | 哪些渠道可获取这个版本 | uota_id关联版本,channel_id关联device渠道;Service检查重复,但实库仅主键 |
task_flow_uota_mac | 保留按MAC维护UOTA关联的管理能力 | uota_id+mac为业务关系;仅主键;当前所核对的版本检查路径按渠道查询,不应假设该表参与所有下发 |
task_flow_uota_download | 实库注释为升级下载记录 | 本模块当前未找到实体/Mapper/Service引用;只确认结构存在,不宣称仍在写入 |
Redis将版本实体按ID缓存,将“包名+渠道”做有序集合索引,版本号作score、UOTA ID作member,倒序取最新版本。业务关联删除会同步删除对应索引。MySQL不具备相应业务唯一约束,不能把Redis索引或Service检查写成物理唯一键。
task_uota_detail及两类关联DO仍保留valid/draft字段;UOTA的valid在Java中为Boolean,而Task审批主表使用Integer枚举。当前UOTA更新检查直接判断status和版本,不能照搬任务审批状态表解释UOTA,更不能因为留有draft就断言整条UOTA管理链已接入同一BPM流程。
域名池与 APK 池
task_domain保存按type分类的可用域名,enable控制是否可分发;task_domain_uota_app保存APK池,携带platform、包名、版本、文件ID及URL/大小快照,enable控制是否参与分发。两表没有直接外键;“同时返回域名和APK”是服务编排行为,不表示一个域名只对应一个APK。
V1从可用池按类型、包名/平台整理结果;V2先取得设备信息,再分别以DOMAIN_DISPATCH和DOMAIN_DISPATCH_UOTA两个业务类型请求规则匹配,筛选域名ID和APK ID。请求入口还会将域名访问作为设备活跃消息发送出去;其活跃结果由device业务处理,与本页配置表不同。
task_secret_key以type区分用途、key定位版本等标识、value保存受保护内容,time_diff用于时间差控制;继承BaseDO审计和删除字段。固件HTTP/TCP入口复用分发与密钥服务,不另造一组固件数据库实体。本文不记录密钥内容。
本页所有关系均为逻辑关联。独立库8张实测表均未采集到外键;当前这些配置表和关联表均只有id主键。完整列及剩余的归档记录表见独立库附录。
源码证据:dal/mysql/uotadetail/UotaDetailMapper.java:18、service/uotadetail/UotaDetailServiceImpl.java:58、:164、:276、dal/redis/uotadetail/UotaRedisDAO.java:45、service/domain/DomainServiceImpl.java:116与:197、service/domain/DomainUotaAppServiceImpl.java:45、dal/dataobject/domain/DomainDO.java:15、dal/dataobject/domain/DomainUotaAppDO.java:14、dal/dataobject/secretkey/TaskSecretKeyDO.java:19、controller/app/domain/DomainDistributeController.java。路径基准见总览。