杰理 SDK 文档中心
首页
首页
  • 项目概述

    • 项目简介与核心能力
    • 运行环境与SDK版本
  • 快速开始

    • 工程导入与依赖配置
    • 权限配置与示例运行
  • 平台架构

    • SDK分层架构与RCSP协议
    • 蓝牙连接库
    • 健康SDK核心库 JL_Watch
    • 健康服务器与云端服务
  • 健康与运动数据

    • 健康数据同步
    • 运动数据同步
    • 本地数据持久化
  • 设备管理功能

    • 表盘管理
    • 闹钟与健康提醒
    • 消息与联系人同步
    • 天气同步
    • 设备查找
    • 支付宝集成
  • 传输与媒体处理

    • 文件传输与文件管理
    • 音乐传输与播放控制
    • 图像转换库
    • 音频编解码与解密
  • OTA 升级

    • 固件空中升级流程
    • 4G模块与差分升级
  • AI 能力

    • AI表盘与云服务
    • AI语音助手
  • 示例应用

    • HealthAide 健康助手应用
    • WatchTestTool 测试工具
  • 开发者指南

    • 自定义命令扩展
    • 调试技巧与问题排查
    • 版本历史与兼容性

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 模块 OTA4G 网络(手表侧下载)手表 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 模块基础信息(厂商 ID vid、版本号 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 展示了两种途径:

  1. 读取缓存的 WatchConfigure,调用 configure.getFunctionOption().isSupportNetworkModule() 判断是否支持网络模块;若缓存为空,可先通过 watchManager.requestDeviceConfigure(...) 向设备请求一次配置。
  2. 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: 升级完成/失败提示

流程要点

  1. 前置检查顺序:设备在线 → 无固件 OTA 进行中 → 支持在线 OTA,任一不满足即中止,避免与蓝牙 OTA 并发冲突。
  2. 先查询后升级:queryNetworkInfo 拉取 4G 模块当前版本与强制升级标志,isMandatoryOTA() 为 true 时 UI 必须引导用户立即升级。
  3. 参数下发,网络下载:startNetworkOTA 只传 OTAParam(filePath),固件下载发生在手表 4G 模块侧,手机蓝牙只承载控制指令与状态回传。
  4. 失败路径:升级中断/异常时设备上报 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_UPDATEStringupgrade固件/4G 升级文件存放根目录(应用私有目录下)
HealthConstant.DIR_NETWORKStringnetwork4G 模块 OTA 文件子目录,完整路径由 HealthUtil.createFilePath(context, DIR_UPDATE, DIR_NETWORK) 生成
ConfigHelper.isEnableLocalOTATest()booleanfalse本地 OTA 测试开关;开启时 isSupportOnLineOTA() 返回 false,强制走本地 zip 升级流程
WatchServerCacheHelper.isSupportOnlineOTA()boolean依服务器配置服务器下发的设备在线 OTA 支持标志
UpgradeViewModel.RECONNECT_DELAYlong3000ms升级中断后回连设备的延迟
OtaState.OTA_STATE_IDLEint—初始 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_ota AAR 版本(仓库使用 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 各子页
Prev
固件空中升级流程