关于framwork解密流程优化分析

HikariCP连接池初始化原理与性能优化实战 数据库连接池是Java应用性能优化的核心技术之一,它通过复用已建立的数据库连接,避免了频繁创建和销毁连接带来的巨大开销。其核心原理是在应用启动时预先创建一定数量的连接并维护在池中,当需要时直接获取空闲连接,使用完毕后归还而非关闭,从而显著提升系统响应速度和数据库并发处理能力。在高并发场景下,连接池能有效防止数据库因连接数暴涨而崩溃,是保障应用稳定性的关键组件。HikariCP作为当前性能最优的Java数据库连接池实现,以其极致的速度和轻量级设计著称,被Spring Boot等主流框架选为默认连接池。本文将从 阅读详情

一、问题来源

二、问题优化

 

一、问题来源

    我们都知道Android上如果升级包data区的话,会有解密的过程,这个过程uncryt.cpp中有详细的说明,大致意思就是recovery不能挂载并修改data分区,所以把包放在了dev/block/userdata节点上,并使用block.map文件知名在节点上的存储信息,大部分解密失败的问题在生成block.map时候就失败了

    针对常规的解密流程错误我们可以在最初去除,那么针对非常规操作造成的解密失败呢,例如线程中断,强制关机等等,那么首先我们说明下这个问题

在installpackage方法最初,执行了setupBcb方法也就是将包的路径和语言写入到了misc分区,以备重启之后进入recovery的信息,但是如果解密出现问题,还是会重启进入升级,而且升级失败,所以我们要处理的就是写入bcb和解密的先后关系

对于该问题,大致有两种方法

1、失败后不重启  查看代码后,如果修改涉及到的流程较多,代码修改量较大,所以暂时不考虑该方案

2、失败后直接重启,不在recovery报错

 

 

二、问题优化

 

修改代码之前做了几组测试

1、只删除seupBcb代码,重启后会进入recovery,但是相当于按键进入recovery,没有给到需要执行的command

2、只设定重启参数mReason = "userrequested";还是会重启进入reboot正常走升级的流程

 

根据以上两种测试,如果我们需要判断解密失败后直接重启,以上两个方面都需要考虑到

 

修改方法一

1、修改./framwork/base/core/java/android/os/RecoverySystem.java

修改clearBcb方法为public,因为我要在shutdown中用到

    /**
     * Talks to RecoverySystemService via Binder to clear up the BCB.
     *
     * @hide //加入@hde
     */
    public boolean clearBcb() {
        try {
            return mService.clearBcb();
        } catch (RemoteException unused) {
        }
        return false;
    }

2、修改./framwork/base/services/core/java/com/android/server/power/ShutdownThread.java

 增加标志位

  //by lbb test

  private boolean uncrypt_done;

修改uncrypt方法为boolean返回值

    //by lbb test
    private boolean uncrypt() {
        Log.i(TAG, "Calling uncrypt and monitoring the progress...");
        //进入方法后赋值为true
        uncrypt_done = true;
        final RecoverySystem.ProgressListener progressListener =
                new RecoverySystem.ProgressListener() {
            @Override
            public void onProgress(int status) {
                if (status >= 0 && status < 100) {
                    // Scale down to [MOUNT_SERVICE_STOP_PERCENT, 100).
                    status = (int)(status * (100.0 - MOUNT_SERVICE_STOP_PERCENT) / 100);
                    status += MOUNT_SERVICE_STOP_PERCENT;
                    CharSequence msg = mContext.getText(
                            com.android.internal.R.string.reboot_to_update_package);
                    sInstance.setRebootProgress(status, msg);
                } else if (status == 100) {
                    CharSequence msg = mContext.getText(
                            com.android.internal.R.string.reboot_to_update_reboot);
                    sInstance.setRebootProgress(status, msg);
                } else {
                    // Ignored
                }
            }
        };

        final boolean[] done = new boolean[1];
        done[0] = false;
        Thread t = new Thread() {
            @Override
            public void run() {
                RecoverySystem rs = (RecoverySystem) mContext.getSystemService(
                        Context.RECOVERY_SERVICE);
                String filename = null;
                try {
                    filename = FileUtils.readTextFile(RecoverySystem.UNCRYPT_PACKAGE_FILE, 0, null);
                    rs.processPackage(mContext, new File(filename), progressListener);
                } catch (IOException e) {
                    //解密失败会抛出异常进入catch方法,这里设定uncry_done为false
                    uncrypt_done = false;
                    Log.e(TAG, "Error uncrypting file", e);
                    //return false;
                }
                done[0] = true;
            }
        };
        t.start();
        Log.i(TAG, "uncrypt_done = " + uncrypt_done);
        try {
            t.join(MAX_UNCRYPT_WAIT_TIME);
        } catch (InterruptedException unused) {
        }
        if (!done[0]) {
            Log.w(TAG, "Timed out waiting for uncrypt.");
            final int uncryptTimeoutError = 100;
            String timeoutMessage = String.format("uncrypt_time: %d\n" + "uncrypt_error: %d\n",
                    MAX_UNCRYPT_WAIT_TIME / 1000, uncryptTimeoutError);
            try {
                FileUtils.stringToFile(RecoverySystem.UNCRYPT_STATUS_FILE, timeoutMessage);
            } catch (IOException e) {
                uncrypt_done = false;
                //return false;
                Log.e(TAG, "Failed to write timeout message to uncrypt status", e);
            }
        }
        Log.i(TAG, "uncrypt_done = " + uncrypt_done);
        //返回uncrypt_done
        return uncrypt_done;
    }

