最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

系统升级

运维笔记admin13浏览0评论

系统升级

系统升级

系统升级


源码目录树

Settings/
├── AndroidManifest.xml
└── src├── com│   ├── android│   │   └── settings│   │       └── update│   │           ├── Constants.java│   │           ├── CountDownDialog.java│   │           ├── DialogCreatable.java│   │           ├── DisplayInfo.java│   │           ├── JSONData.java│   │           ├── MasterClearDialog.java│   │           ├── SelectUpdateDialog.java│   │           ├── SettingsPreferenceFragment.java│   │           ├── SystemLocalUpdateActivity.java│   │           ├── SystemNetUpdateActivity.java│   │           ├── SystemUpdateActivity.java│   │           ├── UpdateDialog.java│   │           ├── UpdateListener.java│   │           ├── UpdateReceiver.java│   │           ├── UpdateService.java│   │           ├── UpdateSettings.java│   │           ├── UpgradeTask.java│   │           ├── Utils.java│   │           ├── VersionInfor.java│   │           └── VersionInformation.java│   └── eostek│       └── streamnetplusservice│           └── service│               ├── EventListener.java│               ├── IEventListener.java│               ├── IResultListener.java│               ├── IStreamNetPlusService.java│               ├── ITaskListener.java│               ├── MyMap.java│               ├── ResultListener.java│               ├── StreamNetManager.java│               ├── TaskInfoInternal.java│               └── TaskListener.java└── scifly├── device│   └── Device.java├── loadmanager│   ├── EosDownloadListener.java│   ├── EosDownloadManager.java│   ├── EosDownloadTask.java│   ├── EosUploadListener.java│   ├── EosUploadManager.java│   ├── EosUploadTask.java│   └── Util.java├── provider│   ├── metadata│   │   ├── Blacklist.java│   │   ├── Footprint.java│   │   ├── IMsgManager.aidl│   │   ├── IMsgStateListener.aidl│   │   ├── Msg.aidl│   │   ├── Msg.java│   │   ├── PkgUsage.java│   │   ├── StatisticsRecord.java│   │   └── Usr.java│   └── SciflyStore.java├── storage│   └── StorageManagerExtra.java└── util├── CPUTime.java├── JsonParser.java├── LogUtils.IResultListener.aidl├── LogUtils.java├── MachineState.java├── Ping.java└── RecoverySystemExtra.java

I> 上述目录树包含了系统升级所有用到的android API没有定义的额外API;
上述代码取自最新的SciflyNewSettings系统升级模块,最终的效果图见ScreenShot目录。
OTA升级的逻辑实现都在:Settings/src/com/android/settings/update,其他部分只是辅助部分,比如下载组件(HTTP模式的EosDownloadManager,P2P模式的StreamNetManager)


