核心概念:域名分发 | 主UOTA | 备UOTA | 域名池
域名分发管理模块是机顶盒与服务器通信的"生命线",负责向设备下发可用域名组和最新版 UOTA 程序。
1. 核心概念:双APK架构
核心概念:域名分发 | 主UOTA | 备UOTA | 双APK架构
作为安卓机顶盒生产商,我们在每台设备上部署了双APK架构,确保设备与服务器之间的通信永不中断。
1.1 主UOTA(核心通信APK)
主UOTA是盒子和服务器进行通信的核心APK,承担着设备与云端之间所有数据交换的职责。
核心功能:
- 设备升级:固件OTA升级、系统更新
- APK推送:远程安装/卸载应用
- Launcher广告配置:桌面广告位管理
- 黑名单管控:应用黑白名单策略
- 设备运行状况监测:心跳上报、日志收集
主UOTA是设备的"心脏",一旦停止工作,设备将与服务器彻底失联,无法接收任何指令和配置更新。
1.2 备UOTA(域名分发APK)
备UOTA也称为"域名分发APK",功能相对单一,主要负责:
- 为主UOTA和备UOTA下发各自的域名池
- 推送下发最新版本的主UOTA
独立运行机制:
- 备UOTA的运行与主UOTA的状态完全无关,即使主UOTA未安装或已崩溃,备UOTA仍能正常工作
- 备UOTA会定期向服务器请求,获取最新的域名池并存储在本地备用
- 备UOTA会定期获取最新主UOTA信息,判断是否需要推送升级或安装
主UOTA升级/安装判断逻辑:
- 备UOTA定期请求服务器获取主UOTA版本信息
- 如果服务器端配置了主UOTA包,则获取版本号
- 判断当前盒子中的主UOTA版本是否小于服务器配置的版本
- 若版本较低或主UOTA未安装,则触发下载安装流程
备UOTA稳定性极高的原因:
- 功能单一:代码量少,不易出现程序崩溃
- 兼容性高:不依赖复杂的外部库,适配性强
- 政策风险低:功能简单,不易触发各国监管政策
- 攻击面小:不涉及敏感业务逻辑,被恶意利用的可能性低
- 独立运行:不依赖主UOTA,即使主UOTA异常也能正常工作
1.3 域名池机制
域名池是存储在机顶盒本地的备用域名集合,分为主UOTA域名池和备UOTA域名池两个独立的域名池。
架构说明:
- 两个独立域名池:主UOTA和备UOTA各自拥有独立的域名池
- 统一维护:由备UOTA负责维护这两个域名池
- 独立使用:各UOTA 只读取自己对应的域名池
工作原理:
- 备UOTA定期向服务器请求,获取并更新两个域名池
- 当主UOTA发现当前域名无法通信时,从主UOTA域名池读取可用域名
- 当备UOTA发现当前域名无法通信时,从备UOTA域名池读取可用域名
- 自动轮询尝试连接,直到找到可用的域名
- 防止因单一域名失效导致设备彻底断联
- 备UOTA:负责两个域名池的维护和管理(定期更新、存储)
- 主UOTA:负责主UOTA域名池的读取和使用(故障时切换)
- 备UOTA:负责备UOTA域名池的读取和使用(故障时切换)
2. 模块关系图
核心概念:域名分发 | 主UOTA | 备UOTA | 模块关系
Mermaid Diagram Code:
graph TB
subgraph 机顶盒设备
subgraph 主UOTA["主UOTA (核心通信)"]
A1[设备升级]
A2[APK推送]
A3[Launcher广告配置]
A4[黑名单管控]
A5[运行状况监测]
end
subgraph 备UOTA["备UOTA (域名分发)"]
B1[域名池维护与管理]
B2[主UOTA恢复]
B3[定期获取域名池]
B4[定期检测主UOTA版本]
end
subgraph 本地存储
C1["主UOTA域名池<br/>(主UOTA专用)"]
C2["备UOTA域名池<br/>(备UOTA专用)"]
end
备UOTA -->|维护/更新| C1
备UOTA -->|维护/更新| C2
主UOTA -.->|读取| C1
备UOTA -.->|读取| C2
备UOTA -.->|恢复/升级/安装| 主UOTA
end
subgraph 云端服务器
subgraph 域名分发服务
D1[域名信息管理]
D2[UOTA-APP管理]
D3[秘钥管理]
end
D4[规则引擎]
D5[文件存储]
end
主UOTA <-->|数据交换| 域名分发服务
备UOTA <-->|域名池更新/APP获取| 域名分发服务
域名分发服务 --> D4
域名分发服务 --> D5
- 两个独立域名池:主UOTA域名池和备UOTA域名池各自独立
- 备UOTA统一维护:两个域名池都由备UOTA负责更新和管理
- 各UOTA独立使用:主UOTA只读主UOTA域名池,备UOTA只读备UOTA域名池
- 备UOTA独立运行:与主UOTA状态无关,定期执行域名池更新和主UOTA版本检测
- 实线箭头:表示维护/更新操作(备UOTA负责)
- 虚线箭头:表示读取操作(各UOTA只读自己的域名池)
3. 数据交换流程图
核心概念:域名分发 | 主UOTA | 备UOTA | 数据交换流程
3.1 正常通信流程
Mermaid Diagram Code:
sequenceDiagram
participant Device as 机顶盒设备
participant MainUOTA as 主UOTA
participant BackupUOTA as 备UOTA
participant Server as 云端服务器
Note over Device, Server: 设备开机/周期性检查
Device->>MainUOTA: 启动主UOTA
Device->>BackupUOTA: 启动备UOTA
Note over BackupUOTA, Server: 备UOTA独立运行(与主UOTA状态无关)
Note over BackupUOTA, Server: 任务1:定期获取域名池
BackupUOTA->>Server: 请求域名分发接口
Server->>Server: 规则引擎匹配
Server-->>BackupUOTA: 返回两个域名池
BackupUOTA->>BackupUOTA: 更新本地域名池(主UOTA域名池+备UOTA域名池)
Note over BackupUOTA, Server: 任务2:定期获取主UOTA信息
BackupUOTA->>Server: 请求主UOTA版本信息
Server-->>BackupUOTA: 返回最新主UOTA配置(如有)
alt 服务器配置了主UOTA且版本更新
BackupUOTA->>BackupUOTA: 判断版本:当前版本 < 服务器版本?
BackupUOTA->>Server: 下载最新主UOTA APK
BackupUOTA->>Device: 安装/升级主UOTA
else 主UOTA未安装
BackupUOTA->>Server: 下载主UOTA APK
BackupUOTA->>Device: 安装主UOTA
end
Note over MainUOTA, Server: 主UOTA正常业务通信
MainUOTA->>Server: 心跳上报/任务请求
Server-->>MainUOTA: 返回配置/指令
3.2 域名失效切换流程
Mermaid Diagram Code:
sequenceDiagram
participant MainUOTA as 主UOTA
participant BackupUOTA as 备UOTA
participant MainPool as 主UOTA域名池<br/>(备UOTA维护)
participant BackupPool as 备UOTA域名池<br/>(备UOTA维护)
participant Server as 云端服务器
Note over MainUOTA, Server: 主UOTA域名失效切换
MainUOTA->>Server: 尝试连接域名A
Server--xMainUOTA: 连接失败
MainUOTA->>MainPool: 从主UOTA域名池读取下一个域名
MainPool-->>MainUOTA: 返回域名B
MainUOTA->>Server: 尝试连接域名B
Server--xMainUOTA: 连接失败
MainUOTA->>MainPool: 从主UOTA域名池读取下一个域名
MainPool-->>MainUOTA: 返回域名C
MainUOTA->>Server: 尝试连接域名C
Server-->>MainUOTA: 连接成功
Note over BackupUOTA, Server: 备UOTA域名失效切换(同理)
BackupUOTA->>Server: 尝试连接域名X
Server--xBackupUOTA: 连接失败
BackupUOTA->>BackupPool: 从备UOTA域名池读取下一个域名
BackupPool-->>BackupUOTA: 返回域名Y
BackupUOTA->>Server: 尝试连接域名Y
Server-->>BackupUOTA: 连接成功
Note over MainUOTA, BackupUOTA: 各UOTA独立读取自己的域名池
3.3 主UOTA故障恢复流程
Mermaid Diagram Code:
sequenceDiagram
participant Device as 机顶盒设备
participant MainUOTA as 主UOTA
participant BackupUOTA as 备UOTA
participant Server as 云端服务器
Note over Device, Server: 主UOTA异常场景
Device->>MainUOTA: 尝试启动主UOTA
MainUOTA--xDevice: 启动失败/无响应
Device->>BackupUOTA: 启动备UOTA
BackupUOTA->>Server: 请求域名分发接口
Server->>Server: 检测到主UOTA异常
Server-->>BackupUOTA: 返回最新主UOTA下载地址
BackupUOTA->>Server: 下载主UOTA APK
Server-->>BackupUOTA: 返回APK文件
BackupUOTA->>Device: 安装/修复主UOTA
Device->>MainUOTA: 重新启动主UOTA
MainUOTA-->>Device: 启动成功
Note over Device, Server: 恢复正常通信
4. 利害关系与风险分析
核心概念:域名分发 | 主UOTA | 备UOTA | 风险分析
4.1 主UOTA的脆弱性
主UOTA可能因以下情况无法正常运行:
| 风险类型 | 具体场景 | 影响程度 |
|---|
| 出厂问题 | 出厂时忘记预装主UOTA | 严重 |
| 兼容性问题 | 出厂预装版本与硬件不兼容 | 严重 |
| 升级失败 | 在线升级过程中断导致崩溃 | 中等 |
| 恶意卸载 | 用户或恶意软件主动卸载 | 严重 |
| 政策封禁 | 某些国家/地区封禁当前版本 | 严重 |
| 系统异常 | Android系统异常导致无法启动 | 中等 |
| 存储损坏 | 设备存储损坏导致APK丢失 | 严重 |
4.2 备UOTA的稳定性保障
备UOTA能够作为"心脏起搏器"的原因:
- 功能 单一:仅负责域名分发和主UOTA恢复,代码量小,Bug少
- 兼容性高:不依赖复杂的外部库,适配各种硬件平台
- 政策风险低:功能简单,不易触发各国政策监管
- 攻击面小:不涉及敏感业务逻辑,被恶意利用的可能性低
4.3 出厂预装的不确定性
主UOTA和备UOTA出厂不一定预装!
早期生产的设备可能没有预装这两个APK,是通过其他途径逐步推送安装的。这意味着:
- 早期设备的稳定性更差
- 可能存在部分设备完全无法恢复的情况
- 需要通过其他渠道(如固件升级)来安装这些APK
4.4 最坏情况
如果主UOTA和备UOTA都出现故障:
- 设备将彻底断联
- 无法远程恢复,只能通过线下刷机或返厂维修
- 造成运维成本大幅增加
5. 兜底机制详解
核心概念:域名分发 | 主UOTA | 备UOTA | 兜底机制
系统设计了三层兜底机制,最大程度保障设备在线率。
5.1 第一层:域名池兜底
触发条件:当前域名无法访问
处理方式:
- 主UOTA:从主UOTA域名池读取下一个可用域名
- 备UOTA:从备UOTA域名池读取下一个可用域名
维护方:备UOTA统一维护两个域名池
恢复时间:秒级
成功率:高(只要有一个域名可用即可恢复)
5.2 第二层:备UOTA兜底
触发条件:主UOTA无法正常运行
处理方式:备UOTA下载并安装最新主UOTA
恢复时间:分钟级(取决于网络速度和APK大小)
成功率:中(依赖备UOTA正常运行)
5.3 第三层:无兜底情况
触发条件:主UOTA和备UOTA都故障
处理方式:无远程恢复手段
后果:设备彻底断联
解决方案:线下刷机/返厂维修
5.4 兜底机制流程图
Mermaid Diagram Code:
flowchart TB
A[设备尝试通信] --> B{当前域名可用?}
B -->|是| C[正常通信]
B -->|否| D{是主UOTA还是备UOTA?}
D -->|主UOTA| E[从主UOTA域名池读取下一个域名]
D -->|备UOTA| F[从备UOTA域名池读取下一个域名]
E --> B
F --> B
C --> G{主UOTA正常?}
G -->|是| C
G -->|否| H{备UOTA可用?}
H -->|是| I[备UOTA下载最新主UOTA]
I --> J[安装/修复主UOTA]
J --> A
H -->|否| K[设备彻底断联]
K --> L[需要线下刷机/返厂维修]
Note1[两个域名池均由备UOTA维护]
Note2[各UOTA只读自己的域名池]
6. 域名信息管理