修改run方法

    /**
     * Makes sure we handle the shutdown gracefully.
     * Shuts off power regardless of radio state if the allotted time has passed.
     */
    public void run() {
        ......   
        ......
        if (mRebootHasProgressBar) {
            sInstance.setRebootProgress(MOUNT_SERVICE_STOP_PERCENT, null);

            // If it's to reboot to install an update and uncrypt hasn't been
            // done yet, trigger it now.
            //by lbb test
            //如果解密成功,继续执行后续的升级流程
            if(uncrypt()){
                Log.i(TAG, "uncryt succeed");
            }else{
                //如果解密失败,那么调用clearBcb方法清除misc分区的信息
                Log.i(TAG, "uncryt failed,normal reboot");
                RecoverySystem rs = (RecoverySystem) mContext.getSystemService(Context.RECOVERY_SERVICE);
                try {
                  rs.clearBcb(); 
                  Log.i(TAG, "clearBcb succeed");
                  //更改mReason为userrequested ,正常reboot的reboot也为该字段
                  mReason = "userrequested";
                }catch (Exception e){
                  Log.e(TAG, "clearBcb failed");               
                }
            }
        }
        ///M: added for Shutdown Enhancement@{
        mShutdownSeqFinish(mContext);
        /// @}

        shutdownTimingLog.traceEnd(); // SystemServerShutdown
        metricEnded(METRIC_SYSTEM_SERVER);
        saveMetrics(mReboot, mReason);
        // Remaining work will be done by init, including vold shutdown
        rebootOrShutdown(mContext, mReboot, mReason);
    }

 

修改方法二

1、修改./framwork/base/core/java/android/os/RecoverySystem.java

修改setupBcb为public

 

    /**
     * Talks to RecoverySystemService via Binder to set up the BCB.
     *
     * @hide
     */
    pulic boolean setupBcb(String command) {
        try {
            return mService.setupBcb(command);
        } catch (RemoteException unused) {
        }
        return false;
    }

删除instalpackage中的setupBcb方法

           RecoverySystem rs = (RecoverySystem) context.getSystemService(
                    Context.RECOVERY_SERVICE);
            if (!rs.setupBcb(command)) {
                throw new IOException("Setup BCB failed");
            }

 

2、修改./framwork/base/services/core/java/com/android/server/power/ShutdownThread.java

uncry_done标志位和uncrypt方法的修改与上述方法相同

