Android RecoverSystem 类

Recovery系统升级(3)---软件流程 本章节结合源码剖析Recovery系统升级流程,从APP下载升级包后触发升级直到设备完成更新启动到Launcher的整个过程。 阅读详情
      昨天开会讨论IP网络升级时,需要一个后台服务做升级检测及下载数据,最后在定义下载的数据存放位置及如何做开机标志时,突然发现一个很好用的上层java类对象。


frameworks\base\core\java\android\os\RecoverySystem.java
那么这个类做了什么事情呢?又是如何做到的。


RecoverySystem类,可以帮助我们调用系统还原等操作:


android.os.RecoverySystem,提供了如下静态方法
  static void  installPackage(Context context, File packageFile)   //重启设备,安装一个更新包

  static void  rebootWipeUserData(Context context)  //重启设备,清除用户数据分区类似恢复出厂设置

  static String handleAftermath() 提供清除recover中相关文件,在开机广播中被调用

  static void  verifyPackage(File packageFile, RecoverySystem.ProgressListener listener, File deviceCertsZipFile)  //验证加密签名的系统更新包在安装前,其中第二个数接口的具体定义为 android.os.RecoverySystem.ProgressListener  其中只有一个回调方法  abstract void  onProgress(int progress)   来显示效验的进度。
  


下面具体看一下代码中是如何实现:
1、安装更新包:


    /**
     * Reboots the device in order to install the given update
     * package.
     * Requires the {@link android.Manifest.permission#REBOOT} permission.
     *
     * @param context      the Context to use
     * @param packageFile  the update package to install.  Must be on
     * a partition mountable by recovery.  (The set of partitions
     * known to recovery may vary from device to device.  Generally,
     * /cache and /data are safe.)
     *
     * @throws IOException  if writing the recovery command file
     * fails, or if the reboot itself fails.
     */
    public static void installPackage(Context context, File packageFile)
        throws IOException {
        String filename = packageFile.getCanonicalPath();
        Log.w(TAG, "!!! REBOOTING TO INSTALL " + filename + " !!!");
        String arg = "--update_package=" + filename;
        bootCommand(context, arg); // 都是调用了这个函数
    }


    /**
     * Reboot into the recovery system with the supplied argument.
     * @param arg to pass to the recovery utility.
     * @throws IOException if something goes wrong.
     */
    private static void bootCommand(Context context, String arg) throws IOException {
        RECOVERY_DIR.mkdirs();  // In case we need it
        COMMAND_FILE.delete();  // In case it's not writable
        LOG_FILE.delete();


        FileWriter command = new FileWriter(COMMAND_FILE);  // 写命令写入到recover中
        try {
            command.write(arg);
            command.write("\n");
        } finally {
            command.close();
        }


        // Having written the command file, go ahead and reboot 系统重启
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        pm.reboot("recovery");


        throw new IOException("Reboot failed (no permissions?)");
    }

2、出厂恢复


    /**
     * Reboots the device and wipes the user data partition.  This is
     * sometimes called a "factory reset", which is something of a
     * misnomer because the system partition is not restored to its
     * factory state.
     * Requires the {@link android.Manifest.permission#REBOOT} permission.
     *
     * @param context  the Context to use
     *
     * @throws IOException  if writing the recovery command file
     * fails, or if the reboot itself fails.
     */
    public static void rebootWipeUserData(Context context) throws IOException {
        final ConditionVariable condition = new ConditionVariable();


        Intent intent = new Intent("android.intent.action.MASTER_CLEAR_NOTIFICATION");
        context.sendOrderedBroadcast(intent, android.Manifest.permission.MASTER_CLEAR,
                new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        condition.open();
                    }
                }, null, 0, null, null);


        // Block until the ordered broadcast has completed.
        condition.block();


        bootCommand(context, "--wipe_data");
    }
    /**
     * Reboot into the recovery system to wipe the /cache partition.
     * @throws IOException if something goes wrong.
     */
    public static void rebootWipeCache(Context context) throws IOException {
        bootCommand(context, "--wipe_cache");
    }


