4G模块与差分升级
本文档介绍 Android-JL_Health 工程中"4G模块 OTA"与"差分升级"能力的完整实现:从 App 侧 UpgradeViewModel 对 NetworkOpImpl(jl_rcsp 网络模块升级实现)的封装,到蓝牙链路下发给手表内置 4G 模块的升级参数与状态回调,以及固件差分升级在整个 OTA 体系中的位置。
Purpose and Scope
本页覆盖以下能力(属于目录 7-ota-upgrade 的 4G/差分升级子主题):
- 4G 模块 OTA:手表通过内置 4G 模块联网下载固件,手机 App 通过蓝牙下发升级文件路径参数(
OTAParam)并监听升级状态。核心实现为 jl_rcsp 库的NetworkOpImpl与 App 侧UpgradeViewModel的封装。 - 差分升级:固件 OTA 的一种传输模式,仅传输新旧固件的差异部分,由
jl_bt_ota库(OTAManager)承载,与 4G 模块 OTA 同属 OTA 升级体系。
以下内容不属于本页范围,由同级页面负责:
- 经典蓝牙固件 OTA(含差分升级的底层传输细节):见
OTAManager(com.jieli.healthaide.tool.upgrade.OTAManager)与 jl_bt_ota 库文档。 - 表盘管理、健康 SDK 等:见各自目录页面。
说明:
NetworkOpImpl与OTAParam、NetworkInfo等类型来自闭源 AAR 库jl_rcsp(见 README.md),本页基于仓库内 App 源码与官方 Demo 中已验证的调用方式整理。
Overview
为什么需要 4G 模块 OTA 与差分升级
传统手表固件升级依赖手机蓝牙把整个升级包传输给手表,升级包越大、蓝牙传输越慢、越容易受链路干扰失败。Android-JL_Health 支持的升级体系(见 README.md)包含三种方式:
| 升级方式 | 传输通道 | 特点 |
|---|---|---|
| 固件空中升级 | 经典蓝牙(BLE/SPP) | 手机直接下发固件文件,适用小包与紧急修复 |
| 4G 模块 OTA | 4G 网络(手表侧下载) | 手表 4G 模块自行联网下载固件,手机只下发"任务参数",大包升级更可靠 |
| 差分升级 | 蓝牙(差异数据) | 只传输新旧版本差异部分,显著减小传输量 |
其中 4G 模块 OTA 功能在 SDK 1.13.0(2024/03/15)新增(见 README.md 版本记录),对应 README 中的功能索引(见 README.md):
OTA升级 →
com.jieli.healthaide.tool.upgrade.OTAManager;4G模块OTA →com.jieli.healthaide.ui.device.upgrade.UpgradeViewModel
关键概念
NetworkOpImpl:jl_rcsp 提供的网络(4G)模块升级操作实现类,单例获取(NetworkOpImpl.instance(watchManager)),封装查询网络信息、启动/取消网络 OTA、状态监听。NetworkInfo:4G 模块基础信息(厂商 IDvid、版本号version、是否强制升级isMandatoryOTA)。NetworkOTAState:网络模块 OTA 状态。OTAParam:网络 OTA 参数,目前核心字段是 4G 模块升级文件的本地路径。OnNetworkListener/OnNetworkOTACallback:网络信息与升级过程的回调接口。WatchServerCacheHelper.isSupportOnlineOTA():App 侧判断当前设备是否支持在线(4G)OTA 的缓存配置。
Architecture
flowchart TD
subgraph sg_App["App 应用层 (com.jieli.healthaide)"]
Fragment["UpgradeFragment<br/>(OTA 界面)"]
VM["UpgradeViewModel<br/>(extends WatchViewModel)"]
OTA["OTAManager<br/>固件 OTA / 差分升级"]
Cache["WatchServerCacheHelper<br/>isSupportOnlineOTA()"]
end
subgraph sg_Network["4G 模块 OTA 能力 (jl_rcsp)"]
NetworkOp["NetworkOpImpl<br/>instance(watchManager)"]
Listeners["OnNetworkListener /<br/>OnNetworkOTACallback"]
Param["OTAParam / NetworkInfo /<br/>NetworkOTAState"]
end
subgraph sg_Device["设备侧"]
Watch["手表 (WatchManager /<br/>WatchOpImpl)"]
Modem["4G 模块<br/>联网下载固件"]
end
subgraph sg_SDK["固件升级库 (jl_bt_ota)"]
OTA
end
Fragment -->|"交互"| VM
VM -->|"固件 OTA(含差分)"| OTA
VM -->|"4G 模块 OTA"| NetworkOp
VM --> Cache
NetworkOp --> Listeners
NetworkOp --> Param
NetworkOp -->|"蓝牙指令下发/状态回传"| Watch
Watch --> Modem
Listeners -->|"onNetworkInfo / onNetworkOTAState"| VM
架构说明
UpgradeViewModel是 OTA 能力的门面:它同时持有两个升级通道——OTAManager(固件/差分升级,蓝牙传输)与NetworkOpImpl(4G 模块升级,网络传输),并用LiveData(mOtaStateMLD、mNetworkInfoMLD)向 UI 暴露状态。NetworkOpImpl通过WatchManager(WatchOpImpl子类)走蓝牙指令通道与手表通信,手表再把任务转给内置 4G 模块;4G 模块自行联网下载固件后回报状态。- 是否走 4G 通道由
WatchServerCacheHelper.isSupportOnlineOTA()+ 设备功能配置(getFunctionOption().isSupportNetworkModule())决定。
关键接线代码位于 UpgradeViewModel.java:
public UpgradeViewModel() {
final Context context = HealthApplication.getAppViewModel().getApplication();
mWatchManager.registerOnWatchCallback(mOnWatchCallback);
mOTAManager = new OTAManager(context); // 固件OTA(含差分升级)
mOTAManager.registerBluetoothCallback(mBtEventCallback);
mNetworkOp = NetworkOpImpl.instance(mWatchManager); // 4G模块OTA
mNetworkOp.addOnNetworkListener(mOnNetworkListener);
otaDirPath = HealthUtil.createFilePath(context, HealthConstant.DIR_UPDATE);
otaNetworkDirPath = HealthUtil.createFilePath(context, HealthConstant.DIR_UPDATE, HealthConstant.DIR_NETWORK);
...
mOtaState = new OtaState().setState(OtaState.OTA_STATE_IDLE).setOtaFilePath(otaFilePath);
}
Source: UpgradeViewModel.java
4G 模块 OTA 的实现机制
1. 能力探测:isSupportNetwork / isSupportOnLineOTA
4G 模块 OTA 的第一步是确认设备具备网络模块。官方 Demo NetworkOTADemo.java 展示了两种途径:
- 读取缓存的
WatchConfigure,调用configure.getFunctionOption().isSupportNetworkModule()判断是否支持网络模块;若缓存为空,可先通过watchManager.requestDeviceConfigure(...)向设备请求一次配置。 - App 侧
UpgradeViewModel.isSupportOnLineOTA()则结合了本地测试开关与服务器缓存(见 UpgradeViewModel.java):
public boolean isSupportOnLineOTA() {
if (ConfigHelper.getInstance().isEnableLocalOTATest()) return false;
return WatchServerCacheHelper.getInstance().isSupportOnlineOTA(mWatchManager);
}
Source: UpgradeViewModel.java
设计意图:isEnableLocalOTATest() 返回 true 时强制走本地 OTA 测试(把升级 zip 放入应用私有目录),避免线上开关误判;双开关(本地测试 + 服务器缓存)保证能力探测可被后台动态控制。
2. 查询网络信息:queryNetworkInfo
升级前需要知道 4G 模块的厂商 ID、版本号与是否需要强制升级。官方示例(见 NetworkOTADemo.java):
@Test
public void queryNetworkInfo() {
WatchManager watchManager = WatchManager.getInstance();
//Step1. 初始化网络模块升级操作对象
NetworkOpImpl networkOp = NetworkOpImpl.instance(watchManager);
//Step2. 注册网络事件监听器
final OnNetworkListener listener = new OnNetworkListener() {
@Override
public void onNetworkInfo(BluetoothDevice device, NetworkInfo info) {
//回调网络模块基础信息
// info.getVid(); //4G模块厂商ID
// info.isMandatoryOTA(); //是否需要强制升级, 升级失败后触发
// info.getVersion(); //4G模块版本号
}
@Override
public void onNetworkOTAState(BluetoothDevice device, NetworkOTAState state) {
//回调网络模块升级状态
}
};
networkOp.addOnNetworkListener(listener);
//Step3. 执行查询网络信息接口,并等待结果回调
networkOp.queryNetworkInfo(watchManager.getConnectedDevice(), new OnOperationCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) { /* 回调操作成功结果 */ }
@Override
public void onFailed(BaseError error) { /* error -- 错误描述 */ }
});
}
Source: NetworkOTADemo.java
要点:
queryNetworkInfo是主动查询(带OnOperationCallback<Boolean>),而onNetworkInfo/onNetworkOTAState是被动上报(事件驱动)。两者结合:主动查询立即拉取一次快照,被动回调持续跟踪后续变化。NetworkInfo.isMandatoryOTA()表示是否需要强制升级——4G 模块升级失败后设备会置位该标志,App 必须优先处理强制升级,否则设备可能无法正常工作。
3. 启动 4G 模块 OTA:startNetworkOTA
核心升级入口(见 NetworkOTADemo.java):
@Test
public void startNetWorkOTA(String filePath) {
WatchManager watchManager = WatchManager.getInstance();
//Step1. 初始化网络模块升级操作对象
NetworkOpImpl networkOp = NetworkOpImpl.instance(watchManager);
if (networkOp.isNetworkOTA()) {
//正在OTA
return;
}
//执行开始网络OTA
//filePath --- 4G模块升级文件路径
networkOp.startNetworkOTA(watchManager.getConnectedDevice(), new OTAParam(filePath), new OnNetworkOTACallback() {
@Override public void onStart() { /* 回调OTA开始 */ }
@Override public void onProgress(int progress) { /* 回调OTA进度 */ }
@Override public void onCancel() { /* 回调OTA被取消 */ }
@Override public void onStop() { /* 回调OTA成功 */ }
@Override public void onError(int code, String message) { /* 回调OTA异常 */ }
});
}
Source: NetworkOTADemo.java
要点:
- 启动前用
networkOp.isNetworkOTA()做幂等保护,避免重复启动叠加多个升级任务。 - 传入的是
OTAParam(filePath)而不是固件字节本身——4G 模块拿到路径后自行联网下载升级,手机只负责"点炮",这是 4G OTA 与蓝牙 OTA 的本质区别,也是大包升级可靠性的关键设计。 - 回调覆盖完整生命周期:
onStart→onProgress(0..100)→onStop(成功)或onError(code, message)/onCancel。
4. 升级异常监听:onNetworkModuleException
4G 模块升级异常(如模块损坏、升级中断)时,手表会通过 OnWatchCallback.onNetworkModuleException 主动上报(见 NetworkOTADemo.java):
@Test
public void listenerOTAException(){
WatchManager watchManager = WatchManager.getInstance();
final OnWatchCallback watchCallback = new OnWatchCallback() {
@Override
public void onNetworkModuleException(BluetoothDevice device, NetworkInfo info) {
//回调升级模块升级异常,需要强制升级
//info --- 网络模块基本信息
}
};
watchManager.registerOnWatchCallback(watchCallback);
}
Source: NetworkOTADemo.java
5. UpgradeViewModel 中的 4G OTA 编排
UpgradeViewModel 将上述能力编排进完整的升级流程(见 UpgradeViewModel.java):
- 状态字段:
mOtaFlag(升级标志,区分普通/4G 流程)、isSkip4gOta(跳过 4G 升级)、isRequestNetworkInfo(正在请求网络信息)、reconnectParam(回连参数)、mUpgradeZipPath(解压路径)。 - 目录规划:
otaDirPath(.../upgrade/,固件包)与otaNetworkDirPath(.../upgrade/network/,4G 模块升级文件),由HealthUtil.createFilePath(context, HealthConstant.DIR_UPDATE, HealthConstant.DIR_NETWORK)创建。 - Handler 消息:
MSG_RECONNECT_DEVICE(0xF001)触发reconnectDevice(address, filePath)(升级中断后回连设备继续流程);MSG_UPDATE_RESOURCE(0xF002)触发otaResource(filePath)(资源更新)。 - 入口检查:
otaPrepare()先校验isUsingDevice(getConnectedDevice())(设备必须在线)与isDevOta()(固件 OTA 不能进行中),再根据isSupportOnLineOTA()决定走 4G 还是本地 OTA 流程。 - 释放:
release()移除 UI 消息、恢复标志位、mWatchManager.setFirmwareOTA(false)、注销监听器并mNetworkOp.destroy(),保证页面销毁后无残留回调。
差分升级在 OTA 体系中的位置
差分升级(differential upgrade)是固件 OTA 的传输优化模式:设备端已存在旧版本固件,升级时只传输新旧版本间的差异数据,而不是整个固件包,从而大幅压缩蓝牙传输时间与功耗。
在 Android-JL_Health 中:
- 差分升级由
jl_bt_ota库(libs/JL/jl_bt_ota_V1.11.0_11015-release.aar)承载,App 侧封装在com.jieli.healthaide.tool.upgrade.OTAManager中,与 4G 模块 OTA 并列为 OTA 升级体系的组成部分(见 README.md 与 README.md)。 UpgradeViewModel同时持有OTAManager(固件 OTA,走蓝牙)与NetworkOpImpl(4G OTA,走网络),二者的选择由设备能力与升级包来源决定:本地 zip 固件包走OTAManager(差分/整包由库内部根据设备情况决策),服务器下发的网络升级走NetworkOpImpl。- 差分升级的底层差分算法、校验与设备端合并逻辑在闭源 AAR 内实现,仓库源码中未暴露其内部细节(Implementation details not found in source)。
设计意图:把"传输策略"(蓝牙整包 / 蓝牙差分 / 4G 网络下载)与"业务编排"(
UpgradeViewModel)解耦,业务层只需关心"给哪个通道、哪个文件",通道各自负责可靠性。
Core Flow
sequenceDiagram
participant UI as UpgradeFragment
participant VM as UpgradeViewModel
participant NO as NetworkOpImpl
participant WM as WatchManager
participant W as 手表/4G模块
UI->>VM: otaPrepare()
VM->>VM: isUsingDevice(device) / isDevOta() 检查
VM->>VM: isSupportOnLineOTA()?<br/>(本地测试开关 + 服务器缓存)
VM->>NO: queryNetworkInfo(device, callback)
NO->>WM: 蓝牙指令查询
WM->>W: 读取4G模块信息
W-->>WM: NetworkInfo (vid/version/isMandatoryOTA)
WM-->>NO: onNetworkInfo 回调
NO-->>VM: mNetworkInfoMLD 更新
VM-->>UI: 展示版本与强制升级提示
VM->>NO: startNetworkOTA(device, OTAParam(filePath), callback)
NO->>WM: 下发升级任务参数
WM->>W: 4G模块开始联网下载固件
W-->>WM: 进度/状态上报
WM-->>NO: onProgress / onNetworkOTAState
NO-->>VM: 更新 mOtaStateMLD
W-->>W: 下载并刷写完成
W-->>WM: onStop (成功) / onError(code,msg)
NO-->>VM: 结果回调
VM-->>UI: 升级完成/失败提示
流程要点
- 前置检查顺序:设备在线 → 无固件 OTA 进行中 → 支持在线 OTA,任一不满足即中止,避免与蓝牙 OTA 并发冲突。
- 先查询后升级:
queryNetworkInfo拉取 4G 模块当前版本与强制升级标志,isMandatoryOTA()为 true 时 UI 必须引导用户立即升级。 - 参数下发,网络下载:
startNetworkOTA只传OTAParam(filePath),固件下载发生在手表 4G 模块侧,手机蓝牙只承载控制指令与状态回传。 - 失败路径:升级中断/异常时设备上报
onNetworkModuleException,App 可通过MSG_RECONNECT_DEVICE回连设备并续传;4G 模块异常被置为强制升级状态。
使用示例
示例 1:判断设备是否支持网络模块
@Test
public void isSupportNetwork() {
//Step0. WatchManager是WatchOpImpl的子类,须在1.3配置好sdk
WatchManager watchManager = WatchManager.getInstance();
//Step1. 获取缓存的手表配置信息
WatchConfigure configure = watchManager.getWatchConfigure(watchManager.getConnectedDevice());
if (null == configure) {
//可以尝试向设备请求一次
watchManager.requestDeviceConfigure(new OnWatchOpCallback<WatchConfigure>() {
@Override
public void onSuccess(WatchConfigure result) {
//获取手表配置信息成功
}
@Override
public void onFailed(BaseError error) {
//获取手表配置信息失败
//error -- 错误信息
}
});
return;
}
configure.getFunctionOption().isSupportNetworkModule(); //是否支持网络模块
}
Source: NetworkOTADemo.java
示例 2:完整 4G 模块 OTA 生命周期(查询 → 启动 → 回调)
//Step0. WatchManager是WatchOpImpl的子类,须在1.3配置好sdk
WatchManager watchManager = WatchManager.getInstance();
//Step1. 初始化网络模块升级操作对象
NetworkOpImpl networkOp = NetworkOpImpl.instance(watchManager);
if (networkOp.isNetworkOTA()) {
//正在OTA
return;
}
//执行开始网络OTA
//filePath --- 4G模块升级文件路径
networkOp.startNetworkOTA(watchManager.getConnectedDevice(), new OTAParam(filePath), new OnNetworkOTACallback() {
@Override public void onStart() { /* 回调OTA开始 */ }
@Override public void onProgress(int progress) { /* 回调OTA进度 */ }
@Override public void onCancel() { /* 回调OTA被取消 */ }
@Override public void onStop() { /* 回调OTA成功 */ }
@Override public void onError(int code, String message) { /* 回调OTA异常 */ }
});
Source: NetworkOTADemo.java
示例 3:App 集成(UpgradeViewModel 接线方式)
App 正式代码中通过 UpgradeViewModel 统一接入:构造时创建 NetworkOpImpl 并注册网络监听(见 UpgradeViewModel.java):
public UpgradeViewModel() {
...
mWatchManager.registerOnWatchCallback(mOnWatchCallback);
mOTAManager = new OTAManager(context);
mOTAManager.registerBluetoothCallback(mBtEventCallback);
mNetworkOp = NetworkOpImpl.instance(mWatchManager);
mNetworkOp.addOnNetworkListener(mOnNetworkListener);
otaDirPath = HealthUtil.createFilePath(context, HealthConstant.DIR_UPDATE);
otaNetworkDirPath = HealthUtil.createFilePath(context, HealthConstant.DIR_UPDATE, HealthConstant.DIR_NETWORK);
...
}
public void release() {
uiHandler.removeCallbacksAndMessages(null);
setOtaFlag(UpgradeFragment.OTA_FLAG_NORMAL);
setSkip4gOta(false);
mWatchManager.setFirmwareOTA(false);
mWatchManager.unregisterOnWatchCallback(mOnWatchCallback);
mOTAManager.unregisterBluetoothCallback(mBtEventCallback);
mOTAManager.release();
mNetworkOp.removeOnNetworkListener(mOnNetworkListener);
mNetworkOp.destroy();
}
Source: UpgradeViewModel.java
配置选项
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
OTAParam(filePath) | 构造参数 | 无 | 4G 模块升级文件路径,startNetworkOTA 的必传参数 |
HealthConstant.DIR_UPDATE | String | upgrade | 固件/4G 升级文件存放根目录(应用私有目录下) |
HealthConstant.DIR_NETWORK | String | network | 4G 模块 OTA 文件子目录,完整路径由 HealthUtil.createFilePath(context, DIR_UPDATE, DIR_NETWORK) 生成 |
ConfigHelper.isEnableLocalOTATest() | boolean | false | 本地 OTA 测试开关;开启时 isSupportOnLineOTA() 返回 false,强制走本地 zip 升级流程 |
WatchServerCacheHelper.isSupportOnlineOTA() | boolean | 依服务器配置 | 服务器下发的设备在线 OTA 支持标志 |
UpgradeViewModel.RECONNECT_DELAY | long | 3000ms | 升级中断后回连设备的延迟 |
OtaState.OTA_STATE_IDLE | int | — | 初始 OTA 空闲状态 |
API Reference
以下 API 均来自 com.jieli.jl_rcsp 库(闭源 AAR),签名与语义以官方 Demo NetworkOTADemo.java 中的使用方式为准。
NetworkOpImpl.instance(WatchManager): NetworkOpImpl
获取网络模块升级操作单例。内部绑定 WatchManager(WatchOpImpl 子类)作为蓝牙通道。
networkOp.addOnNetworkListener(OnNetworkListener) / removeOnNetworkListener(OnNetworkListener)
注册/注销网络事件监听器。
OnNetworkListener 回调:
onNetworkInfo(BluetoothDevice device, NetworkInfo info):网络模块基础信息上报。NetworkInfo提供getVid()(4G 模块厂商 ID)、getVersion()(4G 模块版本号)、isMandatoryOTA()(是否需要强制升级,升级失败后触发)。onNetworkOTAState(BluetoothDevice device, NetworkOTAState state):网络模块 OTA 状态上报。
networkOp.queryNetworkInfo(BluetoothDevice device, OnOperationCallback<Boolean> callback)
主动查询网络模块信息,结果通过回调返回。
参数:
device:目标蓝牙设备。callback:onSuccess(Boolean result)/onFailed(BaseError error)。
networkOp.startNetworkOTA(BluetoothDevice device, OTAParam param, OnNetworkOTACallback callback)
启动 4G 模块 OTA。
参数:
device:目标蓝牙设备。param:OTAParam(filePath),封装 4G 模块升级文件路径。callback:OnNetworkOTACallback,包含:onStart():OTA 开始。onProgress(int progress):OTA 进度(0-100)。onCancel():OTA 被取消。onStop():OTA 成功结束。onError(int code, String message):OTA 异常,code为错误码、message为错误描述。
前置条件: 调用前应检查 networkOp.isNetworkOTA(),为 true 时表示正在 OTA,应直接返回,避免并发启动。
networkOp.isNetworkOTA(): boolean
查询当前是否正在执行网络 OTA,用于幂等保护。
networkOp.destroy()
销毁网络操作实例并释放资源(App 侧在 UpgradeViewModel.release() 中调用)。
watchManager.registerOnWatchCallback(OnWatchCallback)
注册手表事件回调;其中 onNetworkModuleException(BluetoothDevice device, NetworkInfo info) 在 4G 模块升级异常时触发,App 应据此引导强制升级。
失败模式、边界情况与并发
并发与状态保护
- 双重升级互斥:
otaPrepare()先检查isDevOta()(固件 OTA 是否进行中),startNetworkOTA前检查isNetworkOTA()。两个通道(蓝牙固件 OTA 与 4G 网络 OTA)不能同时进行,避免手表端升级分区冲突。 - 设备在线校验:
isUsingDevice(getConnectedDevice())不通过则直接中止(JL_Log.w("Device is disconnected.")),防止向已断开设备下发指令。 - 请求去重:
isRequestNetworkInfo标志防止重复发起网络信息查询;isSkip4gOta允许用户/流程显式跳过 4G 升级。 - UI 线程隔离:
UpgradeViewModel通过主线程Handler(MSG_RECONNECT_DEVICE/MSG_UPDATE_RESOURCE)串行化回连与资源更新操作,release()时removeCallbacksAndMessages(null)清空所有挂起消息。
失败处理路径
| 失败场景 | 检测方式 | 处理策略 |
|---|---|---|
| 4G 模块升级失败/异常 | OnWatchCallback.onNetworkModuleException | 设备置位强制升级,App 引导用户立即升级 |
| 强制升级标志 | NetworkInfo.isMandatoryOTA() | 查询网络信息后若为 true,UI 必须优先引导升级 |
| OTA 进行中再次触发 | networkOp.isNetworkOTA() | 直接返回,不叠加任务 |
| 升级中断 | OnNetworkOTACallback.onError(code, message) | 通过 MSG_RECONNECT_DEVICE(延迟 RECONNECT_DELAY=3000ms)回连设备继续流程 |
| 设备不支持网络模块 | WatchConfigure.getFunctionOption().isSupportNetworkModule() 为 false | 不展示 4G OTA 入口,回退本地/蓝牙 OTA |
| 升级文件缺失 | OTAParam(filePath) 指向不存在的文件 | 库层返回错误码,App 提示重新获取升级包 |
边界情况
WatchConfigure缓存为空时(首次配对),Demo 通过requestDeviceConfigure主动请求一次,避免误判设备能力。- 本地 OTA 测试模式(
isEnableLocalOTATest())下isSupportOnLineOTA()恒为 false,保证测试环境不依赖网络配置;测试升级包需放入/Android/data/<包名>/files/upgrade/下的xxx.zip。 - 4G 模块升级文件的存放目录独立(
DIR_UPDATE/DIR_NETWORK),与蓝牙固件包(DIR_UPDATE根目录)隔离,避免文件互相覆盖。
性能与运维注意事项
- 传输带宽优化:4G 模块 OTA 中手机蓝牙只传控制参数,固件由 4G 网络下载,避免大包长时间占用蓝牙链路——这是大固件升级的首选通道;差分升级则通过只传差异数据进一步压缩传输量。
- 目录管理:升级文件统一存放在应用私有目录(
HealthUtil.createFilePath生成),卸载 App 或清理数据后升级包失效,需要重新下载。 - 版本联动:4G OTA 功能自 SDK 1.13.0 引入,依赖配套的
jl_rcsp/jl_bt_otaAAR 版本(仓库使用jl_bt_ota_V1.11.0_11015-release.aar);升级 AAR 时需同步核对WatchServerCacheHelper的在线 OTA 判断逻辑。 - 强制升级保障:4G 模块异常后
isMandatoryOTA()置位,App 需在启动/连接流程中尽早查询NetworkInfo并拦截用户其他操作,确保升级完成前设备可用性。
扩展点
- 监听器模式:
OnNetworkListener、OnNetworkOTACallback、OnWatchCallback均为接口回调,App 可自由注册/移除;UpgradeViewModel提供mNetworkInfoMLD、mOtaStateMLD等LiveData供 UI 订阅。 - 在线 OTA 支持开关:
WatchServerCacheHelper.isSupportOnlineOTA()由服务器缓存驱动,是产品侧控制 4G OTA 灰度/开关的扩展点。 - 本地 OTA 测试:
ConfigHelper.isEnableLocalOTATest()提供离线验证通道,便于产线与测试环境模拟升级流程。 - 升级标志位:
mOtaFlag(如UpgradeFragment.OTA_FLAG_NORMAL)用于区分升级来源,业务方可通过setOtaFlag()扩展新的升级入口类型。
测试
仓库提供单元测试型 Demo NetworkOTADemo(app/src/test 目录),覆盖四个典型场景(见 NetworkOTADemo.java):
| 测试方法 | 验证内容 |
|---|---|
isSupportNetwork() | 通过 WatchConfigure.getFunctionOption().isSupportNetworkModule() 探测设备网络模块能力;缓存缺失时请求配置 |
queryNetworkInfo() | NetworkOpImpl 初始化、监听器注册、主动查询与 onNetworkInfo / onNetworkOTAState 回调 |
startNetWorkOTA(filePath) | 幂等保护(isNetworkOTA())、OTAParam 封装、OnNetworkOTACallback 全生命周期回调 |
listenerOTAException() | OnWatchCallback.onNetworkModuleException 强制升级异常上报 |
此外,WatchTestTool 工程(code/tool/WatchTestTool_V0.9.0_SDK_V1.14.0)提供 NetworkOtaFragment / NetworkOtaViewModel 的 UI 级参考实现,可作为 App 集成 4G OTA 界面的对照实现。
Related Links
- README.md — 功能总览与版本记录:OTA 升级(固件空中升级、4G模块OTA、差分升级)能力索引;SDK 1.13.0 新增 4G 模块 OTA 功能
- UpgradeViewModel.java:4G 模块 OTA 与固件 OTA 的统一编排实现
- NetworkOTADemo.java:网络模块 OTA 官方示例代码
- OTAManager.java:固件 OTA(含差分升级底层)封装,对应"固件空中升级"页面
- 同级页面:固件 OTA 升级(7.1)、表盘管理、健康 SDK 等,见目录 7-ota-upgrade 各子页