修改run方法

 

    /**
     * Makes sure we handle the shutdown gracefully.
     * Shuts off power regardless of radio state if the allotted time has passed.
     */
    public void run() {
        ......   
        ......
        if (mRebootHasProgressBar) {
            sInstance.setRebootProgress(MOUNT_SERVICE_STOP_PERCENT, null);

            // If it's to reboot to install an update and uncrypt hasn't been
            // done yet, trigger it now.
            //by lbb test
            //如果解密成功,继续执行后续的升级流程
            if(uncrypt()){
                Log.i(TAG, "uncryt succeed");
                //如果解密成功,写入bcb信息
                RecoverySystem rs = (RecoverySystem) mContext.getSystemService(Context.RECOVERY_SERVICE);
                try {
                  rs.setupBcb(); 
                  Log.i(TAG, "setupBcb succeed");
                }catch (Exception e){
                  Log.e(TAG, "setupBcb failed");               
                }
            }else{
                //如果解密失败,将reason信息设定为正常restart的值
                mReason = "userrequested";
            }
        }
        ///M: added for Shutdown Enhancement@{
        mShutdownSeqFinish(mContext);
        /// @}

        shutdownTimingLog.traceEnd(); // SystemServerShutdown
        metricEnded(METRIC_SYSTEM_SERVER);
        saveMetrics(mReboot, mReason);
        // Remaining work will be done by init, including vold shutdown
        rebootOrShutdown(mContext, mReboot, mReason);
    }
Recovery系统升级(3)---软件流程 本章节结合源码剖析Recovery系统升级流程,从APP下载升级包后触发升级直到设备完成更新启动到Launcher的整个过程。 阅读详情

相关推荐

Android 系统-进入recovery的问题集

