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

在获取到OTA升级包之后,可以直接通过android.os.RecoverySystem.installPackage()开启OTA升级。

RecoverySystem.installPackage()是在API-8之后加入的,使用它需要权限:android.Manifest.permission.REBOOT

一、RecoverySystem#installPackage()的实现

RecoverySystem.installPackage()就是把传入的文件的文件名通过arg“--update_package=”【用具体文件代替】,调用bootCommand()实现。

bootCommand()的实现:

FileWriter command=newFileWriter(COMMAND_FILE);

try{

command.write(arg);

command.write("\n");

} finally{

command.close();

}

// Having writtenthe command file, go ahead and reboot

PowerManager pm =(PowerManager) context.getSystemService(Context.POWER_SERVICE);

m.reboot("recovery");

COMMAND_FILE 是“/cache/recovery/command”。bootCommand()也就是向/cache/recovery/command里把“--update_package=”写入,然后通过BinderIPC调用PowerManagerService的reboot(),并把“recovery”作为参数传入。

二、PowerManagerService#reboot的实现

PowerManagerService.reboot(reason: String)是通过启动ShutdownThread.reboot(mContext,finalReason, false)的执行实现。

执行顺序图如图所示,其中的值:

- reason: “recovery”;

- confirm: false;

- rebootOrShutdown的参数分别取值:reboot

最后调用的Power.reboot(),通过JNI调用它的c实现。

在Power.java的JNI实现在android_os_power.cpp中。

三、Power.reboot的Native实现

Power.reboot()是通过android_os_Power_reboot实现【frameworks/base/core/jni/android_os_power.cpp中】

staticvoidandroid_os_Power_reboot(JNIEnv *env, jobject clazz,jstring reason)

{

sync();

#ifdef HAVE_ANDROID_OS

if(reason == NULL) {

reboot(RB_AUTOBOOT);

} else{

constchar*chars =env->GetStringUTFChars(reason, NULL);

__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,

LINUX_REBOOT_CMD_RESTART2, (char*) chars);

env->ReleaseStringUTFChars(reason, chars);  // In case it fails.

}

jniThrowIOException(env,errno);

#endif

}

通过系统调用__reboot,嵌入内核,实现reboot。

在内核态,进入sys_reboot系统定义。

四、sys_reboot的定义与实现

sys_reboot的定义与实现要看内核中的代码

// kernel/kernel/sys.c

SYSCALL_DEFINE4(reboot, int, magic1,int,magic2, unsignedint, cmd,

void__user *, arg)

//kernel/include/linux/syscalls.h

#define __SYSCALL_DEFINEx(x, name, ...)                                                                  \

asmlinkagelong sys##name(__SC_DECL##x(__VA_ARGS__))

#define SYSCALL_DEFINEx(x, sname, ...)                                                     \

__SYSCALL_DEFINEx(x,sname, __VA_ARGS__)

#define SYSCALL_DEFINE4(name, ...)SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)

所以,sys.c中的SYSCALL_DEFINE4(reboot, ...)就实现了sys_reboot()

SYSCALL_DEFINE4(reboot,...)中对magic1和magic2进行判别,只有符合的magic1及和magic2才会处理,否则直接返回。

对cmdLINUX_REBOOT_CMD_RESTART2:把reboot的reason从用户态拷贝到内核态,调用kernel_restart()执行。

kernel_restart(char* cmd)先调用kernel_restart_prepare(cmd);然后调用machine_restart(cmd);

// kernel/kernel/sys.c

voidkernel_restart_prepare(char*cmd)

{

blocking_notifier_call_chain(&reboot_notifier_list,SYS_RESTART, cmd);

system_state= SYSTEM_RESTART;

device_shutdown();

sysdev_shutdown();

}

//kernel/arch/arm/kernel/process.c

voidmachine_restart(char*cmd)

{

arm_pm_restart(reboot_mode,cmd);

}

arm_pm_restart指向具体平台定义的机器重启的函数指针,原型是void(*arm_pm_restart)(char str, const char *cmd)。

具体实现与所采用的特定平台相关,这里不再讲述。

总结

本文描述了Android中对OTA升级发起的过程,从Framework到JNI,再到Kernel层,层层关系的分析,看到所谓的OTA升级的发起,就是通过向/cache/recovery/command里把“--update_package=”写入,然后通过系统调用转入内核态执行系统调用,实现机器重启,完成OTA升级的全过程。

重启之后,进入Recovery模式的过程在后面的专题中再讨论。

