Android设备的OTA升级
文章目录
前言
做好集成前准备后,可以进行SKD的集成工作。下面详细介绍了如何集成Android设备的SDK。
一、基本参数配置
1.1 jar包的导入
将下载下来的demo文件中的jar包,导入到自己本地的程序中。
1.2 本地依赖的添加
jar包导入完成后,需要添加一个本地的依赖。
1.3 xml配置
本地依赖添加完成后,需要进行xml的配置。我们需要添加相关的权限以及相关的组件。
配置AndroidManifest.xml:添加权限、组件
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECOVERY" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<provider
android:name="com.abupdate.common.CommonContextProvider"
android:authorities="${applicationId}.commoncontextprovider"
android:exported="false" />
<receiver android:name="com.abupdate.common_fota.receiver.UpgradeReceiver">
<intent-filter android:priority="10004">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<service android:name=".abupdata.AbupdateService"></service>
<service android:name="com.abupdate.common_mqtt.mqtt_service.MqttService"></service>
配置AndroidManifest.xml:配置主项目的product_id,product_secret
注:标签中Your Product Id,Your Product secret请替换成对应产品的product_id,product_secret,且fota/字段不要省去。
<meta-data
android:name="fota_configuration_product_id"
android:value="fota/Your Product_Id"
tools:replace="android:value" />
<meta-data
android:name="fota_configuration_product_secret"
android:value="fota/Your Product_Secret"
tools:replace="android:value" />
二、配置SDK
2.1 SDK初始化
需要在initFota函数中进行相关参数的配置
初始化方法说明
2.2 零件的初始化
SDK初始化完成后,需要进行的是零件的初始化。零件的初始化是在initData函数中,我们将需要升级的零件进行一个实例化。实例化之后,将对象调用的这个方法进行一个设置。因本次设备有一个Android和一个MCU两个零件,因此实例化了MCU和安卓两个对象。
初始化零件信息part
private void initData() {
try {
OtaApi.getInstance().setUpgradePartsInfo(IEcuInfoCallback ecuInfos);
} catch (FotaException e) {
Trace.e(TAG, e.getMessage() + ":" + e.getReasonCode());
}
}
在MCU对象中,需要进行零件参数的配置,比如零件编码、零件当前版本号的获取、零件升级方法的实现等配置。
零件信息实例化
DeviceInfo.class:当前的零件信息类
deviceInfo.partName = "零件名称"; //须和平台零件名称配置一致
deviceInfo.partNumber = "零件编码" //须和平台零件编码配置一致
deviceInfo.partSVer = "零件当前版本号";
deviceInfo.filePath = "零件升级包单独地址";
deviceInfo.installAuto = OtaConstant.SerialPort; //设置当前的升级方式
deviceInfo.isMainProduct = false; //当前ecu为主控零件(主控为整体升级零件的控制件)
deviceInfo.productDate = "2020-10-1";
deviceInfo.customInstallCallback = new InstallBean(); //升级方法实现
在零件当前升级方式的方法里面,我们需要实现零件的升级方法,对出入的升级包进行处理。
实现零件升级方法
deviceInfo.customInstallCallback.class:当前零件的升级类 implements CustomInstallCallback
方法 @Override
public int writePackage(String file, String md5, String version)
参数:
file:下载后的升级文件
md5:升级文件的md5
version:升级目标版本
//例:android零件升级方式:
@Override
public int writePackage(String file, String md5, String version) {
File files = new File(file);
if (files.isFile()) {
try {
RecoverySystem.installPackage(App.mContext, new File(file));
} catch (IOException e) {
//绝大数 权限问题
Trace.d(TAG, "android 升级失败:"+e.getMessage());
}
}
return 0;
}
另一个零件的配置与上述零件基本一致,此处不再详细赘述。
三、主要功能集成
OTA升级的主要功能包括:设备注册、更新零件配置信息、检测版本、下载升级包、零件安装升级、升级上报。在MainActivity.java文件中,定义设备注册、检测版本等接口。
3.1 设备注册
OtaApi.getInstance().setRegistrarCallback(new onRegistrarCallback() {
@Override
public void registrarSuccess() {
Trace.d(TAG, "注册成功");
text_view.setText("注册成功");
}
@Override
public void registrarFile(int code) {
Trace.d(TAG, "注册失败:" + code);
text_view.setText("注册失败" + code);
}
}).registerAsy();
3.2 更新零件信息
OtaApi.getInstance().setOnConfigCallback(new onConfigCallBack() {
@Override
public void configSuccess() {
Trace.d(TAG, "ecu零件信息获取成功");
text_view.setText("ecu零件信息获取成功");
}
@Override
public void configFile(int code) {
Trace.d(TAG, "ecu零件信息获取失败:" + code);
//重新去注册设备信息
if (code == Code.REQUEST_ERROR_DEVICE_NO_REGISTER) {
}
text_view.setText("ecu零件信息获取失败:" + code);
}
}).configAsy();
3.3 检测版本
OtaApi.getInstance().setOnCheckCallback(new onCheckCallBack() {
@Override
public void onStart() {
Trace.d(TAG, "开始检测");
}
@Override
public void onException(int code) {
Trace.d(TAG, "检测失败:" + code);
}
@Override
public void onNeutral(int code) {
Trace.d(TAG, "当前无新版本");
}
@Override
public void onSuccess(PartsDisplayInfo partsDisplayInfos) {
Trace.d(TAG, "检测成功");
}
}).checkAsy();
3.4 下载升级包
OtaApi.getInstance().setDownloadTaskListener(new onDownloadCallBack() {
@Override
public void onSuccess(List<DownEntity> list) {
Trace.d(TAG, "全部下载成功:onSuccess");
}
@Override
public void onFileSuccess(Object info) {
Trace.d(TAG, "下载失败:onFileSuccess");
}
@Override
public void onFileProgress(Object info, int progress) {
Trace.d(TAG, "单个零件下载进度:" + progress)
}
@Override
public void onProgress(int allProgress) {
Trace.d(TAG, "总进度条:" +allProgress) );
}
@Override
public void onFailed(Object info, int state) {
Trace.d(TAG, "当前下载错误码:" + state);
}
@Override
public void onStare(DownEntity downEntity) {
Trace.d(TAG, "开始下载");
}
}).downloadAsy();
3.5 安装升级包
OtaApi.getInstance().setOnInstallCallback(new onInstallCallBack() {
//开始升级
@Override
public void onStart(String partsName) {}
//升级进度
@Override
public void onUpgradeProgress(int tag, int progress) {}
//升级成功
@Override
public void onUpgradeSuccess(String partsName) {}
//升级失败--当前正在重试安装
@Override
public void onUpgradeFail(String partsName, int code) {}
//当前零件安装升级失败
@Override
public void onUpgradeFailRetry(String partsName, int code) {}
//所有的升级全部走完
//走到这里还没重启的话 代表当前没有Android升级或者是AB升级,可在此重启设备
@Override
public void onUpgradeAllComplete() {}
//回滚成功
@Override
public void onRollBackSuccess(String partsName) {}
//回滚失败
@Override
public void onRollBackFail(String partsName, int code) {}
}).installAsy();