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

C# NX二次开发:两种过滤器设置方案的实战解析与场景适配

本文深入解析C# NX二次开发中的两种过滤器设置方案:AddFilterHandler回调与MaskTriple属性设置。通过实战案例对比其性能差异与适用场景,帮助开发者根据需求选择最优方案,提升NX插件开发效率与交互体验。特别针对BlockStyler集成场景提供专业建议,是NX二次开发者的实用指南。

weixin_33739646的博客 844

【数据分享】中国371个城市的坡度矢量数据和excel数据

在城市发展的进程中,地形地貌始终是影响规划决策的关键因素,而坡度作为表征地表倾斜程度的核心指标,更是贯穿于城市建设、生态保护等诸多环节。本文将全面解读中国 371 个城市坡度数据的相关情况,包括数据概况、生成流程、应用场景等内容,为读者呈现一份详尽的坡度数据指南。

qq_39719713的博客 1844

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

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

weixin_39732316的博客 846

NFT图片批量合成及稀有度计算工具

一、制作背景 -当前NFT作品制作的大多方式都是使用部件拼接的形式,然后从大量的可能性结果取优; 二、解决问题 拼接合成的组合数量十分巨大,手工合成费时费力; 合成中对各个部件的使用次数不容易控制,部位出现的概率对作品的稀有度及评分影响较大; 对于生成的作品各个部位的信息(包括来源和使用率)统计繁琐,不利于对作品的介绍中体现; 三、程序功能介绍 1、功能自定义部位稀有度批量合成NFT作品 步骤一:创建各个合成部件文件夹,将图片放到文件夹内 步骤二:软件上设置各个部件对于的图片文件夹及出现的概率 步骤二

Keeping111的博客 4638

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

2025最新OSM中国矢量数据保姆级下载指南(附百度网盘链接)

本文提供2025年OSM中国矢量数据的保姆级下载与使用指南。详细介绍了通过Geofabrik镜像站、QGIS插件及第三方平台获取数据的多种途径,重点解析了Shapefile格式数据的结构、WGS84坐标系特性,并指导进行格式转换与基础GIS应用,帮助用户高效合规地获取并利用这份开放地理数据资源。

weixin_29228781的博客 882

在 SAP S/4HANA Cloud Public Edition 中掌控 ABAP 生命周期管理:One-Off、Multi-Off 与 Scalable Delivery 的落地方法论

本文系统梳理了SAP S/4HANA Cloud Public Edition中ABAP扩展开发的三种生命周期管理模式:One-Off适用于企业内部扩展,通过Import Collection在三系统间流转;Multi-Off面向少量客户交付,基于gCTS和Git实现不连接系统间的传输;Scalable Delivery则将扩展产品化为add-on,支持规模化分发。文章结合RAP、OData等实际开发场景,对比分析了各模式的特点与适用边界,为国内团队提供了符合Public Cloud要求的开发与交付实践建议

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1496

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

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

weixin_31556371的博客 572

Orange3实战教程:文本挖掘---标注语料库地图

Oreange3,文本挖掘,标注语料库地图用于在二维投影中可视化、聚类文档,并用关键词进行标注。

err2008的专栏 818

Android 原生恢复出场设置流程

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

Yang_Mao_Shan的博客 9218

【HAL库】STM32CubeMX开发----STM32F407----ETH+LAN8720A+LWIP----ping通

本次实验以芯片为MCU,使用25MHz外部时钟源。以太网PHY层芯片为LAN8720A,由MCU引脚PA8提供时钟。

MQ0522的博客 4844

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

weixin_34799243的博客 1137

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 防刷机

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

lb5761311的专栏 8633

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、付费专栏及课程。

余额充值