Android系统分析—OTA升级

  • 1. recovery
    • 1.1 升级流程
  • 2. 辅助功能
    • 2.1 ui.cpp
    • 2.2 screen_ui.cpp
    • 2.3 default_device.cpp
    • 2.4 roots.cpp
    • 2.5 bootloader.cpp
    • 2.6 verifier.cpp
    • 2.7 install.cpp
    • 2.8 adb_install.cpp
  • 3. updater进程
  • 4. applypatch
  • 5. 其他辅助库
  • 6. RecoverySystem

1. recovery

  recovery的源代码在bootable/recovery/目录。

  recovery在init进程中被启动,启动过程定义在/etc/init.rc中:

  在bootable/recovery/etc/init.rc中有下面的服务定义:

service recovery /sbin/recovery
  seclabel u:r:recovery:s0

1.1 升级流程

  升级主流程在recovery.cpp中实现。

  • 加载分区表(load_volume_table,默认挂载内存文件系统/tmp)
  • 保存老的日志:last_log > last_log.1 > last_log.2(rotate_last_logs)
  • 读取recovery参数(get_args)
    1. 如果没有启动命令行参数,读取boot.recovery作为参数
    2. 如果没有,读取/cache/recovery/command
    3. 将参数写回boot.recovery
  • 初始化升级device,ui
  • 如果有升级包参数update_package,安装升级包(install_package)
    1. 挂载、卸载分区(setup_install_mounts,挂载/tmp、/cache,其他卸载)
    2. 真正的升级过程(really_install_package)
      1. 更新UI
      2. 验证安装包
      3. 启动updater,执行安装脚本(try_update_binary)
  • 否则处理wipe_data,wipe_cache
  • 如果升级失败,输出菜单,处理用户选择(prompt_and_wait)
    1. 通过finish_recovery保存日志等信息
    2. 更新背景图像
    3. 获取用户选择(get_menu_selection)
      1. ui->FlushKeys()
      2. 循环处理用户按键
    4. 根据用户选择,进行相应动作
      1. 如果用户选择从外部存储(/sdcard)或者缓存目录(/cache)选择升级包,那么列出文件列表供用户选择(update_directory)
      2. 可能递归进入子目录,最终拷贝选中文件到/tmp/sideload/package.zip(copy_sideloaded_package)并安装升级包(install_package)
  • 完成升级(finish_recovery)
    1. 保存intent,locale
    2. 复制日志
    1. /tmp/recovery.log >> /cache/recovery/log (追加)
    2. /tmp/recovery.log > /cache/recovery/last_log
    3. /tmp/last_install > /cache/recovery/last_install
    1. 清除bootloader message
    2. 取消挂载/cache/recovery/command和/cache

2. 辅助功能

2.1 ui.cpp

  RecoveryUI类,定义了一系列虚接口,同时处理键击事件。通过一个线程读取键击事件,并插入队列。

2.2 screen_ui.cpp

  ScreenRecoveryUI类,负责图形界面绘制和菜单管理。启动了一个线程定期跟新界面。

2.3 default_device.cpp

  定义了DefaultDevice、DefaultUI。Device定义了升级操作列表。DefaultUI继承ScreenRecoveryUI。

2.4 roots.cpp

  管理分区挂载映射。分区配置文件:/etc/recovery.fstab。

2.5 bootloader.cpp

  读写bootloader control block,/misc分区。支持mtd,emmc存储系统。

2.6 verifier.cpp

  验证安装包。
  验证密钥文件位于/res/keys。

2.7 install.cpp

  启动updater进程(下一节介绍),并与其通过管道通信,接受updater反馈的进度等信息。

#define ASSUMED_UPDATE_BINARY_NAME “META-INF/com/google/android/update-binary”
// If the package contains an update binary, extract it and run it.
static int try_update_binary(const char *path, ZipArchive zip, int wipe_cache);

  接受的信息格式为:

  1. progress
  2. set_progress
  3. ui_print
  4. wipe_cache
  5. clear_display

2.8 adb_install.cpp

  通过adb sideload命令输入升级包升级。启动一个recovery子进程,指定“—adbd”参数。子进程将升级包存放在/tmp/update.zip。

#define ADB_SIDELOAD_FILENAME “/tmp/update.zip”

3. updater进程

  updater 就是升级包里面的 META-INF/com/google/android/update-binary 程序,在升级过程中被执行来解析执行升级脚本。

  updater 在recovery的install.cpp中被调用:

  在升级过程中,update-binary 被解压到/tmp/update_binary执行,命令行参数格式为:

update_binary <version> <fd> <name>

  updater 进程与父进程之间通过管道通信,向父进程汇报升级状态和进度。

  updater 的源代码在 bootable/recovery/updater/ 目录。

  脚本文件的名称写死在update.c 中:

#define SCRIPT_NAME "META-INF/com/google/android/updater-script"

  脚本里面使用时函数都定义在 install.c 中:

void RegisterInstallFunctions() {RegisterFunction("mount", MountFn);RegisterFunction("is_mounted", IsMountedFn);RegisterFunction("unmount", UnmountFn);RegisterFunction("format", FormatFn);......RegisterFunction("ui_print", UIPrintFn);RegisterFunction("run_program", RunProgramFn);
}

4. applypatch

  工具applypatch和imgdiff。

  工具imgdiff的源码位于:recovery/applypatch。对应的应用补丁的工具为imgpatch。imgdiff用来处理*.gz,*.zip,*.apk,*.jar,*.img

  imgpatch以及bspatch都存在于applypatch工具中。与官方的bspatch在输入输出以及错误处理上有一些不同。根据diff文件的开头几个字节可以判断应该使用哪个补丁工具。开头为“BSDIFF40”的用bspatch处理,开头为“IMGDIFF2”用imgpatch处理。