android怎么ota升级,Android OTA升级过程相关推荐

  1. android 系统(154)----OTA制作及升级过程

    OTA制作及升级过程 1.概述 1.1   文档概要 前段时间学习了AndroidRecovery模式及OTA升级过程,为加深理解和防止以后遗忘,所以写这篇文档进行一个总结和梳理,以便日后查阅回顾.文 ...

  2. android动态分区AB升级,Android A/B System OTA分析(四)系统的启动和升级

    Android从7.0开始引入新的OTA升级方式,A/B System Updates,这里将其叫做A/B系统,涉及的内容较多,分多篇对A/B系统的各个方面进行分析.本文为第四篇,系统的启动和升级. ...

  3. android ota 版本校验,OTA升级签名校验简析

    1. 概要 如果进行过OTA升级的开发者,都或多或少有这样的疑问,如何确定该OTA升级包是可以信任的呢?这其中其实涉及到一个签名验证的流程. 2. 签名生成 在生成正规的固件时,一般会运行生成新key ...

  4. Android 系统级APP 升级方案 OTA全流程

    支持原创,请关注专栏: 高质量文章导航 一.Android ota固件编译 OTA 介绍 OTA ( over the air )升级是 Android 系统提供的标准软件升级方式.它功能强大,提供了 ...

  5. OPPOR9Android 6.0过程,超简单 OPPOR9升级Android 6.0系统 详细教程

    网络配图OPPOR9可以说是红火半片天,前段时间O粉还在为OPPO放弃R9愤怒呢,这不就在昨天OPPO官方社区OS产品经理若雨菲菲刚刚发布了OPPOR9全网通基于Android 6.0的ColorOS ...

  6. 如何实现蓝牙空中升级BLE OTA

    如何实现BLE OTA?什么叫DFU?如何通过UART实现固件升级?又如何通过USB实现固件升级?怎么保证升级的安全性?什么叫双备份(dual bank)DFU?什么叫单备份(single bank) ...

  7. linux差分包升级流程,OTA 差分升级包的制作

    OTA 升级是 Android 系统提供的标准软件升级方式. 它功能强大,提供了完全升级.增量升级模式,可以通过 SD卡升级,也可以通过网络升级. 那如何生成差分升级包呢? Android源码的根目录 ...

  8. Android 系统(136)---OTA 差分升级包的制作

    OTA 差分升级包的制作 OTA 升级是 Android 系统提供的标准软件升级方式. 它功能强大,提供了完全升级.增量升级模式,可以通过 SD卡升级,也可以通过网络升级. 那如何生成差分升级包呢? ...

  9. 【STM32】BootLoader介绍、编写 以及 OTA常见方案分析(差分升级 全量升级 AB面升级)

    参考博客:STM32 BootLoader升级固件_cyang's blog-CSDN博客 STM32固件升级详解(BootLoader)_EmbeddedOsprey-CSDN博客_stm32升级b ...

最新文章

  1. 怎么读取java文件,Java怎么读取文件
  2. Mysql主从同步异常处理
  3. 闪灯什么意思_车灯闪1下、2下、3下各代表什么意思?关键时刻可以保命
  4. 洛谷P1157----组合数的输出
  5. 初学者:如何使用虚拟PC将Windows 7安装到虚拟机
  6. java空格 逗号_Java将字符串中的空格换为逗号
  7. 3 MapReduce计算模型
  8. Spring Cloud Alibaba迁移指南(四):零代码兼容 Api-Gateway 1
  9. JAVA类定义,成员类,抽象类及接口类
  10. 数据库的持续集成和版本控制[转自INFOQ]
  11. java map 元素个数_Java 小模块之--统计字符串中元素个数
  12. 计算机系统的3t性能目标是什么,计算机系统结构习题.doc
  13. 模糊控制——(1)基本原理
  14. 微信小程序实现授权登录及退出
  15. layuiadmin开发文档
  16. 计算机辅助设计技术水平证书,计算机程序设计工程师技术水平(java)证书就是计算机技术与软件专业技术资格考试的程序员证书么?...
  17. wifi大师小程序独立版3.0.8源码
  18. ZZNUOJ_C语言1039:n个数求和(完整代码)
  19. 微信抢抢票服务器,已有多人被坑!抢票“加速包”慎用!
  20. Lenovo 使用BoMC工具制作微码升级U盘刷新System x

热门文章

  1. java 基本数据类型和包装类型
  2. nginx设置 二级域名 指定端口
  3. ubuntu远程连接windows工具rdesktop
  4. consul docker方式搭建
  5. 我的虚拟化设想(My virtualization vision)
  6. 深度学习中用到的一些函数
  7. mybatis plus 新增,修改
  8. 凤凰网php,凤凰网某应用sql注入漏洞_MySQL
  9. 1400协议是什么和28181区别_1400张拆解案例,够你PPT拆解学习好几遍了!
  10. 批量找注入 python3+sqlmap结合