前言

上一篇博客中,我们已经讲到,如何以静默的方式来安装apk

但是,这个特性只能用来安装其它APP,是不可能用来更新自己的

APP不可能在自身启动时,同时替换自己

所以这篇博客,我们再次基础上,再变通一下,得到一个设备静默升级的方案

智能硬件一般需求

  • 开机自启动
  • 后台长期运行
  • 静默升级
  • 无人值守

APK升级方案

  • 准备两个APP,一个用于管理,一个用于业务,因为APP不能在运行的同时静默更新自己
  • 将管理APP设置为桌面应用,这样就能开机自动启动,最好是在烧录镜像时,就移除系统自带的桌面Launcher,这样就不用自己去选择默认的桌面了
  • 两个APP都要使用系统用户id和系统签名,以保证可以使用特殊权限
  • 两个APP都要在Manifest中对application设置persist=true,以保证可以后台永久运行
  • 业务APP注册静态广播,以接收来自升级APP的通知
  • 升级前,管理APP先向业务APP发送一个广播,通知业务APP退出
  • 延时2秒后,管理APP以静默方式安装新版业务APP,完成升级
  • 延时2秒后,管理APP发送一个外部广播,唤起业务APP,完成重启

设备运维方案

  • 设备和管理工具,通过MQTT或WebSocket进行通信,如果用WebSocket,需要通过一个共用后台进行数据中转
  • 业务APP定时将设备状态参数,以广播的方式转发给管理APP,管理APP再将数据转发给管理工具
  • 设备管理工具,每次启动时,随机生成一个会话标识SessionID,以广播的方式,定时发送一个会话开始消息给所有设备,通知设备该管理工具在线
  • 设备收到新会话时,将SessionID保存起来,并定时向该SessionID发送设备状态信息
  • 当设备超过30秒没有收到某个SessionID的消息时,便将该SessionID从会话队列中移除
  • 设备升级时,先通过管理工具通知设备安装包地址,然后设备切换到升级状态,开始下载安装APK
  • 设备状态包括离线、空闲、下载中、安装中等状态,只有空闲状态下,管理工具才能控制该设备
  • 下载失败、开始下载、尝试重新下载、开始安装、升级失败、应用重启等,都向管理工具推送事件消息
  • 如果业务APP包含设备的序列号、名称、位置等信息,则业务APP将这些信息推给管理APP,管理APP再转发给管理工具。如果业务APP不包含这些信息,则管理APP可提供设置功能,在出厂时设置这些信息。或者通过管理工具去设置设备信息,管理APP保存这些信息

更多推荐