首页 > 其他分享 >Android rescueParty 救援模式

Android rescueParty 救援模式

时间:2023-10-17 10:46:27浏览次数:50  
标签:RESET rescueParty 救援 LEVEL UNTRUSTED context Android Settings

现象:设备刷机后无法启动,不停重启。

 

备注:userdebug 版本无问题,user版本才有问题。

 

分析:

1. user版本无法获取到logcat日志,但是从获取的串口日志如下:

[   89.217156]|01-01 00:02:50.315 reboot: Restarting system with command 'rescueparty'

可以看到重启原因是 rescueparty

2.需要获取上层日志才能看出原因。但是这时候没有adb,如何获取日志呢?(这个作为遗留问题单独研究)

3.没有日志,这时候只有用最笨的办法:版本切分,看看上层的哪一笔提交引起的呢?

4.最后查到一笔提交,是和三方应用的权限有关,最后确定这笔修改导致了某些三方应用无法启动。

5.从而触发了系统的rescueparty 功能,系统不断重启。

 

触发条件:

  • system_server在5分钟内重启5次以上调整一次救援级别
  • 永久性系统应用在30s内崩溃5次以上调整一次级别

 

相关知识:

这里摘录一下相关rescureparty 功能相关的知识点:

rescueParty功能
rescueParty主要是为了处理当系统无法正常进入系统,当systemserver一直重启 或者 persistent app(守护应用)一直挂掉重启 时,当重启的次数达到一定次数时,rescureParty会发挥作用,rescureParty也分为不同级别,先重置简单设置,如果还是无法正常启动,再重置重要设置,如果还是无法正常启动,最后重启系统进入recovery模式,并且询问用户 是否需要擦除data分区。所有分为4个等级。

rescueParty功能的开启
rescuePart功能的代码路径为:frameworks/base/services/core/java/com/android/server/RescueParty.java

 private static boolean isDisabled() {
        // Check if we're explicitly enabled for testing
        if (SystemProperties.getBoolean(PROP_ENABLE_RESCUE, false)) {
            return false;
        }

        // We're disabled on all engineering devices
        if (Build.IS_ENG) {
            Slog.v(TAG, "Disabled because of eng build");
            return true;
        }

        // We're disabled on userdebug devices connected over USB, since that's
        // a decent signal that someone is actively trying to debug the device,
        // or that it's in a lab environment.
        if (Build.IS_USERDEBUG && isUsbActive()) {
            Slog.v(TAG, "Disabled because of active USB connection");
            return true;
        }

        // One last-ditch check
        if (SystemProperties.getBoolean(PROP_DISABLE_RESCUE, false)) {
            Slog.v(TAG, "Disabled because of manual property");
            return true;
        }

        return false;
    }

1、rescuePart功能的开启 首先要设置 “persist.sys.enable_rescue” 为 true。默认此属性是没有设置的。
2、当编译的是eng版本时,是关闭救援模式的。
3、当编译版本是userdebug,同时插上usb时,是关闭救援模式
4、当设置了 persist.sys.disable_rescue 属性为true时,会关闭救援模式


rescueParty功能的级别
rescueParty 救援模式有分5个级别,每个级别的救援方法不一样:

LEVEL_NONE
LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS
LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES
LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS
LEVEL_FACTORY_RESET

在系统启动时,当systemServer 出现异常,systemServer会重启,systemServer每重启一次,救援级别就会提升一级,每个级别有相对应的救援措施。同样当系统的PersistentApp 挂掉重启时,也是同样救援级别会提升一级。
不同级别的救援措施

不同级别的救援措施

 

private static void executeRescueLevelInternal(Context context, int level) throws Exception {
        switch (level) {
            case LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS:
                resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_DEFAULTS);
                break;
            case LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES:
                resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_CHANGES);
                break;
            case LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS:
                resetAllSettings(context, Settings.RESET_MODE_TRUSTED_DEFAULTS);
                break;
            case LEVEL_FACTORY_RESET:
                RecoverySystem.rebootPromptAndWipeUserData(context, TAG);
                break;
        }
    }

 

  • 当LEVEL等级 提升1级到LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS时,会调用 resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_DEFAULTS) ,会把默认的不信任的Settings的配置重置。
  • 当LEVEL等级 提升2级到LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES时,会调用 resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_CHANGES) ,会把不信任更改了的Settings的配置重置。
  • 当LEVEL等级 提升3级到LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS时,会调用 resetAllSettings(context, Settings.RESET_MODE_TRUSTED_DEFAULTS) ,会把默认的信任的Settings的配置重置。
  • 当LEVEL等级提升到4级到LEVEL_FACTORY_RESET时,会调用RecoverySystem.rebootPromptAndWipeUserData(context, TAG). 也就是进入Recovery模式。带promptandwipedata命令进入Recovery中,进入后有两个选项供选择,一个立即重启。另一个选项是擦除data分区。可以通过音量上下按键来进行选择。如果是因为data数据导致无法启动,擦除data分区后就可以正常启动了。

