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

 

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

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

 

一、RecoverySystem#installPackage()的实现

 

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

 

bootCommand()的实现:

[java] view plain copy
  1. FileWriter command= new FileWriter(COMMAND_FILE);  
  2. try {  
  3.    command.write(arg);  
  4.    command.write("\n");  
  5. } finally {  
  6.    command.close();  
  7. }  
  8.   
  9. // Having writtenthe command file, go ahead and reboot  
  10. PowerManager pm =(PowerManager) context.getSystemService(Context.POWER_SERVICE);  
  11. m.reboot("recovery");  

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

 

二、PowerManagerService#reboot的实现


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

 

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

- reason: “recovery”;

- confirm: false;

- rebootOrShutdown的参数分别取值:reboot <- mReboot; reason<- mRebootReason;

最后调用的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中】

[cpp] view plain copy
  1. static void android_os_Power_reboot(JNIEnv *env, jobject clazz,jstring reason)  
  2. {  
  3.     sync();  
  4. #ifdef HAVE_ANDROID_OS  
  5.     if (reason == NULL) {  
  6.        reboot(RB_AUTOBOOT);  
  7.     } else {  
  8.         const char *chars =env->GetStringUTFChars(reason, NULL);  
  9.        __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,  
  10.                 LINUX_REBOOT_CMD_RESTART2, (char*) chars);  
  11.        env->ReleaseStringUTFChars(reason, chars);  // In case it fails.  
  12.     }  
  13.     jniThrowIOException(env,errno);  
  14. #endif  
  15. }  

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

 

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

 

四、sys_reboot的定义与实现


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

[cpp] view plain copy
  1. // kernel/kernel/sys.c  
  2. SYSCALL_DEFINE4(reboot, int, magic1, int,magic2, unsigned int, cmd,  
  3.                                 void__user *, arg)  
  4.    
  5. //kernel/include/linux/syscalls.h  
  6. #define __SYSCALL_DEFINEx(x, name, ...)                                                                  \  
  7.                 asmlinkagelong sys##name(__SC_DECL##x(__VA_ARGS__))  
  8.    
  9. #define SYSCALL_DEFINEx(x, sname, ...)                                                     \  
  10.                 __SYSCALL_DEFINEx(x,sname, __VA_ARGS__)  
  11.    
  12. #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); 

[cpp] view plain copy
  1. // kernel/kernel/sys.c  
  2. void kernel_restart_prepare(char *cmd)  
  3. {  
  4.                 blocking_notifier_call_chain(&reboot_notifier_list,SYS_RESTART, cmd);  
  5.                 system_state= SYSTEM_RESTART;  
  6.                 device_shutdown();  
  7.                 sysdev_shutdown();  
  8. }  

 

[cpp] view plain copy
  1. //kernel/arch/arm/kernel/process.c  
  2. void machine_restart(char *cmd)  
  3. {  
  4.                 arm_pm_restart(reboot_mode,cmd);  
  5. }  

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

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

 

总结


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

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

Android OTA升级(2):开启升级过程相关推荐

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

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

  2. 【转】Android OTA 升级之一:编译升级包

    Android OTA 升级之一:编译升级包 作者: 宋立新 Email : zjujoe@yahoo.com 前言 OTA 升级是 Android 系统提供的标准软件升级方式. 它功能强大,提供了完 ...

  3. Android OTA升级(1):编译升级全包

         Android原生系统中就已经支持OTA升级.所谓OTA升级就是通过空中接口获取升级包,然后更新系统固件.一般地,升级包无论如何获取,哪怕是直接TCard本地升级,也被称为OTA升级.    ...

  4. Android OTA升级原理和流程分析(五)---update.zip包从上层进入Recovery服务

    转载自:http://blog.chinaunix.net/uid-22028566-id-3533854.html 文章开头我们就提到update.zip包来源有两种: 一个是OTA在线下载(一般下 ...

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

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

  6. Android OTA 升级之一:编译升级包

    Android OTA 升级之一:编译升级包 作者: 宋立新 Email:zjujoe@yahoo.com 前言 OTA 升级是 Android 系统提供的标准软件升级方式. 它功能强大,提供了完全升 ...

  7. Android OTA升级原理 - 实现流程(整理一)

    Android OTA实现流程分析 OTA升级概述 制作升级包 自动生成update.zip升级包 手动生成update升级包 增量包目录结构 升级包写入设备分区 Android的三种工作模式 Rec ...

  8. 使能全盘加密后的Android ota升级

    1. 背景知识 关于Android全盘加密功能的实现可以参考https://source.android.google.cn/security/encryption/full-disk.data分区的 ...

  9. Android OTA 升级专栏文章导读

    Android OTA 升级专栏文章导读 文章目录 Android OTA 升级专栏文章导读 1. 快速入口 2. 简要介绍 1. 基础入门:<Android A/B 系统>系列 2. 核 ...

最新文章

  1. 微信怎么at所有人_任正非被遗漏的讲话:怎么做一个谦虚的领导者?
  2. android获取地址api,如果在Android中使用位置API给出纬度和经度,如何获取地址
  3. 杰奇为什么只能用php5.2,杰奇2.2修改系统定义后,网站报错问题解决
  4. 图解面向对象中的聚合与耦合概念
  5. php xml expat,PHP 使用 XML Expat 解释xml文件
  6. 如何手工配置DBControl
  7. Web前端工作笔记006---各种弹框框架
  8. Android中发现java代码设置的字体过大
  9. mysql json字段的使用与意义
  10. c语言098十进制输出,C语言题库098.doc
  11. highcharts
  12. shiro(SpringBoot+SpringMVC+Mybatis+Shrio):丰富的登录模块附有GIF动图,博主可免费答疑
  13. [BZOJ2286] [Sdoi2011]消耗战
  14. 如何用VBA制作工资条
  15. 离线状态能不能翻译?手机翻译软件离线小测试,以备不时之需
  16. IDL实现MODIS Grid(正弦投影)产品的重投影及拼接处理
  17. Go 调用系统默认浏览器打开链接
  18. 数据分析师培训机构告诉你,如何成为优秀的数据分析师
  19. 【改进】基于Matlab的穿越火线-枪战王者(CF手游)王者飞行棋礼包收支分析
  20. 人工智能学习(十):什么是贝叶斯网络——伯克利版

热门文章

  1. 八、Java的可变参数例子
  2. SQL Server中CTE的另一种递归方式-从底层向上递归
  3. spring_redis整合
  4. Apache Lucene Java 全文检索引擎架构
  5. notion知识库网站
  6. 验证javascript错误使用Google Analytics(分析、统计)
  7. 推荐30款最佳的数据可视化工具
  8. sqlite3:not found 解决方法
  9. 数据结构+算法+c++学习(写在前面)
  10. THUPC2019划水记