3、验证签名
    public static void verifyPackage(File packageFile,
                                     ProgressListener listener,
                                     File deviceCertsZipFile)  请自行阅读源码


后面说一下重启 reboot 命令如何执行的:


无论是 factory reset 工厂恢复还是 安装更新包都会调用到reboot函数,调用   pm.reboot("recovery");

通到jni就是: android_os_Power.cpp


shutdown 调用 android_reboot(ANDROID_RB_POWEROFF, 0, 0);
reboot 调用 android_reboot(ANDROID_RB_RESTART2, 0, (char *) chars);
最终都是调用到下面函数:
int reboot (int  mode) 
{
    return __reboot( LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, mode, NULL );
}


=====linux kernel 内核流程=====
/bionic/libc/arch-arm/syscalls/__reboot.S
这个文件由gensyscalls.py自动产生,调用系统调用 __NR_reboot


bionic/libc/include/sys/linux-syscalls.h
#define __NR_reboot (__NR_SYSCALL_BASE+88)


/arch/arm/kernel/calls.S
__NR_reboot?就是系统函数sys_reboot


sys_reboot定义在./include/linux/syscalls.h,实现在./kernel/sys.c?sys_reboot会调用kernel_restart
最终kernel_restart调用每一个架构特定的machine_restart,即machine_restart执行每个架构特定的函数


Android OTA升级方式 Android OTA 方式 阅读详情

相关推荐

Recovery模块--上层应用到frameworks层流程分析【RecoverySystem.java】

上层app执行安装/重置/清楚缓存操作调用代码文件:frameworks\base\core\java\android\os\RecoverySystem.java安装升级包  -----------  installPackage清除用户数据 ----------- rebootWipeUserData清楚缓存  -----------  rebootWipeCache上面的所有操作都是往/c...

Hellolefty的博客 1111

Android 上层RecoverySystem类

尝试将imx51使用OTA方式进行recovery,将android_recovery.img放入/cache/分区下然后再下一次重启的时候进行分区更新,但发现放入的文件会被莫名删除,logcat中搜索到recovery相关log,tag为recoverysystem,尝试在android工程framework的os代码中寻找代码,找到相关代码,代码最后有将cache分区进行删除仅保留last_l

junjianzhang的专栏 4497

Android SystemServer 启动流程分析

和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、SystemServer 启动的服务有哪些二、SystemServer启动总体流程概述三、SystemServer 如何启动,是谁启动的?四、 SystemServer 启动入门 main 方法五、SystemServer Run 方法初始与启动六、SystemServer 的引导服务有哪些七、Syst...

程序员Android 1936

Android APP端进行OTA包的安装

Android OTA包安装

麒麟001号的博客 2339

小红书图文AI创作:输入主题,一键生成图文(coze工作流教程+获取)

输入主题,工作流一键生成小红书风格图文,30s一条,可批量生成

2301_79384090的博客 2800

BeckHoff <--> ABB 机器手 Profinet 通讯

本文介绍了BeckHoff PLC与ABB机器人通过PROFINET通信的实现方案。主要内容包括:1)通信接口的详细变量定义,涵盖输入/输出信号、设备状态监控、夹爪控制等关键功能位;2)全局数据结构和变量配置说明;3)机器人任务控制程序的实现方法,包括参数校验、任务指令下发和状态监控机制;4)重点分析了任务调度功能块的代码逻辑,涉及慢速模式处理、多参数配置和执行状态判断。该方案通过结构化变量定义和模块化程序设计,实现了PLC对机器人作业的精确控制,为工业自动化系统集成提供了可靠通信范例。

工控智联驿站 1033

android system 函数详解,简单分析Android RecoverSystem 类

