1. 系统升级与应用升级的通用接口
在使用ota升级的SDK之前,通过如下接口进行一些初始值的设置。
这些是(系统升级和应用升级)通用的接口,用户接入时,只需做一次即可。
建议在Application的OnCreate里面进行以下接口的调用。
包名:com.aliyun.aicc.fota.sdk
类名:FotaContext
1. 初始化API
FotaContext.getInstance()
2. 设置系统版本号
接口名称:
public void setFirmwareVersion(Context context, String firmwareVersion)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 上下文 |
firmwareVersion | String | 必填 | 字符串,系统版本号遵循如下规则:1. 大版本可以支持4位数字,全部是个位数,比如1.0.0.1,2. 后面必须紧跟一个字母:E、R、F,或者其它 3. 再后面是年、月、日、时、分 4. 示例:1.0.0.1-R-20170606.1125 |
返回值: 无
说明: 该接口必须被调用,用于设置系统版本号,否则无法进行升级。
3. 设置机型
接口名称:
public void setDeviceModel(Context context, String deviceModel)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 上下文 |
deviceModel | String | 必填 | 字符串,例如”MB202” |
返回值: 无
说明: 可以不调用该接口。 如果不调用该接口,机型信息将从系统属性:ro.product.model 中读取。
4. 设置设备类型
接口名称:
public void setDeviceType(Context context, String deviceType)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 上下文 |
deviceType | String | 必填 | 字符串,例如”phone”,”tv” |
返回值: 无
说明:
可以不调用该接口。
如果不调用该接口,设备类型将默认为”phone”。
5. 设置安全图片auth code
接口名称:
public void setSafeguardAuth(Context context, String authCode)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 上下文 |
authCode | String | 必填 | 字符串,例如”0b28”,用于指定安全图片文件的后缀 |
返回值: 无
说明:
可以不调用该接口。
如果不调用该接口,将使用默认的安全图片名称:yw_1222.zip
6. 设置设备序列号
接口名称:
public void setSerialNumber(Context context, String serialno)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 上下文 |
serialno | String | 必填 | 字符串,设备唯一id,例如:”1234567890BB” |
返回值: 无
说明: 用于生成device token
7. 设置硬件唯一id
接口名称:
public void setHardwareId(Context context, String id)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 上下文 |
id | String | 必填 | 字符串,硬件唯一id,可以是device model + Wi-Fi mac地址 + sn串号,sn 串号可以没有。 |
返回值: 无
说明: 用于生成device token
8. 设置appkey和appsecret
接口名称:
public void setAppKeyAndSecrets(Context context, String appkey, String secret)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 上下文 |
appkey | String | 必填 | 字符串,例如”adbcdef” |
secret | String | 必填 | 字符串,例如”adbcdefgh” |
返回值: 无
说明: 建议使用安全图片保存appkey与secret,不建议在代码中显示指定appkey和secret。
9. 设置客户端自定义查询条件
接口名称:
public void setCustomizedFilterFields(Context context, String jsonString)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 上下文 |
jsonString | String | 必填 | 符合JSON数组格式的字符串 |
返回值: 无
说明:
参数 jsonString的详细说明
-该参数的格式,是符合JSON数组格式的字符串,格式如下:
[{"name": "field1","value": "value1"},{"name": "field2","value": "value2"},{"name": "field3","value": "value3"}]
通过该字符串,能转换为JSON数组对象如下:
[ { "name": "field1", "value": "value1" }, { "name": "field2", "value": "value2" }, { "name": "field3", "value": "value3" } ]
10. 设置服务端的环境
接口名称:
public void setEnvironment(String env)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
env | String | 必填 | 服务端的环境,取值如下:FotaContext.CLOUD_ENV_TEST(测试环境)FotaContext.CLOUD_ENV_PRE(预发环境)FotaContext.CLOUD_ENV_ONLINE(线上环境) |
返回值: 无
说明:
设置fota运行时,所使用的云端环境
不做任何设置,或者设置的入参有错误时,默认使用测试环境。
11. 代码示例
// 在应用的application的onCreate()方法中,做如下接口的调用
import com.aliyun.aicc.fota.sdk.FotaContext;
FotaContext.getInstance().initContext(this);
FotaContext.getInstance().setFirmwareVersion(getApplicationContext(), "1.0.0.1-R-20170606.1125");
FotaContext.getInstance().setDeviceModel(getApplicationContext(), "MB202");
FotaContext.getInstance().setDeviceType(getApplicationContext(), "tablet");
FotaContext.getInstance().setSafeguardAuth(getApplicationContext(), "0b28");
FotaContext.getInstance()).setSerialNumber(getApplicationContext(), "1234567890BB")
FotaContext.getInstance()).setHardwareId(getApplicationContext(), "MB202B0:35:9F:BE:29:04")
FotaContext.getInstance().setAppKeyAndSecrets(getApplicationContext(), "24657550", "a3e5394705f9a6fbe7b0cc3bc40aede2");
FotaContext.getInstance().setCustomizedFilterFields(this, jsonString);
// 设置所使用的服务端的环境
FotaContext.getInstance().setEnvironment(FotaContext.CLOUD_ENV_TEST);
2. 应用升级接口
2.1 应用升级的设置
包名:com.aliyun.aicc.fota.sdk
类名:FotaAppConfig
2.1.1 构造函数
public static FotaAppConfig getInstance
2.1.2设置自动查询的间隔和包列表
接口名称:
public void setAutoCheckPackagesList(Context context,
int autoCheckIntervalInMs, String[] autoCheckPackagesList)
参数说明
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 上下文 |
autoCheckIntervalInMs | int | 必填 | 自动查询的间隔 |
autoCheckPackagesList | String[] | 必填 | 需要自动查询的包列表 |
2.2 升级包的查询、下载、安装、通知
包名:com.aliyun.aicc.fota.sdk
类名:FotaAppUpdateClient
2.2.1 构造函数
public static FotaAppUpdateClient getInstance()
2.2.2 触发自动轮询
public void startAutoCheck(Context context, final int delayedInMs)
参数说明
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 调用接口的上下文 |
delayedInMs | int | 必填 | 自动查询的间隔 |
2.2.3 添加AppUpdateListener
public void addAppUpdateListener (Context context, final IAppUpdateListener listener)
参数说明
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 调用接口的上下文 |
listener | IAppUpdateListener | 必填 | 用于监听AppUpdate的Listener |
上述回调函数
interface IAppUpdateListener { void onAppCheckUpdateSuccess(String sessionID, in SystemAppXmlInfo info); void onAppCheckUpdateError(String packageName, int versionCode, int status, int minorStatus, String errMsg); void onAppDownloadSuccess(String sessionID, in SystemAppXmlInfo info); void onAppDownloadError(String sessionID, String packageName, int status, int minorStatus, String errMsg); void onAppInstallSuccess(String sessionID, in SystemAppXmlInfo info); void onAppInstallError(String sessionID, String packageName, int status, int minorStatus, String errMsg); void onAppDownloadProgress(String sessionID, String packageName, int status, int progress, String msg); }
2.2.4 删除AppUpdateListener
public void removeAppUpdateListener (Context context, final IAppUpdateListener listener)
参数说明
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 调用接口的上下文 |
listener | IAppUpdateListener | 必填 | 用于监听AppUpdate的Listener |
2.2.5 触发查询更新包
public void checkUpdate(Context context, final String packageName)
参数说明
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 调用接口的上下文 |
packageName | String | 必填 | 查询的应用包名 |
2.2.6 触发下载更新包
public void download(Context context, final String packageName)
参数说明
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 调用接口的上下文 |
packageName | String | 必填 | 查询的应用包名 |
2.2.7 触发校验并安装更新包
public void verifyAndInstall(Context context, final String packageName)
参数说明
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 调用接口的上下文 |
packageName | String | 必填 | 查询的应用包名 |
2.2.8 查询并下载更新包
接口名称:
public void checkUpdateAndDownload(final Context context, final String packageName, final int currentVersionCode, final String currentVersionName, final Map paramsMap, final IAppUpdateCallback callback)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 调用接口的上下文 |
packageName | String | 必填 | 待查询的应用包名 |
currentVersionCode | int | 必填 | 当前应用的version code |
currentVersionName | String | 必填 | 当前应用的version name |
paramsMap | Map | 必填 | 调用者自定义查询参数,是k-v键值对 |
callback | IAppUpdateCallback | 必填 | 回调函数 |
返回值: 无
说明: 该方法在查询到有更新的安装包之后,自动开始下载。
上述回调函数:请实现如下接口:
interface IAppUpdateCallback {
void onAppGotResultSuccess(String sessionID, String packageName,
int versionCode, String versionName,
String appZipType, String path, String extrasJson);
void onAppGotResultError(String packageName, int status,
int minorStatus, String errMsg);
void onProgress(String sessionID, String packageName,
int status, int progress, String msg);
}
onAppGotResultSuccess参数说明
出参 | 类型 | 是否为空 | 说明 |
sessionID | String | 不为空 | 调用接口的上下文 |
packageName | String | 不为空 | 待查询的应用包名 |
versionCode | int | 不为空 | 当前应用的version code |
versionName | String | 不为空 | 当前应用的version name |
appZipType | String | 不为空 | 1自动安装包类型,7自定义安装包类型 |
path | String | 不为空 | 下载文件路径,应用的data目录下 |
extrasJson | String | 可为空 | 应用包的自定义属性信息 |
上面的回调函数IAppUpdateCallback中,onAppGotResultError 方法中,参数 status 和minorStatus 的定义:
宏定义 | 值 | 含义 |
STATUS_CHECKING_FAILED | 103 | status 查询更新失败了 |
STATUS_CHECKING_FAILED_NETWORK_NONETWORK | 200 | 查询更新失败了,没有网络 |
STATUS_CHECKING_FAILED_HTTP_TIMEOUT | 201 | 查询更新失败了,查询time out |
STATUS_CHECKING_FAILED_CANNOT_GET_XML | 202 | 查询更新失败了,没有获取到xml |
STATUS_CHECKING_FAILED_OTHERS | 203 | 查询更新失败了,其他问题,详情看errorMsg |
STATUS_CHECKING_FAILED_GET_NULLXML | 204 | 查询更新失败了,您的版本已是最新了 |
STATUS_CHECKING_FAILED_PARAM_ERROR | 205 | 查询更新失败了,参数有错 |
STATUS_DOWNLOADERROR | 106 | 下载更新失败了 |
STATUS_DOWNLOADERROR_STORAGE_LOWLEVEL | 214 | 下载更新失败了,空间不够 |
STATUS_DOWNLOADERROR_POWSER_LOW | 215 | 下载更新失败了,电量不够 |
STATUS_DOWNLOADERROR_NETWORK_MOBILE | 216 | 下载更新失败了,移动网络下 |
STATUS_DOWNLOADERROR_NETWORK_NONETWORK | 217 | 下载更新失败了,没有网络 |
STATUS_DOWNLOADERROR_CANCLED | 218 | 下载更新失败了,取消了 |
STATUS_DOWNLOADERROR_NET_ERROR | 219 | 下载更新失败了,网络有问题 |
STATUS_DOWNLOADERROR_OTHERS | 220 | 下载更新失败了,其他,详情查看errorMsg |
STATUS_DOWNLOADERROR_IO_ERRORS | 221 | 下载更新失败了,IO出错 |
STATUS_DOWNLOADERROR_XML_ERRORS | 223 | 下载更新失败了,xml出错 |
STATUS_DOWNLOADERROR_SIGNED_ERRORS | 224 | 下载更新失败了,签名有错 |
STATUS_VERYFYFAIL_FILE_NOTFOUND | 240 | 下载更新失败了,文件丢失 |
STATUS_VERYFYFAIL_MD5_CHECK_FAILED | 241 | 下载更新失败了,md5校验失败 |
2.2.9 通知安装结果
接口名称:public void notifyInstallResult(final Context context,
final String sessionId, final String packageName, final int targetVersionCode, final String targetVersionName, final int result, final String errMsg)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
context | Context | 必填 | 调用接口的上下文 |
sessionId | String | 必填 | 上面2.1的接口调用之后,从回调函数返回的session id |
packageName | String | 必填 | 待更新的应用包名 |
targetVersionCode | int | 必填 | 目标版本version code |
targetVersionName | String | 必填 | 目标版本version name |
result | int | 必填 | 安装结果 |
errMsg | String | 必填 | 安装失败的error message |
返回值: 无
说明:
由调用者,将应用的安装结果通知给fota sdk。
上面的result定义:
宏定义 | 值 | 含义 |
STATUS_INSTALLSUCCESS | 0 | 安装成功 |
STATUS_VERYFYFAIL | 110 | 安装失败,更新包校验失败,详情查看errMsg |
STATUS_INSTALLERROR | 113 | 安装失败,安装应用失败,详情查看errMsg |
3. 系统升级接口
包名:com.aliyun.aicc.fota.sdk.aidl
类名:IOsUpdateService
1. 初始化:
// 系统升级是以service方式实现的,对外提供aidl的接口。
// 通过如下方式,获取系统升级service的实例
mService = IOsUpdateService.Stub.asInterface(arg1);
下面的接口,都是系统升级service的方法,需要通过mService的实例进行调用。
2. 查询相关的接口2.1 查询新版本
接口名称:
public synchronized void checkUpdateXml(int trrigerType)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
trrigerType | int | 必填 | 发起查询的类型 |
返回值: 无
说明:
调用上面的查询接口,发起查询之后,通过所注册的listener的onGotXml()方法,取得新版本信息。
入参发起查询的类型,取如下值:
OsUpdateServiceManager类的如下类型: public enum OsCheckTriggerType { manual_button, manual_notification_bar, manual_pc_helper, auto_push, auto_network_connected, auto_alarm_timeout };
2.2 设置自动查询时间间隔
接口名称:
public boolean setAutoTimerCheckInterval(long intervalMilliSecond)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
intervalMilliSecond | long | 必填 | 自动轮询的时间间隔,单位是毫秒,默认值是24小时 |
返回值: true:设置成功 false:设置失败
说明:
设置自动轮询的时间间隔,单位是毫秒,默认值是24小时
做了这个设置之后,自动打开“自动轮询”的功能
2.3 关闭自动查询
接口名称: public boolean disableAutoTimerCheck()
参数说明: 无
返回值: true:设置成功 false:设置失败
说明:
关闭自动轮询的功能
默认为开启,默认自动轮询的时间间隔为24小时(距离上次查询成功的时间间隔)
3. 下载更新包
接口名称:
public synchronized void download(int mode)
参数说明:
入参 | 类型 | 是否必填 | 说明 |
mode | int | 必填 | 下载模式 |
返回值: 无
说明: 查到版本之后,调用该接口进行下载。
入参取如下值:
OsUpdateServiceManager.DOWNLOAD_LOCAL
4. 自动查询发现新版本后,是否自动开始下载
自动查询包括:
收到push后发起的查询
自动定时查询
网络断开再连接之后的查询
上述情况下发起的自动查询,发现新版本后,将根据如下接口设置的开关状态,决定是否开始自动下载。
注意:由用户在UI上手动发起的查询,发现新版本后,需要UI代码中,主动调用mService.download(OsUpdateServiceManager.DOWNLOAD_LOCAL),才开始下载。
接口名称:
public void setAutoDownloadUnderWiFi(boolean isAutoDownload)
参数说明: true:自动下载;false:不自动下载
返回值: 无
接口名称:
public void setAutoDownloadUnderMobile(boolean isAutoDownload)
参数说明: true:自动下载;false:不自动下载
返回值: 无
5. 升级
接口名称:
public synchronized void restartInstall()
参数说明: 无
返回值: 无
说明: 重启系统,进入recovery模式做升级。
6. 代码示例
首先需要绑定osupdate service,如何绑定,请参考接入指南。
下面的mService,就是所绑定的osupdate service的实例。
查询:
mService.checkUpdateXml(OsCheckTriggerType.manual_button.ordinal());
下载:
mService.download(OsUpdateServiceManager.DOWNLOAD_LOCAL);
// wifi和以太网络下,是否自动下载
mService.setAutoDownloadUnderWiFi(true)
// 移动网络下,是否自动下载
mService.setAutoDownloadUnderMobile(true)
// 上面两个方法,如果指定入参为true,不需要主动调用下载接口,当查询到有新版本之后,就自动开始下载。
// 如果指定为false,当查询到有新版本之后,只是返回新版本信息,并不自动开始下载。
// 默认为true
升级:
//重启之前需要检查是否可以进行重启升级
int ret = mService.checkPreInstallStatus();
if (ret == FotaDownloadServiceManager.ENV_OK) {
//重启系统并升级
mService.restartInstall();
}