首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Android9.0系统OTA升级update_engine

  • 24-03-05 06:41
  • 4250
  • 11994
blog.csdn.net

Android旧式的系统升级是在Recover模式下将U盘里面的update.zip升级包进行安装,这种方式不是特别的安全,如果升级过程中出现掉电,或者其他升级错误,容易造成机器变成砖,只能通过烧录才能修复。现在已使用全新的一套升级系统update_engine,这套系统的加入使原有的Recover变得多余,但是为了向下兼容和恢复出厂设置需要使用所以还保留了Recover模块。update_engine升级思路是A/B升级模式,意思就是机器上有两套可引导系统,如果目前运行的是A系统则通过A引导升级B系统,如果是B系统则引导升级A系统。这样能保证手机不会变成砖,就算升级失败,那也还是原来的系统。升级过程后台运行,不影响用户使用。要想深入学习需要做大量功课,以下一个成功的demo。

模块路径:system/update_engine

测试程序:system/update_engine/update_engine_client_android.cc

测试模块是否打通:

  1. 制作升级包make otapackage
  2. 解压升级包out\target\product\product\update.zip
  3. 提取payload.bin、payload_properties.txt放置到指定下载路径或者U盘
  4. FILE_HASH、FILE_SIZE、METADATA_HASH这些参数在payload_properties.txt文件中
  5. --payload=可以是HTTP形式的URL,直接进行OTA
  6. 特别要注意--headers="最好在第一行,格式解析有换行的要求,不然参数传不下去

测试指令:

  1. update_engine_client --payload=file:///storage/udisk/payload.bin --update --headers="
  2. FILE_HASH=wpG0gLjbUg3uTQ4LTnXjPfH3rvjxCPAEHzCspps28Sg=
  3. FILE_SIZE=589122832
  4. METADATA_HASH=EAlcdErle8BiZLOMZUkWAcwVYdmZc6StLfPMQE0OwE4=
  5. METADATA_SIZE=54970"