Android系统出了名的常刷机,说起刷机就不能不谈Recovery模式,这项操作在刷机过程中是重要的一道步骤。Recovery一般称为刷机模式或工程模式,也可以理解为电脑的GHOST。在这个模式下你可以直接用sd 卡上的zip 的rom 升级或者备份你的系统,老版本的recovery 只有三个选项,无法备份系统,只能用update.zip这个文件名的文件升级,不能用任何文件名的zip文件升级。新...

weixin_39732316的博客 846

SAP OBYC自动过账全解析:从BSX到WRX的会计科目配置指南

本文深入解析SAP OBYC自动过账功能,从BSX到WRX的会计科目配置全流程,涵盖评估分组代码、事务码和评估类等核心概念。通过实战案例展示如何实现库存变动到财务过账的自动化流转,提升企业财务数据的准确性和效率。

weixin_29239279的博客 420

android system recovery utility,Android RecoverSystem 类(一)

http://blog.youkuaiyun.com/andyhuabing/article/details/9223163昨天开会讨论IP网络升级时,需要一个后台服务做升级检测及下载数据,最后在定义下载的数据存放位置及如何做开机标志时,突然发现一个很好用的上层java类对象。frameworks\base\core\java\android\os\RecoverySystem.java那么这个类做了什么事情...

weixin_39746241的博客 511

游戏开发实战:如何在Unity中实现六边形网格地图(附完整代码)

本文详细介绍了在Unity中实现六边形网格地图的完整开发流程,从数学原理到实战代码。涵盖三种主流坐标系转换方法、距离计算算法对比、网格生成与渲染技巧,以及高级功能如网格高亮、寻路算法和性能优化策略。适合策略游戏、战棋类游戏开发者提升地图系统开发效率。

656

从Verilog到GDS:手把手教你搞定Calibre LVS物理验证(附常见报错解决)

本文详细介绍了从Verilog到GDS的Calibre LVS物理验证全流程,包括工具链配置、RTL到SPICE网表转换、LVS运行配置及高级技巧。重点解析了常见报错如网络不匹配、器件不匹配和电源引脚缺失的解决方案,帮助工程师高效完成芯片物理验证,确保设计正确性。

culing2941的博客 508

java系统恢复模式_Recovery模式的命令行参数

概要本文描述Android应用层要进入recovery模式时,需要设定参数的方式、以及参数的格式。应用层的调用场景有如下的场景需要让手机重启进入recovery模式:系统升级;恢复出厂设置RecoverySystem.java// \frameworks\base\core\java\android\os\RecoverySystem.java* fails, or if the reboot i...

weixin_31556371的博客 572

Altium Designer操作技巧(12)——如何进行邮票孔拼版?

【摘要】本文详细介绍了PCB设计中邮票孔拼板的全流程操作方法。首先解释了邮票孔拼板的定义、核心目的(提高贴片效率、方便生产)和适用场景(异形板、V-CUT无法实现的情况)。重点阐述了关键设计参数,包括孔径、数量、间隙等规范要求,并提供了两种具体操作方案:传统复制粘贴法和新版阵列放置法。文章通过图文详细演示了从PCB复制、邮票孔添加、板框定义到定位孔和Mark点设置的完整步骤,最后强调了对称性、非金属化孔等设计要点,以及需要与板厂确认工艺参数等注意事项。

u012526819的博客 1679

Android 原生恢复出场设置流程

Android 恢复出场设置,Master Reset,Recovery 模式

Yang_Mao_Shan的博客 9218

NR PUCCH(一) PUCCH format 0/1

NR中PUCCH物理信道用来发送上行控制信息Uplink Control Information(UCI),当然UCI也可以在PUSCH上发送。UCI 内容包括:CSI,HARQ ACK/NACK ,SR 及上述三者的组合信息。 那先看下PUCCH format ,序列的生成及资源映射的相关内容。 NR中支持5种格式PUCCH,根据PUCCH format占用时域符号长度分为短PUCCH(1-2个符号,PUCCH 0/2)和长PUCCH(4-14个符号,PUCCH1/3/4)。使用短PUCCH 能够支

