系统升级

阅读: 评论:0

系统升级

系统升级

系统升级


源码目录树

Settings/
├── l
└── 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 --> UpgradeInfo(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, LastMd()) // 判断下载的文件的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 (!ists()) {loge("Install package, File " + filePath + " not exists!");return false;}log("Install file path:" + Path() + ", 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 (!ists()) {ateNewFile();}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.Default().toString());b.append("n");log("Recovery command=" + b.toString());fw.String());} finally {fw.close();}}} catch (Exception e) {String());return false;}log("Verify successfully, ");captureUpdateLog();PowerManager pm = (PowerManager) SystemService(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 = ("ro.scifly.platform", "dongle");Log.e(TAG, "platform:" + platform);if ("dongle".equalsIgnoreCase(platform)) {// dongle.if (!ists()) {mRecoveryDir.mkdir();}if (ists()) {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.Default().toString());b.append("n");commandFile.String());} 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升级第三阶段大同小异

本文发布于:2024-01-27 20:27:56,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063584782455.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:系统升级
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23