OTA

发布时间 2023-08-07 20:02:00作者: 柒月下寻

全称 Over The Air

支持全量升级/增量升级,SD卡/网络在线 升级,要实现需要有以下几个步骤

1.制作升级包

  $ make otapackage (前提是已经有了system.img)

生成文件:

ota/target/product/XXXXX/XXXXX-ota-eng.[UID].zip 

生成差分包的一种工具:
/build/tools/releasetools/ota_from_target_files

2.获取升级包

1.在线获取 (手机设置-系统升级)
2.U盘升级(以前用的比较多)

3.处理升级

OTA - Recovery 模式

目录:/bootable/recovery/ 文件非常多

进入recovery 的流程如下图:
image
进入方式两种
1.开机过程- 手动操作进入 一般为 Volume+ 和 电源键组合(类似于windows开机进入BIOS)
2.系统判断,主动进入(OTA就是用的这种)

进入RecoveryMode 后,会运行一个Recovery的程序,对应的源码 /bootable/recovery/recovery.cpp(一个cpp直接就是一个可运行程序)

Android系统跟recovery 通信中用到的一个关键的 东西
Android -> recovery, 通过命令行文件

/cache/recovery/command

image
recovery -> Android, 通过intent

/cache/recovery/intent
Recovery - 应用

1、恢复出厂设置

FACTORY RESET
    1. user selects "factory reset"
    2. main system writes "--wipe_data" to /cache/recovery/command
    3. main system reboots into recovery
    4. get_args() writes BCB(bootloader control block) with "boot-recovery" and "--wipe_data"
       -- after this, rebooting will restart the erase --
    5. erase_volume() reformats /data
    6. erase_volume() reformats /cache
    7. finish_recovery() erases BCB
       -- after this, rebooting will restart the main system --
    8. main() calls reboot() to boot main system

2、OAT

 OTA INSTALL
  1. main system downloads OTA package to /cache/some-filename.zip
  2. main system writes "--update_package=/cache/some-filename.zip"
  3. main system reboots into recovery
  4. get_args() writes BCB with "boot-recovery" and "--update_package=..."
     -- after this, rebooting will attempt to reinstall the update --
  5. install_package() attempts to install the update
     NOTE: the package install must itself be restartable from any point
  6. finish_recovery() erases BCB
     -- after this, rebooting will (try to) restart the main system --
  7. ** if install failed **
     7a. prompt_and_wait() shows an error icon and waits for the user
     7b; the user reboots (pulling the battery, etc) into the main system
  8. main() calls maybe_install_firmware_update()
     ** if the update contained radio/hboot firmware **:
     8a. m_i_f_u() writes BCB with "boot-recovery" and "--wipe_cache"
         -- after this, rebooting will reformat cache & restart main system --
     8b. m_i_f_u() writes firmware image into raw cache partition
     8c. m_i_f_u() writes BCB with "update-radio/hboot" and "--wipe_cache"
         -- after this, rebooting will attempt to reinstall firmware --
     8d. bootloader tries to flash firmware
     8e. bootloader writes BCB with "boot-recovery" (keeping "--wipe_cache")
         -- after this, rebooting will reformat cache & restart main system --
     8f. erase_volume() reformats /cache
     8g. finish_recovery() erases BCB
         -- after this, rebooting will (try to) restart the main system --
  9. main() calls reboot() to boot main system
// command line args come from, in decreasing precedence:
//   - the actual command line
//   - the bootloader control block (one per line, after "recovery")
//   - the contents of COMMAND_FILE (one per line)
static void get_args(int *argc, char ***argv) {
    struct bootloader_message boot;
   ...
    set_bootloader_message(&boot);
}