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. 系統升級的診斷
使用方法見:http://bestwisewords.com/document_detail/73309.html
2. 應用升級的診斷
與上面的系統升級診斷類似。