总结下,需要进行一些判断是否开启了rescueParty救援模式,如果开启之后,当systerserver或persistentApp 重启时,就是记录一下,同时提升救援等级,每个等级所执行的救援动作不同。最后会进入Recovery模式,用户可以选择擦除data分区来达到救援系统的目的。

部分内容转载自:https://blog.csdn.net/weixin_43215068/article/details/126050825

相关代码分析:https://blog.csdn.net/qq_41818873/article/details/120221844

标签:RESET,rescueParty,救援,LEVEL,UNTRUSTED,context,Android,Settings
From: https://www.cnblogs.com/haoran123/p/17769137.html

相关文章

  • Android TextView设置某段文字可点击
    初次进入app,需要有个勾选隐私协议的UI,其中的隐私协议文字点击是可跳转到新页面对隐私协议机型展示这里选择使用Android自带的SpannedString来设置TextView的文字内容即可设置点击事件,具体代码如下:tvDesc.text=buildSpannedString{ append("点击开始表示你同意") //设置点击......
  • Android小白入行必看的干货分享!零基础轻松学Android
    前言现阶段!大学毕业人数每年呈上升趋势,在庞大的毕业生群体中,经常能够听到的一句话“毕业即失业”,在学历普遍编制,当下就业环境十分险峻,找工作是个难事,找到一份合适的自己的工作可谓是难上加难。很多人将在网上寻求高薪求职方向,发现互联网公司需求的程序编程岗位很多,且薪资很高,想准备......
  • 如何以编程方式关闭/隐藏Android软键盘?
    内容来自DOChttps://q.houxu6.top/?s=如何以编程方式关闭/隐藏Android软键盘?我在我的布局中有一个EditText和一个Button。在编辑字段中写入内容并点击Button后,我希望在触摸键盘外部时隐藏虚拟键盘。我认为这是一段简单的代码,但是我在哪里可以找到它的示例?为了澄清这个疯狂......
  • Android获取第二个SD卡路径
    File[]externalFilesDirs=getExternalFilesDirs(null);//判断是否有第二个SD卡if(externalFilesDirs.length>1){//第二个SD卡的路径FilesecondSdCardDir=externalFilesDirs[1];}else{//如果没有第二个SD卡,则根据需要进行处理}getExtern......
  • 【移动开发学习】 Android Studio 编写一个简单的微信界面
    AndroidStudio简单还原微信ui目标实现3-4个tab的切换效果技术需求activity,xdm,fragment,recyclerview成果展示其中联系人界面通过recyclerview实现了可以滑动列表      仓库地址https://github.com/SmileEX/wecaht.git实现过程主要ui第......
  • Android WebView获取html源码
    通过执行js语句来获取valcode="""document.documentElement.outerHTML""".trimIndent()webview.evaluateJavascript(code){value->valhtmlContent=if(value==null){""}else{//这里需要处理下......
  • Android 语言国际化的思考
    在测试一个应用https://github.com/jd1378/otphelper,使用了虚拟机,然后在原生nexus上的系统设置里添加中文的时候,默认只有English,我输出Chin后就跳出来简体中文给我选中。在otphelper中,也是有语言可以选择的,然后我在搜索栏里输出Chinese,是搜索不到“简体中文”的,输入“中文......
  • Android Ble蓝牙App(五)数据操作
    Ble蓝牙App(五)数据操作前言目录正文一、操作内容处理二、读取数据①概念②实操三、写入数据①概念②实操四、打开通知一、概念二、实操三、收到数据五、源码前言  关于低功耗蓝牙的服务、特性、属性、描述符都已经讲清楚了,而下面就是使用这些知识进行数据的读取、写入、通知......
  • Android Handler异步消息
    前言在Android中,经常会遇到线程间通信的场景,下面就说说Android中最重要的异步消息机制Handler异步消息机制HandlerHandler是Android中最重要的异步消息机制,总共由四部分组成:Handler,Message,MessageQueue,Looper1、主线程创建Handler对象(如果在子线程创建,必须保证调用了Looper.prepa......
  • 2023最新发布!三天吃透Android面试八股文,面试通过率暴涨!
    前言很多开发者都知道,现在的面试从头到尾都是比较有深度的技术问题,虽然那些问题看上去在网上都能查到相关的资料,但面试官基本都是根据你的回答持续深入,如果没有真正对技术原理和底层逻辑有一定的了解是无法通过的。如今,国内移动互联网的红利期已经过去,在Android领域找工作并不是一......