asd199086的博客 6060

【ARXML专题】-2-创建一个Classic CAN(经典CAN2.0)/CANFD的系统描述ARXML文件

目录 1 创建一个AUTOSAR系统描述 2 物理层命名以及创建ECU 3 新建一个Frame 4 新建一个PDU 5 新建一个signal 6 结尾 AUTOSAR System Description Network Explorer是一个文件编辑器,支持可视化和编辑系统描述的AUTOSAR系统描述文件和ECU摘录的通信内容,它支持架构版本4.0.3、4.1.2、4.2.1、4.2.2和4.3.0。AUTOSAR系统描述(ARXML)文件是基于XML的文件格式,描述网络通信的元素...

「汽车电子助手」的博客 1万+

Android10 rk平台OTA升级过程梳理一

工作中需要使用OTA对设备进行升级,于是梳理了一下OTA前后的升级流程,将过程制作成了过程图,可以按这个过程图去查找代码,分析请看后面的梳理,所有的代码环境:android10。

weixin_34799243的博客 1137

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 关机 流程_Android 关机(reboot)流程

Base On Android 4.2recovery 和 reboot流程part 1.reboot recovery流程。1,RecoverySystem.java中private static File RECOVERY_DIR = new File("/cache/recovery");private static File COMMAND_FILE = new File(RECOVERY...

weixin_39799565的博客 823

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 防刷机

最近做的一款产品,由于前期失误使用的是 官方的testkey 签名rom包。所以别人rom可以随意刷我们产品盒子,为了改正这个bug我们使用了新的签名刷自己产品。防止别人盗刷我们盒子。 要用新签名rom包,先要理解android升级原理, 第一步: 当我们手动u盘升级或者ota升级下载好update.zip包后。当我们点击升级后,android framework的代码 .

lb5761311的专栏 8633

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android Recovery升级原理

Android Recovery升级原理 声明 摘要 Recovery相关概念 Android系统的启动模式 1 Android 各个分区介绍 2 Android的启动模式 3 如何进入Recovery模式 Recovery升级原理 1 Recovery启动参数的设置 2 OTA升级包的目录结构 3 Recovery模式下OTA升级流程 BootloaderBCBRecovery与Main Syst

一路到黑 2万+

android recovery框架,RecoverySystem

verifyPackagepublic static void verifyPackage (File packageFile,RecoverySystem.ProgressListener listener,File deviceCertsZipFile)Verify the cryptographic signature of a system update packagebefore ins...

weixin_31467557的博客 592

Android RescueParty 机制

android 系统进程或内置应用频繁崩溃,无法开机进入recovery模式

ztisen的博客 3295

Android系统OTA升级流程

转自: https://www.2cto.com/kf/201610/558070.htmlAndroid系统进行升级的时候,有两种途径,一种是通过接口传递升级包路径自动升级,升级完之后系统自动重启;另一种是手动进入recovery模式下,选择升级包进行升级,升级完成之后停留在recovery界面,需要手动选择重启。前者多用于手机厂商的客户端在线升级,后者多用于开发和测试人员。但不管哪种,原理都是...

生命不息,奋斗不止! 3716

bootloader recovery

http://huaqianlee.github.io/2015/07/25/Android/Android%E6%BA%90%E7%A0%81bootable%E8%A7%A3%E6%9E%90%E4%B9%8BLK-bootloader-little-kernel/ Android Recovery 源码解析和界面定制 http://blog.youkuaiyun.com/austinde...

拒绝背八股文 2342
上一篇: 成功人士默默在做的30件事情 (11-30)
下一篇: android recovery 系统代码分析 -- 选择进入
andyhuabing
博客等级 码龄19年 704粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值