一、介绍 recovery 二、进入recovery的问题集 1.关于触发拯救模式,导致机器进入recovery。 拯救模式又称救援模式,是Android 8.0新增的一个功能,它的功能介绍可以参见网络上的很多介绍文章,本文只关注问题分析。 问题场景如下:进入隐私空间,长按控制中心的移动数据按钮,此时Phone进程报停,还有一定的几率进入recovery。 分析如下: 隐私空间:Android版本为Android 11,实现的隐私空间功能的方式是创建一个新USER,来达成该需求(有兴趣的可

johnwang7的博客 2824

linux reset 分析

遇到个系统reset的问题,简单看了下kernel reset的代码,简单记录下: 简单看下log: [   25.900749] Restarting system with command 'recovery'. [   25.901449] arch_reset: cmd = recovery [   25.901981] wdt_arch_reset called@Kernel

李子的备忘录 4305

Android reboot那点事儿

背景介绍 最近开发过程中遇到了一个问题,在recovery里没有reboot指令,然而用busybox内置的reboot指令只能起到重启的作用,并不能带参数(reboot recovery/bootloader),这引发了我对reboot指令的思考,这篇讲讲Android指令reboot是如何引导系统进入fastboot或是recovery的,以及通过BCB command,如何通过recovery自动升级。 开发环境:Android O/3.18.71/SDM450 源码分析 1.reboot

spongebob1912的博客 4821

通过log学习RescueParty机制

现象: 手机开机后,拔掉usb线会关机重启进入recovery 恢复出厂模式模式 kmsglog: 20:59:28.633 <14>[ 81.034763] init: Received sys.powerctl='reboot,recovery' from pid: 987 (system_server) 20:59:28.633 <14>[ 81.035089...

u013286033的博客 5001

Android10.0 OTA升级流程分析

原文地址:https://skytoby.github.io/2019/Android%20OTA%E5%8D%87%E7%BA%A7%E6%B5%81%E7%A8%8B%E5%88%86%E6%9E%90/ 一、概述 目前Android系统终端的升级主要是通过无线进行的(FOTA,Firmware Over-The-Air),主要流程是通过无线方式将升级包下载到终端,而后调用系统的升级接口进行升...

skytoby 8463

monkey测试关机/重启问题分析(一)

发现monkey正常下发事件,自身没有crash。

纵容的博客 1701

字节跳动面试流程,同事逆袭面进阿里P7-年薪60W,安卓framework面试题

【Android 详细知识点思维脑图(技能树)】我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

2301_79098332的博客 410

Android 11.0 user模式下解除系统进入recovery功能的限制

在11.0的系统rom定制化开发中,系统中recovery模式功能也是很重要的一部分,而在原生系统中,对于debug模式的产品,可以通过电源键和音量+键进入recovery模式, 但是在user模式下的产品,对于通过这种方式,进入recovery模式就受限制了,防止用户无操作为了产品安全等,不让进入recovery模式,某些特殊产品的需要,要求在 user模式下的产品也需要进入recovery ,所以就需要分析下系统进入recovery模式的流程来分析功能实现

安卓兼职framework和app工程师的博客 1522

APK 安装器上手:5 步在 Windows 上装好第一个安卓应用

APK 安装器(仓库名 APK-Installer)是一个面向 Windows 的安卓应用安装工具:它解析本地 .apk,在安装前把权限清单摊给你看,再通过 ADB 把应用装入电脑上的 Android 子系统(WSA)或已配对的安卓设备。如果你正在找 Windows 安装 APK 教程,这篇文章带你从克隆仓库一路走到完成一次真实安装。 ## 先说结果:装完能做到的三件事 照本文操作一遍后,你可

gitblog_00927的博客 215

新英格兰10机39节点matlab建模,ieee10机39节点系统数据

【实例简介】ieee10机39节点系统数据,主要是BPA数据!【实例截图】【核心代码】ne_039_bus└── ne_039_bus├── 039readme.doc├── bpa│ ├── 039bpa.dat│ ├── 039bpa.swi│ ├── LFerr.LIS│ ├── OneNote 目录.onetoc2│ └── STERR.LIS├── eurostag│...

weixin_39851809的博客 3273

EB TRESOS 29.0.0安装教程用于MCAL配置开发

本文介绍的搭建基于NXP官网提供EB软件,进行基于标准AUTOSAR软件底层驱动配置的开发

qq_53260940的博客 1877

分布式系统面试题解析:高并发与微服务实战

分布式系统是现代软件开发的核心架构,其核心挑战在于处理高并发、保证数据一致性以及实现服务间的高效协作。从技术原理来看,分布式锁、链路追踪、分页优化等方案都建立在CAP理论和BASE原则基础上。在实际工程中,这些技术能显著提升系统的可用性和扩展性,特别是在电商、金融等对实时性要求高的场景。本文以QDKTAI实战面试题为例,深入解析高并发库存扣减、微服务链路追踪等典型问题的解决方案,其中涉及Redis分布式锁、SkyWalking等热词技术,为开发者提供可落地的架构设计参考。

weixin_34234829的博客 392

基于carsim与Simulink联合仿真的车辆换道轨迹规划与轨迹跟踪模型

PID_反步控制_滑膜控制三种四旋翼无人机轨迹跟踪控制算法仿真 附带对应的说明文档,提供建模过程与仿真结果文献(英文)➕PPT 描述:采用的同一种参考轨迹,都是三维仿真 三种控制方法: [1]PID控制、[2]反步控制、[3]滑膜控制(三个仿真模型) 每个仿真均应用了同一种轨迹路径,直接运行即可出三维图,可以实现四旋翼无人机轨迹的跟踪

2501_90804007的博客 1084

RK3568 Android固件介绍、固件烧录、开机进系统

介绍RK3568的固件组成;如何烧录固件以及注意事项;对开机log进行简单走读;提供一个不错的投屏工具 方便开发人员在没屏时也可看机器的界面以及操作Android机器。

lvvv666的博客 2万+

ISO 26262中的失效率计算:Mission profile的使用

Mission profile:任务剖面,即产品在完成规定任务这段时间内所经历的时间和环境的时序描述;集成电路在工作时环境温度是在不停变化的,同时也存在运行状态和非运行状态;为此标准提出了根据任务剖面(Mission profile)以及集成电路的实际结温来评估热幅度变化、循环温度幅值等因素的影响;汽车电子元器件相关的Mission profile参考IEC TR 62380:Table 11。

weixin_47071127的博客 4811

【Dify】PPT生成工具应用

本文介绍了一款自动化PPT生成工具,通过智能接口将文本内容高效转化为结构化演示文档。该系统采用三阶段工作流(内容输入、HTTP请求上传、文件输出),无需复杂操作即可生成专业PPT。工具适用于教学课件、产品发布、企业培训等场景,能显著提升内容表达效率,特别适合初学者快速制作演示材料。文章详细说明了核心节点、应用场景及开发资源,为文本到PPT的自动化转换提供了实用解决方案。

Mr数据杨 1218

Recovery启动流程(1)--- 应用层到开机进入recovery详解

转载请注明来源:cuixiaolei的技术博客  进入recovery有两种方式,一种是通过组合键进入recovery,另一种是上层应用设置中执行安装/重置/清除缓存等操作进行recovery。这篇文档主要讲解上层应用是如何进入到recovery的。本文以高通平台为例。    1.app执行安装/重置/清楚缓存操作调用代码文件frameworks/base/core/java...

weixin_30954607的博客 596

9.6华为OD机试真题 新系统【仓储货物有序出库】

华为OD机试真题 新系统【仓储货物有序出库】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【仓储货物有序出库】多语言题解。

qq_45776114的博客 887

Android启动过程

由于IO操作的过程中,写入文件并非立刻就会真正意义上写入物理磁盘,以及在写入文件的过程中还可能中断或者出错等原因的考虑,采用的策略是先将老的文件package-usage.list,重命为增加后缀package-usage.list.bak;PM.reboot最终也就是setprop sys.powerctl,那么谁来监听sys.powerctl 值呢,是init没错是init,接下来重点介绍init,//根据haltMode 区分,reboot,shutdown,rebootsafemode。

fenghanfenghan的博客 657

同步调相机启动与并网控制技术方案

同步调相机起动与并网控制技术方案采用背靠背变流器系统,通过静止变频器(SFC)策略实现无原动机驱动的同步电机从静止到同步转速的平稳起动。方案详细阐述了硬件自检、模块初始化、转子位置检测等关键环节,重点解决启动转矩为零、冲击电流大等挑战。系统基于STM32或C2000系列控制器,包含网侧/机侧变流器、检测保护单元及通信接口,通过励磁脉冲和电压响应分析实现高精度转子初始定位,为后续并网提供必要条件。代码级实现涵盖了ADC自检、数字IO验证及通信端口测试等核心功能。

huanghm88的专栏 306

提示工程从初级到高级:如何评估提示词的鲁棒性?架构师分享测试方法

鲁棒性(Robustness)原本是工程领域的概念,指系统在“非理想条件”下保持性能稳定的能力。输入鲁棒性:面对不规范、有噪音、格式变异的用户输入,提示能否引导模型输出正确结果?模型鲁棒性:同一提示在不同大模型(或同一模型的不同版本)下,输出是否一致?场景鲁棒性:在边界场景(极端case、歧义case、多任务混合)下,提示能否保持逻辑一致性?提示词V1:请将以下用户评论分类为「正面」「中性」或「负面」:{comment}。要求:输出唯一类别,不要额外说明。

小程序开发 496

Android系统解除USER版本无法进入Recovery模式限制

Android系统解除USER版本无法进入Recovery模式限制

Android framework 1227

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[Android][Reboot/Shutdown] 重启/关机 分析

通过设置属性为reboot可以触发设备的重启操作。这一过程涉及到应用程序设置系统属性、内核捕获并处理属性更改,最终通过reboot系统调用实现设备重启。在实际开发中,应注意权限和安全问题,并确保代码的稳定性和兼容性。对应到目前在研的Android项目的源码中: services/core/java/com/android/server/power/ShutdownThread.java"ERROR");if (!

Leif_dong的专栏 3210

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

引导加载程序

引导加载程序是供应商专有的映像,负责在设备上启动内核。引导加载程序会监护设备状态,负责初始化以及绑定其信任根。引导加载程序还会在将执行工作移到内核之前先验证boot和recovery分区的完整性。

yangzex的专栏 1903

pscad IEEE标准系统搭建说明

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

Android 系统属性(SystemProperties)介绍

Android 10添加定制化prop

mart!nhu的博客 1万+

一、ota流程之framwork installpackage流程

一、ota流程之framwork installpackage流程 关于install_package的流程,大部分应该已经比较了解,按方法流程执行,这里我们流程上还是做简单说明,主要要要说明其中的一些细节 1、setup-bcb 2、block.map的生成 按方法流程分析如下 framwork/base/core/java/android/os/RecoverySystem....

李标标的博客 2141
上一篇: MTK 9.0打开AB升级宏控
下一篇: 一些常用实用的命令整理
李标标
博客等级 码龄11年 124粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值