Digi提供的最新版本的Android系统使您能够从Android系统本身更新ConnectCore 8X设备的固件。看到使用OTA包更新Android学习如何通过Android设置执行固件更新。如果您愿意,您可以使用Digi提供的固件更新服务将固件更新功能添加到Android应用程序中。

使用固件更新API,您可以从Android应用程序执行系统的固件更新,安装新的应用程序和擦除用户和数据分区。在Digi APIx javadoc文档中可以找到这个API中可用方法的完整列表。

除非特别说明,所有固件更新API方法都需要com.digi.android.permission.FIRMWARE_UPDATE许可。

如果您的应用程序没有com.digi.android.permission.FIRMWARE_UPDATE权限,它将无法访问任何固件更新服务功能。

首先,一个新的FirmwareUpdateManager对象必须通过传递Android应用程序上下文来实例化。

实例化FirmwareUpdateManager
进口android.app.Activity;进口android.os.Bundle;进口com.digi.android.firmwareupdate.FirmwareUpdateManager;公共FirmwareUpdateSampleActivity扩展活动{FirmwareUpdateManager;[…]@Override公共无效onCreate(Bundle savedInstanceState) {超级onCreate(savedInstanceState);//实例化FirmwareUpdateManager manager对象。firmwareUpdateManager =FirmwareUpdateManager ();[…]} [...] }

安装应用程序

固件更新服务提供的功能之一是安装Android应用程序。使用installApplication(字符串、布尔值)方法FirmwareUpdateManager安装APK的完整路径。此方法还提供了在应用程序安装后重新启动模块的可能性。

方法 描述

installApplication(字符串、布尔值)

安装由给定APK完整路径表示的应用程序

installApplication(字符串、布尔值)方法可能会失败,原因如下:

  • 提供的应用程序路径为空,抛出NullPointerException

  • 安装应用程序出错,抛出IOException

安装应用程序
进口com.digi.android.firmwareupdate.FirmwareUpdateManager;[…]FirmwareUpdateManagerfirmwareUpdateManager =[…];[…]//安装位于'/storage/ emululated /0/Download/MyApplication.apk'的应用程序//应用程序安装完成后,请不要重启设备。firmwareUpdateManager。installApplication“/存储/模拟/ 0 /下载/ MyApplication.apk”);
此方法不会要求安装应用程序的权限,因为安装过程是由Android固件更新服务执行的。

安装更新包

这个固件更新服务的主要目的是安装一个更新包来更新Android系统。

固件更新过程在触发时遵循以下步骤:

  1. 检查更新包位置。固件更新总是从设备的缓存分区执行。如果更新包不在那里,它将被复制。

  2. 更新包的验证。如果启用了验证,则根据提供的证书验证包的加密签名。

  3. 更新的过程。

  1. 设备重启进入恢复模式。的内核复苏分区引导,而不是内核引导分区。

  2. 恢复二进制由初始化。中查找命令行参数/ /恢复/缓存命令指向更新包。

  3. 从包中提取数据并用于更新引导供应商,系统分区。其中一份新文件系统分区包含新分区的内容复苏分区。

  4. 设备正常重启。

  5. 最新更新的引导分区被加载,它挂载并启动新更新的系统分区。

  6. 作为正常启动的一部分,系统将检查复苏根据所需的内容(以前存储为文件)进行分区/系统).它们是不同的,所以复苏用所需的内容重新编程分区。在随后的靴子中复苏分区已经包含了新的内容,所以不需要重新编程。

  7. 完成系统升级。更新日志可以在/ /恢复/ last_log。#缓存

要为您的设备生成更新包,请按照中的步骤操作创建一个签名的OTA包

要使用更新包更新Android系统,请使用installUpdatePackage(String, listener, boolean, String)方法,参数如下:

  • updatePackagePath:要安装的更新包的完整路径。

  • 侦听器的对象IFirmwareUpdateListener接收固件更新进度信息的接口,不能为空。看到监听固件更新事件了解更多信息。

  • 验证:布尔型参数,表示是否对升级包签名进行校验。

    使用中给定的证书zip文件验证包签名deviceCertsZipFile参数。如果不提供,则使用默认的系统证书文件。
  • deviceCertsZipFile:要接受其公钥的证书的zip文件的完整路径。如果包由与此文件中的任何公钥对应的私钥签名,则验证成功。可能是要使用系统默认文件,/系统/ etc /安全/ otacerts.zip。当verify为true时,此参数才有效。

方法 描述

installUpdatePackage(String, listener, boolean, String)

安装给定的更新包

installUpdatePackage(String, listener, boolean, String)如果提供的更新包路径或侦听器是扔一个NullPointerException

安装更新包
进口com.digi.android.firmwareupdate.FirmwareUpdateManager;[…]FirmwareUpdateManagerfirmwareUpdateManager =[…];MyFirmwareUpdateListener =[…];[…]//安装'/storage/ emululated /0/Download/ota_update_package.zip'更新包//监听固件事件,不校验包。firmwareUpdateManager。installUpdatePackage“/存储/模拟/ 0 /下载/ ota_update_package.zip”myFirmwareUpdateListener,);
固件升级过程中重启模块。方法获取过程中产生的事件IFirmwareUpdateListener在方法中提供。

监听固件更新事件

固件更新过程生成一些可以在应用程序中获取和处理的事件。要使应用程序意识到这些事件,可以通过实现来创建自己的固件更新侦听器IFirmwareUpdateListener接口。

固件更新监听器
进口com.digi.android.firmwareupdate.IFirmwareUpdateListener;MyFirmwareUpdateListener实现了IFirmwareUpdateListener {@Override无效updatePackageCopyStarted() {}@Override无效updatePackageCopyFinished() {}@Override无效verifyStarted() {}@Override无效verifyProgressint进度){}@Override无效verifyFinished() {}@Override无效updateStarted() {}@verride无效onError(字符串错误){}}

