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

通过网络或直接本地获取到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模式的过程在后面的专题中再讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进阶学习js中的执行上下文

在js中的执行上下文,菜鸟入门基础 这篇文章中我们简单的讲解了js中的上下文,今天我们就更进一步的讲解js中的执行上下文。 1、当遇到变量名和函数名相同的问题。 var a 10; function a(){console.log(1); } a(); //报错 如果你觉得函数a会覆盖变量a那你…

android使碎片切换界面,玩转Android中的碎片Fragment

引言:在Android开发中,我们都知道一些界面的展示经常会用到的就是Activity,但是Activity存在着很大的局限性,比如说手机上的界面显示在平板上面就会发生各种变形的问题,Activity也无法实现局部的数据刷新,所以Android3.0之后出来了Fragment,Fragment通常…

python123阶乘累加_使用多线程计算阶乘累加 1!+2!+3!+...+19!+20!。其中一个线程计算阶乘,另一线程实现累加并输出结果。...

运用多线程的信号灯法进行边加边计算!代码如下public class JieChen {public static void main(String args[]){Sum sum new Sum();new Play(sum).start();new Add(sum).start();}}class Play extends Thread{Sum sum;public Play(Sum sum){this.sumsum;}Overridep…

html GPS坐标实现,JavaScript 实现GPS坐标点距离计算(两个经/纬度间的距离计算)...

在LBS(基于位置服务)的一些应用中,有时我们会需要计算两个用户或两个坐标点之间的距离。要解决这类问题,就要了解空间几何的概念并结合数学中在三角函数公式计算两点之间的值。本文介绍基于经度/纬度的,两个坐标点之间的距离计算,…

机器学习基于skcilearn tensorflow电子书_Tensorflow机器学习模型的跨平台上线

本篇文章转载自博客园,作者: 刘建平Pinard在用PMML实现机器学习模型的跨平台上线中,我们讨论了使用PMML文件来实现跨平台模型上线的方法,这个方法当然也适用于tensorflow生成的模型,但是由于tensorflow模型往往较大,使…

html全局浮窗,Html 实现浮动窗口

今天在写一个html代码时,需要用到浮动窗口,通知信息,网站找了一下,代码如下带关闭按钮的浮动窗口代码(全屏漂浮)#fdck {border:1px solid #c0c0c0;margin:0 auto;padding:5px;background:#f0f0f0}关闭欢迎来到营了个销&#xff01…

python数据可视化工具 pandas_Pandas数据可视化工具——Seaborn用法整理(下)

在前一篇文章 Pandas数据可视化工具——Seaborn用法整理(上),我们了解了如何使用这些Seaborn代码绘制分布图和分类图。在本文中,我们将继续讨论Seaborn提供的一些其他以绘制不同类型统计图的功能,我们将从矩阵图开始讨论。矩阵图矩阵图是一种…

ssm框架里面前端拿HTML写,ssm框架引入Vue,声明式渲染,标签的href拼接字符串

一、引入Vue在官网上下载vue.js。并用1.下载Vue.js,地址:Vue.js下载地址二、通过ajax获取后台参数,使用Vue渲染调用后台control,获取到数据,传到前端,使用Vue进行渲染。//详细分类,使用Vue渲染function fin…

html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作

MutationObserver介绍MutationObserver给开发者们提供了一种能在某个范围内的DOM树发生变化时作出适当反应的能力.该API设计用来替换掉在DOM3事件规范中引入的Mutation事件.Mutation Observer(变动观察器)是监视DOM变动的接口。当DOM对象树发生任何变动时,Mutation …

Maven(五)使用Nexus搭建Maven私服

文章装载于:http://blog.csdn.net/jun55xiu/article/details/39497089 Nexus介绍 Nexus是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库下载所需要的构件(artifact),但这通常不是一个好的做法&am…

python mean dropna_小丸子踏入python之路:python_day05(用Pandas处理泰坦尼克船员获救数据titanic_train.csv)...

泰坦尼克船员获救数据:titanic_train.csv用excel打开数据集。显示如下:写在前边:为了方便以后运用numpy和pandas的库,分别造它们的别名np和pd.import pandas as pd #造pandas的别名为pdimport numpy as np #造numpy的别名为np一、…

计算机学测打多少字,速度测试,一分钟能打多少字?

六、速度测试——检验学习效果经过一段时间的练习,输入速度提高了不少吧,赶快来测试一下现在一分钟可以输入多少英文或汉字。金山打字通2010的“速度测试”功能不仅有基本的“屏幕对照”速度测试,还有“书本对照”测试及要求较高的“同声录入…

HDFS入门(1)

2015.07.12笔记 1.HDFS Distributed File System(操作系统实现人机交互,最重要的功能是文件管理,使用文件管理系统,windows、Linux文件管理系统有共性:用户可创建文件/夹,删除,修改权限&#xf…

竞赛图 计算机网络 应用题,我校学子获2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛一等奖(图)...

近日,2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛在温州浙南科技城落下帷幕。我校计算机与信息安全学院陈俊彦、雷晓春老师指导的“智载车队”团队(成员:林楷浩、陈澳格、黄湖)在创业先锋C系列中获得全国一等奖,在创新创意A系列中…

python string模块template_Python - 定制pattern的string模板(template) 详解

定制pattern的string模板(template) 详解本文地址: http://blog.csdn.net/caroline_wendy/article/details/28625179string.Template的pattern是一个正则表达式, 可以通过覆盖pattern属性, 定义新的正则表达式.如: 使用新的定界符"{{", 把{{var}}作为变量语法.代码:#…

建立远程桌面连接计算机无密码,win7远程桌面空密码的步骤_win7系统如何设置让远程桌面登录无需密码-win7之家...

在日常工作中,可能经常会使用到远程连接桌面功能,我们要远程桌面的话,通常是要输入密码才可以的,但是有些用户觉得麻烦,那么win7系统如何设置让远程桌面登录无需密码呢?带着大家的这个问题,本文…

android 请求网络异步载入

/*** 封装ProecssDialog对话框**/ public class LoadDialog extends ProgressDialog {private String title "进度对话框";private String message "载入数据中....";public LoadDialog(Context context, int theme) {super(context, theme);}/*** 用默认…

tkinter如何lable重复显示到同一行中_如何创建包含 CAD 导入和选择的仿真 App

在使用 COMSOL 软件二次开发的过程中,你可能会遇到这样的问题:如何使用 App 开发器创建可以处理 CAD 导入并能让用户交互式选择边界条件的仿真 App?我需要了解编程吗?今天我们将为您介绍在 COMSOL 软件中创建包含 CAD 导入和选择的…

计算机科学导论课后单词,计算机科学导论课后总结

计算机科学导论课后总结1老师上课给我们演示了一个迷宫的程序,然后我上网查找了一下,大致学习了一下这个程序的思想。迷宫这个题目和数据结构—图有关迷宫的随机生成和路径搜索主要和图的遍历有关,一般来说图的遍历主要有两种方式&#xff1a…

InnerClass内部类

1,内部类概述 定义:把A类定义在B类内部,则A类是内部类。如下所示: class Outer1{外部类String name1;public void show(){System.out.println("Outer1.show()"new Inner1().name);}class Inner1{//内部类String name;pu…