5. 其他辅助库

  • libmtdutils

  处理分区挂载的函数库;

  mtdutils.c:处理mtd分区挂载、读写,mtd分区表从/proc/mtd获取。

  mounts.c:获取已经挂载节点列表,处理remount或者umount,列表从/proc/mounts获取。

  MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。

  • libminzip

  小型zip解压库。

  • libmincrypt

  小型加密库。

  • libminadbd

  小型adbd,只支持usb连接,少量命令。

  • libminui

  小型UI库,通过opengl api绘图,并支持键盘事件输入。

  • libedify

  一个升级脚本语言,替代amend。基于yacc语法解析器实现,内置了简单的字符串、逻辑运算符号支持,可以通过外部函数扩展功能。

  • libapplypatch
  • libminelf

6. RecoverySystem

  源代码位于:core/java/android/os/RecoverySystem.java

Android系统分析—OTA升级相关推荐

  1. android ota升级服务,android 标准OTA升级流程

    标准的OTA升级流程包括一下几个步骤: 1.Android设备首先会与OTA服务器进行交互,如果有更新会推送给客户.推送的信息常常会包含OTA更新包的下载地址和一些版本信息. 2.Update程序会将 ...

  2. android怎么ota升级,Android OTA升级过程

    通过网络或直接本地获取到OTA升级包之后,通过程序就可开始Android的升级.本文描述这一过程. 在获取到OTA升级包之后,可以直接通过android.os.RecoverySystem.insta ...

  3. Android系统OTA升级

    OTA英文全称是Over-the-Air Technology,即空间下载技术的意思. OTA升级是Android系统提供的标准软件升级方式.它功能强大,可以无损失升级系统,主要通过网络[例如WIFI ...

  4. Android 系统OTA升级

    一.升级包制作流程 整包:是可以直接用于OTA升级使用,相当于整个替换机器image.优点是操作简单,不容易出问题.缺点是内存很大. 基础包:是用于制作差分包.里面包含所有支持升级的image文件.将 ...

  5. Android系统OTA升级流程

    转自: https://www.2cto.com/kf/201610/558070.html Android系统进行升级的时候,有两种途径,一种是通过接口传递升级包路径自动升级,升级完之后系统自动重启 ...

  6. android ota 方案实战,Android 系统OTA升级流程

    Android系统进行升级的时候,有两种途径,一种是通过接口传递升级包路径自动升级(Android系统SD卡升级),升级完之后系统自动重启:另一种是手动进入recovery模式下,选择升级包进行升级, ...

  7. android ble oad,android ble OTA升级(Ti OAD 方案)

    1.概念 硬件存储中可存放两个镜像:镜像A和镜像B. 关于双镜像,目前有两种做法: 2.方案一: 一个镜像作为 Load 镜像,一个作为功能. 将镜像B作为主要镜像,而镜像A只是作为升级到镜像B的桥梁 ...

  8. 解决高通 Android 12/13 ota升级失败问题

    1. Android adb push ota全量包 如下图所示 2.当前设备是a分区 如下图所示 3.adb root ->adb enable-verity->adb reboot  ...

  9. 记录解决Android11 OTA升级后卡死在开机动画页面的问题

    问题描述: Android 11 ota升级后,重启卡死在开机动画界面 问题初步分析: 抓起串口开机日志,发现错误信息: [   50.020526] init: Untracked pid 425 ...

最新文章

  1. WordPress页面Page和文章Post的相互转换
  2. 详解医学顶刊《柳叶刀》最新发表新型冠状病毒研究论文
  3. NLP 领域还有 5 大开放问题
  4. matlab 算法集锦
  5. 谷歌最终还是把Knative交了出来
  6. vue v2.5.0源码-双向数据绑定
  7. centos 6.9 +nginx 配置GIT HTTPS服务器(证书采用自签名)
  8. 计算机操作师初级理论知识试卷答案,[计算机操作员初级理论知识试卷1.doc
  9. CA虚拟环境访问控制为虚拟化撑起保护伞
  10. Python3.x+pycharm+Anaconda中缩小打包的.exe体积的方法
  11. 5.WEB版QQ多人聊天,带离线留言功能
  12. php store快捷键设置,mac 下 phpstorm 快捷键整理
  13. jquery ui 发布jquery.ui-1.6rc4版本,漂亮多了
  14. 智能客服搭建(4) - 语音流的分贝计算
  15. libopus 实现pcm 编码到opus
  16. MATLB|电动汽车充放电的最优调度
  17. 计算机禁止开机自启动,通过禁止开机启动项快速开机,提升电脑流畅度,拒绝自启...
  18. PKU2506Tiling
  19. Julia 数学运算和初等函数
  20. 每天读论语《论语·学而》02

热门文章

  1. 洛谷 P2715 约数和
  2. GO-输入输出函数和流程控制语句
  3. [运算放大器]佛朗哥笔记 - 非线性电路 - 施密特比较器
  4. 怎样修改图片kb大小?如何压缩图片jpg格式?
  5. template class T 什么意思
  6. 记普林斯顿大学教授李凯:从中国工人到美国院士
  7. 文字环绕图片效果实现
  8. 6:Eclipse 常用快捷键及源码查看
  9. android png和jpg的区别及使用场景
  10. (转载 汇总)Ubuntu 双系统的问题汇总-更新中