1. 系统升级接入指南
1.1 初始化
在application的onCreate()方法中,做如下必需项的设置:(必须要做。如果同时接入系统升级和应用升级的话,只需做1次即可。)
// 必需设置
FotaContext.getInstance().initContext(this);
FotaContext.getInstance().setFirmwareVersion(this, SystemProperties.get("ro.yunos.build.version"));
FotaContext.getInstance().setSafeguardAuth(getApplicationContext(), "aicc");
可选的设置有,通过setCustomizedFilterFields()方法,设置自定义查询条件:(无自定义查询条件的话,可不做。)
// 可选设置
JSONArray jsonArray = null;
try {
jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "field1");
jsonObject.put("value", "value1");
jsonArray.put(jsonObject);
JSONObject jsonObject2 = new JSONObject();
jsonObject2.put("name", "field2");
jsonObject2.put("value", "value2");
jsonArray.put(jsonObject2);
} catch (Exception e) {
Log.e(TAG, "Exception happened in FotaMainApplication onCreate, e.getMessage()=" + e.getMessage());
e.printStackTrace();
}
Log.d(TAG, "FotaMainApplication onCreate jsonArray.toString=" + jsonArray.toString());
FotaContext.getInstance().setCustomizedFilterFields(this, jsonArray.toString());
1.2 绑定osupdate service
更详细的内容,请参考“系统升级参考设计apk的代码实现”。
// 使用OsUpdateServiceManager的静态方法,绑定osupdate service。
// 返回值:
// true:已经绑定,false:未绑定。需要调用者自己维护该返回值。
// 入参:
// context,应用的上下文
// connection,一个ServiceConnection
bindDownloadService(Context context, ServiceConnection connection)
// 示例代码
boolean isBound = OsUpdateServiceManager.bindDownloadService(this, mConnection);
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// 取得osupdate service的实例
mService = IOsUpdateService.Stub.asInterface(arg1);
try {
mService.getFotaDownloadEnvironmentRemote().setUiMode(FotaDownloadEnvironment.UI_MODE_INTERACTIVE);
mService.getFotaDownloadEnvironmentRemote().setIsUserCheckingUi(true);
// 注册监听listener
mService.addListener(mListener);
// 获取osupdate service的状态
mMajorStatus = mService.getServiceStatus();
mMinorStatus = mService.getServiceMinorStatus();
// 根据不同的状态,分别做处理
switch (mMajorStatus) {
case FotaDownloadServiceManager.STATUS_VERYFY_DONE:
case FotaDownloadServiceManager.STATUS_INSTALL_FORCED_TIMER_TICK:
case FotaDownloadServiceManager.STATUS_INSTALLING:
case FotaDownloadServiceManager.STATUS_DOWNLOADING:
case FotaDownloadServiceManager.STATUS_INSTALL_ERROR:
switch (mMinorStatus) {
case FotaDownloadServiceManager.STATUS_PRECHECK_POWER_LOW:
case FotaDownloadServiceManager.STATUS_PRECHECK_POWER_NEED_CHARGING:
case FotaDownloadServiceManager.STATUS_PRECHECK_DATA_STORAGE_TOO_LOW:
case FotaDownloadServiceManager.STATUS_INSTALL_ERROR_FILE_NOTFOUND:
default:
}
case FotaDownloadServiceManager.STATUS_DOWNLOAD_ERROR:
case FotaDownloadServiceManager.STATUS_VERYFY_FAILED:
case FotaDownloadServiceManager.STATUS_CHECK_SUCCESS:
default:
}
} catch (RemoteException e) {
Log.e(TAG, "", e);
finish();
}
}
public void onServiceDisconnected(ComponentName arg0) {
mService = null;
mIsBound = false;
}
};
1.3 注册监听osupdate service状态变化的listener
更详细的内容,请参考“系统升级参考设计apk的代码实现”。
// 注册监听listener
mService.addListener(mListener);
// listener的定义
private FotaDownloadServiceIListener mListener = new FotaDownloadServiceIListener() {
// 从service返回新版本信息
public void onGotXml(FotaRootXmlInfo fota) throws RemoteException {
mFotaXml = fota;
synchronized (myCurrentVersionInfoLocker) {
if (mFotaXml != null && !TextUtils.isEmpty(fota.getSystemVersion())
&& !TextUtils.isEmpty(fota.getSize())) {
mCurrentFotaVersionInfo = new FotaVersionInfo();
mCurrentFotaVersionInfo.setSystemVersion(fota.getSystemVersion());
mCurrentFotaVersionInfo.setSize(fota.getSize());
mCurrentFotaVersionInfo.setTimeStamp(fota.getTimeStamp());
mCurrentFotaVersionInfo.setUpdateInfoText(fota.getUpdateInfoText());
mCurrentFotaVersionInfo.setUpdateInfoUrl(fota.getUpdateInfoUrl());
} else {
mCurrentFotaVersionInfo = mLocalFotaVersionInfo;
}
}
}
// osupdate service侧状态变化,通过该方法回调到这里
public void onServiceStatusChange(final int majorStatus, final int minorStatus) {
handler.post(new Runnable() {
public void run() {
onStatusChangedByService(majorStatus, minorStatus);
}
});
}
// service侧更新下载进度,通过该方法回调到这里
public void onDownloadProcess(final int progress, float completeFileSize) {
Log.i(TAG, "FotaUpdateInfo.onDownloadProcess called, partCount: " + progress + ", value: " + completeFileSize);
handler.post(new Runnable() {
public void run() {
updateProgressbar(progress);
}
});
}
};
1.4 参考设计apk中的用户交互
1) 处理强制夜间升级的弹窗
在应用的AndroidManifest.xml文件中,处理弹窗的类中,增加如下2个action的接收:
// 收到该广播,用于显示一个提示:
/*
* 更新提示
* 将在今晚自动升级或者将在明晚完成自动升级
* 只有一个按钮:我知道了
* 用户点击按钮之后,弹窗消失
*/
<action android:name="com.aliyun.aicc.fota.action.popupdialog.OSUPDATE_SERVICE_MIDNIGHT_INSTALL_TIP" />
// 如果云端配置为“夜间强制升级”,
// 端侧fota sdk内部:当下载完该升级包,并且校验通过之后,将设置Alarm,在夜间2:00~3:00之间的某一时刻,发出该广播。
// 应用层收到该广播之后,可显示一个倒计时弹窗,倒计时超时之后,自动重启设备进行升级。
<action android:name="com.aliyun.aicc.fota.action.popupdialog.OSUPDATE_SERVICE_MIDNIGHT_INSTALL" />
具体实现,请参考设计apk中的PopupDialogReceiver.java中的如下方法:
showNightForcedUpdateTipDialog()
showMidnightInstallDialog()
2. 应用升级接入指南
2.1 初始化
FotaContext.getInstance().initContext(this);
FotaContext.getInstance().setSafeguardAuth(this, "aicc");
FotaContext.getInstance().setEnvironment(FotaContext.CLOUD_ENV_ONLINE);
FotaAppConfig.getInstance().setAutoCheckPackagesList(this, 190*1000, new String[]{"com.yunos.member","com.alios.app1","com.alios.app2"});
2.2 静默下载,自动安装
FotaAppConfig.getInstance().setAutoUpgradeUnderWifi(this, true);
FotaAppConfig.getInstance().setAutoUpgradeUnderMobile(this,true);
服务端选择自动安装(只有自升级应用APK才可以选择这一项)
2.3 自定义安装
对于插件选择的安装类型是自定义安装
3. push接入指南
3.1 在应用的manifest文件中,加入push广播的接收:
<receiver android:name="com.aliyun.aicc.fota.push.PushReceiver">
<intent-filter>
<action android:name="com.aliyun.aicc.fota" />
</intent-filter>
</receiver>
3.2 下载并集成cmns apk
说明:
cmns apk是配合ota中的消息推送,诊断等功能所使用的关联apk。
下载到的文件后缀名是.zip,手动改为.apk,并对该apk重新做签名。
4. 升级诊断接入指南
4.1 在应用的manifest文件中,加入升级诊断service
<service
android:name="com.aliyun.aicc.fota.service.DiagnoseService" android:exported="false">
<intent-filter>
<action android:name="com.aliyun.aicc.fota.action.Diagnose" />
</intent-filter>
</service>
4.2 升级诊断的使用
1. 系统升级的诊断
使用方法见:https://help.aliyun.com/document_detail/73309.html
2. 应用升级的诊断
与上面的系统升级诊断类似。