IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android系统分析—OTA升级 -> 正文阅读

[移动开发]Android系统分析—OTA升级

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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:41:17  更:2022-03-10 22:42:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 16:40:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码