IFirmwareUpdateListener接口定义了以下方法来处理固件更新过程中产生的事件:

方法 描述

updatePackageCopyStarted ()

通知更新包复制操作已开始

updatePackageCopyFinished ()

通知更新包复制操作完成

verifyStarted ()

通知更新包验证已启动

verifyProgress (int)

通知更新包的验证进度,并提供进度百分比

verifyFinished ()

通知更新包验证完成

updateStarted ()

通知更新进程已经启动,设备即将重新启动

onError(字符串)

通知任何固件更新错误并提供错误消息

中提供的参数installUpdatePackage方法和更新包的位置,则不会生成一些事件:

  1. 检查更新包位置。

    • 如果软件包不在cache分区中,则将软件包拷贝到cache分区中。

      1. updatePackageCopyStarted ()在复制进程启动时触发通知。

      2. updatePackageCopyFinished ()当复制过程结束时触发通知。

    • 如果包位于缓存分区中,则不会触发复制通知。

  2. 更新包的验证。

    • 中的verify参数设置为trueinstallUpdatePackage(String, listener, boolean, String),验证升级包签名。

      1. verifyStarted ()当验证启动时,将触发通知。

      2. verifyProgress (int)通知验证进度。

      3. verifyFinished ()验证结束时触发通知。

    • 中的verify参数设置为falseinstallUpdatePackage(String, listener, boolean, String)时,不会触发验证通知。

  3. 更新系统。

    • updateStarted ()更新过程启动时触发通知。

onError(字符串)如果在固件更新过程的任何阶段发生任何错误,则会触发通知。

类的必选参数installUpdatePackage(String, listener, boolean, String)方法。看到安装更新包了解更多信息。

删除分区

你可以在固件更新服务中找到的最新功能是擦除一些Android系统分区的功能。这些是数据缓存分区,您拥有完全访问权限,可以读写文件。使用以下任何一种方法启动擦除进程:

方法 描述

wipeCache ()

擦除缓存(/缓存)分区

wipeCache(字符串)

擦除缓存(/缓存)分区提供一个'reason'消息

wipeUserData ()

擦除用户数据(/数据)及缓存(/缓存)分区

wipeUserData(字符串)

擦除用户数据(/数据)及缓存(/缓存)分区提供一个'reason'消息

wipeUserData(字符串、布尔值)

擦除用户数据(/数据)及缓存(/缓存)分区提供一个'reason'消息。它还允许关机而不是重置

如果准备擦除进程时出现错误,则这些方法可能会失败IOException

擦cache分区
进口com.digi.android.firmwareupdate.FirmwareUpdateManager;[…]FirmwareUpdateManagerfirmwareUpdateManager =[…];[…]//擦除cache分区并给出原因firmwareUpdateManager。wipeCache“我为你的缓存感到抱歉”);
擦除缓存和数据分区
进口com.digi.android.firmwareupdate.FirmwareUpdateManager;[…]FirmwareUpdateManagerfirmwareUpdateManager =[…];[…]//清除用户数据和缓存分区,并给出原因。firmwareUpdateManager。wipeData"对于你的数据和缓存,我非常抱歉");

重新启动设备以执行擦除操作。的wipeUserData(字符串、布尔值)方法将关闭设备,而不是重新启动设备关闭参数是真正的