II> OTA升级流程(流程图见OTA_udpate.asta)代码简介:
第一阶段:获取本地和服务器端的升级包信息
SystemNetUpdateActivity ::
onCreate() --> bindService(intent, conn, BIND_AUTO_CREATE); //将SystemNetUpdateActivity与UpdateService绑定
-->mService.checkVersion(Constants.EXTRA_INCREMENTAL); //checkVersion里面会判断上一次升级是否失败,如果是则请求全量升级包,否则请求增量升级包
UpdateService::
if (isLastUpdateFailed) {mThreadPool.submit(new GetVersionInfoTask(Constants.SOURCE_ACTIVITY, Constants.EXTRA_ALL));
} else {mThreadPool.submit(new GetVersionInfoTask(Constants.SOURCE_ACTIVITY, incremental)); // 走到JSONData
}JSONData::
GetVersionInfoTask --> JSONData.getUpgradeInfo(context, packageType) --> getJsonString(json) --> HttpURLConnection.openConnection() //通过HTTP请求升级服务器端的升级包信息第二阶段:从服务器端下载升级包到本地
点击界面上的升级后:
UpdateService::
startUpdate --> 判断下载引擎是P2P还是HTTP --> 根据不同的引擎来决定下载升级包存在的路径,如果是HTTP则默认是放到/cache分区,如果是P2P默认是放到/sdcard --> 设置好下载参数后就开始下载 --> SystemNetUpdateActivity监听下载引擎传回的下载进度进行UI刷新startMonitor--> mService.showCountingDialog --> new CountDownDialog(UpdateService.this, mHandler,Constants.COUNTING_DIALOG_TIME, Constants.COUNTING_DIALOG_INTERVAL_TIME) --> Constants.MSG_DIALOG_OK // 下载完毕,弹出倒计时30秒提示框,用户点击升级按钮或倒计时完毕第三阶段:校验升级包,重启进入Recovery
UpdateService::
mHandler --> Constants.MSG_DIALOG_OK --> Utils.verify(filePath, mInfo.getLastMd()) // 判断下载的文件的md5值是否跟刚开始从服务器返回json的相等,确保数据的完整性
--> Utils.install(getApplicationContext(), filePath) // MD5相等,说明下载过程中未出错,下面开始准备安装升级包/*** Install package and reboot to recovery.* * @param context Application context.* @param filePath Package location.* @return True if install successfully, otherwise false.*/public static boolean install(Context context, String filePath) {File file = new File(filePath);if (!file.exists()) {loge("Install package, File " + filePath + " not exists!");return false;}log("Install file path:" + file.getPath() + ", file length:" + file.length());try {RecoverySystem.ProgressListener progressListener = new ProgressListener() { // new一个校验升级包签名进度的监听器@Overridepublic void onProgress(int progress) {log("VerfyPackage onProgress: " + progress);}};RecoverySystem.verifyPackage(file, progressListener, null); // 调用系统的RecoverySystem.verifyPackage校验升级的签名(升级包是用platform签名文件签名的)/** write command to file /cache/recovery/command* ===============================================* --update_package=/cache/v2.3.2.16452.zip*/File recoveryDir = new File(Constants.RECOVERY_DIR); // 如果校验升级的签名没有异常,则向/cache/recovery/command写入recovery的命令行参数// --update_package=/cache/v2.3.2.16452.zip// --locale=zh_CNif (recoveryDir.mkdirs() || recoveryDir.isDirectory()) {File commandFile = new File(recoveryDir, Constants.COMMAND_FILE_NAME);if (!commandFile.exists()) {commandFile.createNewFile();}FileWriter fw = new FileWriter(commandFile, false);try {StringBuilder b = new StringBuilder();b.append("--update_package=");b.append(filePath);b.append("\n");b.append("--locale=");b.append(Locale.getDefault().toString());b.append("\n");log("Recovery command=" + b.toString());fw.write(b.toString());} finally {fw.close();}}} catch (Exception e) {loge(e.toString());return false;}log("Verify successfully, Goodbye world...");captureUpdateLog();PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);pm.reboot("recovery"); // 调用PowerManager的reboot方法重启到recovery系统,进入recovery后,会从/cache/recovery/command读取内容作为命令行参数来解析,--update_package的参数如果不为空,则recovery会调用相应的函数去安装升级包return true;}

III> USB本地升级:
实现的代码在SystemLocalUpdateActivity::
关键调用函数:
private boolean verifyPackage() {// recovery listenerRecoverySystem.ProgressListener progressListener = new ProgressListener() {@Overridepublic void onProgress(int progress) {mCurrentProgress = progress;myHandler.sendEmptyMessage(UPDATE_PROGRESS);}};// call system interface to update systemtry {RecoverySystem.verifyPackage(mUpdateFile, progressListener, null);String platform = SystemProperties.get("ro.scifly.platform", "dongle");Log.e(TAG, "platform:" + platform);if ("dongle".equalsIgnoreCase(platform)) {// dongle.if (!mRecoveryDir.exists()) {mRecoveryDir.mkdir();}if (mCommandFile.exists()) {mCommandFile.delete();}/** write command to file /cache/recovery/command* ===============================================* --update_package=/cache/v2.3.2.16452.zip*/FileWriter commandFile = new FileWriter(mCommandFile);try {StringBuilder b = new StringBuilder();b.append("--update_package=");b.append(mUpdateFile);b.append("\n");b.append("--locale=");b.append(Locale.getDefault().toString());b.append("\n");commandFile.write(b.toString());} finally {commandFile.close();}PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);pm.reboot("recovery");} else {RecoverySystem.installPackage(this, mUpdateFile);}return true;} catch (Exception e) {Log.e(TAG, "verifyPackage exception, " + e.getMessage());e.printStackTrace();return false;}}这里就不解释了,跟OTA升级第三阶段大同小异
发布评论

评论列表(0)

  1. 暂无评论