解析程序通过\n来进行切割,然后调用service_->applyPayload进行升级。

  1. if (FLAGS_update) {
  2. std::vector headers = base::SplitString(
  3. FLAGS_headers, "\n", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
  4. std::vector and_headers;
  5. for (const auto& header : headers) {
  6. and_headers.push_back(android::String16{header.data(), header.size()});
  7. }
  8. Status status = service_->applyPayload(
  9. android::String16{FLAGS_payload.data(), FLAGS_payload.size()},
  10. FLAGS_offset,
  11. FLAGS_size,
  12. and_headers);
  13. if (!status.isOk())
  14. return ExitWhenIdle(status);
  15. }

如果使用测试指令能成功升级,则可以直接用java接口进行升级工作。

  1. package com.test.update.manager;
  2. import java.net.MalformedURLException;
  3. import java.net.URI;
  4. import java.text.DecimalFormat;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.InputStreamReader;
  10. import android.os.UpdateEngine;
  11. import android.os.UpdateEngineCallback;
  12. import android.os.Build;
  13. import android.os.Handler;
  14. import android.os.Message;
  15. import android.net.Uri;
  16. import android.util.Log;
  17. public class SystemUpdateManager {
  18. public static final String ROOTDIR = "/storage/udisk/UpdatePack";
  19. public static final String PATH_PAYLOAD_BIN = ROOTDIR + "/OS/payload.bin";
  20. public static final String PATH_PAYLOAD_PROPERTIES = ROOTDIR + "/OS/payload_properties.txt";
  21. UpdateEngine mUpdateEngine;
  22. public SystemUpdateManager(Context context) throws MalformedURLException {
  23. mUpdateEngine = new UpdateEngine();
  24. }
  25. UpdateEngineCallback mUpdateEngineCallback = new UpdateEngineCallback {
  26. @Override
  27. public void onStatusUpdate(int status, float percent) {
  28. if (status == UpdateEngine.UpdateStatusConstants.DOWNLOADING) {// 回调状态,升级进度
  29. DecimalFormat df = new DecimalFormat("#");
  30. String progress = df.format(percent * 100);
  31. Log.d(TAG, "update progress: " + progress);
  32. if (this.mUpdateEngine != null) {
  33. this.mUpdateEngine.onStateOrProgress(UpdateChangeListener.MESSAGE_UPDATE_PROGRESS,
  34. 0, progress);
  35. }
  36. }
  37. }
  38. @Override
  39. public void onPayloadApplicationComplete(int errorCode) {
  40. if (errorCode == UpdateEngine.ErrorCodeConstants.SUCCESS) {// 回调状态
  41. Log.d(TAG, "UPDATE SUCCESS!");
  42. if (this.mUpdateEngine != null) {
  43. this.mUpdateEngine.onStateOrProgress(UpdateChangeListener.MESSAGE_WAIT_REBOOT, 0,
  44. null);
  45. }
  46. }
  47. }
  48. };
  49. public void startUpdateSystem() {
  50. Uri uri = Uri.fromFile(new File(PATH_PAYLOAD_BIN));
  51. mUpdateEngine.bind(mUpdateEngineCallback);// 绑定callback
  52. mUpdateEngine.applyPayload(uri.toString(), 0l, 0l, getPayloadProperties());// 进行升级
  53. }
  54. // 读取payload_properties.txt
  55. public static String[] getPayloadProperties() {
  56. try {
  57. File file = new File(PATH_PAYLOAD_PROPERTIES);
  58. InputStreamReader is = new InputStreamReader(new FileInputStream(file));
  59. BufferedReader br = new BufferedReader(is);
  60. List lines = new ArrayList();
  61. String line = null;
  62. while ((line = br.readLine()) != null) {
  63. Log.d(TAG, "getPayloadProperties line: " + line);
  64. lines.add(line);
  65. }
  66. br.close();
  67. is.close();
  68. return lines.toArray(new String[lines.size()]);
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. } catch (Exception e) {
  72. e.printStackTrace();
  73. }
  74. return null;
  75. }
  76. }

参考博客:http://iyenn.com/rec/1824573.html

数据通常是在两个站(点对点)之间进行传输,按照数据流的方向可分为三种传输模式:单
工、半双工、全双工。
在这里插入图片描述

一、单工通信(simplex)

单工通信只支持信号在一个方向上传输(正向或反向),任何时候不能改变信号的传输方向。
为保证正确传送数据信号,接收端要对接收的数据进行校验,若校验出错,则通过监控信道发
送请求重发的信号。
此种方式适用于数据收集系统,如气象数据的收集、电话费的集中计算等。
例如计算机和打印机之间的通信是单工模式,因为只有计算机向打印机传输数据,而没有相反
方向的数据传输。还有在某些通信信道中,如单工无线发送等。

二、半双工通信(half-duplex)

半双工通信允许信号在两个方向上传输,但某一时刻只允许信号在一个信道上单向传输。
因此,半双工通信实际上是一种可切换方向的单工通信。
此种方式适用于问讯、检索、科学计算等数据通信系统;
传统的对讲机使用的就是半双工通信方式。由于对讲机传送及接收使用相同的频率,不允许同
时进行。因此一方讲完后,需设法告知另一方讲话结束(例如讲完后加上’OVER’),另一方
才知道可以开始讲话。

三、全双工(full-duplex)

全双工通信允许数据同时在两个方向上传输,即有两个信道,因此允许同时进行双向传输。
全双工通信是两个单工通信方式的结合,要求收发双方都有独立的接收和发送能力。
全双工通信效率高,控制简单,但造价高。
计算机之间的通信是全双工方式。一般的电话、手机也是全双工的系统,因为在讲话时可以听到对方的声音。

总结

通常四线线路实现全双工数据传输,二线线路实现单工或半双工数据传输。在采用频分法、时间压缩法、回波抵消技术时,二
线线路也可实现全双工数据传输。

注:本文转载自blog.csdn.net的-Ryan的文章"https://blog.csdn.net/u012169524/article/details/87715142"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top