Android 中的 安全模式(safe mode)

这篇具有很好参考价值的文章主要介绍了Android 中的 安全模式(safe mode)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

安全模式是安卓系统的一种特殊模式,和WINDOWS的安全模式相似,在安全模式下用户可以轻松地修复手机系统的一些错误,方便快捷。由于第三方应用程序,可能会存在一定的兼容性问题,所以在安装软件后会出现系统文件报错、手机无法正常开机或者开机后系统程序不停报错的现象。遇到这种情况,若进行恢复出厂设置,手机中的资料是无法进行备份的,但是Android系统中添加了“安全模式”

代码说明

涉及的Frameworks 的几个类

frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
frameworks/base/services/java/com/android/server/SystemServer.java

SystemServer.java 中是启动安全模式的代码

   private void startOtherServices() {
          final Context context = mSystemContext;
          VibratorService vibrator = null;
          DynamicSystemService dynamicSystem = null;
          IStorageManager storageManager = null;
          NetworkManagementService networkManagement = null;  
 IpSecService ipSecService = null;
          NetworkStatsService networkStats = null;
          NetworkPolicyManagerService networkPolicy = null;
          ConnectivityService connectivity = null;
          NsdService serviceDiscovery = null;
          WindowManagerService wm = null;
          SerialService serial = null;
          NetworkTimeUpdateService networkTimeUpdater = null;
          InputManagerService inputManager = null;
          TelephonyRegistry telephonyRegistry = null;
          ConsumerIrService consumerIr = null;
          MmsServiceBroker mmsService = null;
          HardwarePropertiesManagerService hardwarePropertiesService = null;
  
          boolean disableSystemTextClassifier = SystemProperties.getBoolean(
                  "config.disable_systemtextclassifier", false);
  
          boolean disableNetworkTime = SystemProperties.getBoolean("config.disable_networktime",
                  false);
          boolean disableCameraService = SystemProperties.getBoolean("config.disable_cameraservice",
                  false);
          boolean disableSlices = SystemProperties.getBoolean("config.disable_slices", false);
          boolean enableLeftyService = SystemProperties.getBoolean("config.enable_lefty", false);
  
          boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1");
  
          boolean isWatch = context.getPackageManager().hasSystemFeature(
                  PackageManager.FEATURE_WATCH);
  
          boolean isArc = context.getPackageManager().hasSystemFeature(
                  "org.chromium.arc");
  
          boolean enableVrService = context.getPackageManager().hasSystemFeature(
                  PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE);
  
          // For debugging RescueParty
          if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.crash_system", false)) {
              throw new RuntimeException();
          }
  
          try {
              final String SECONDARY_ZYGOTE_PRELOAD = "SecondaryZygotePreload";
              // We start the preload ~1s before the webview factory preparation, to
              // ensure that it completes before the 32 bit relro process is forked
              // from the zygote. In the event that it takes too long, the webview
              // RELRO process will block, but it will do so without holding any locks.
              mZygotePreload = SystemServerInitThreadPool.get().submit(() -> {
                  try {
                      Slog.i(TAG, SECONDARY_ZYGOTE_PRELOAD);
                      TimingsTraceLog traceLog = new TimingsTraceLog(
                              SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
                      traceLog.traceBegin(SECONDARY_ZYGOTE_PRELOAD);
                      if (!Process.ZYGOTE_PROCESS.preloadDefault(Build.SUPPORTED_32_BIT_ABIS[0])) {
                          Slog.e(TAG, "Unable to preload default resources");
                      }
                      traceLog.traceEnd();
                  } catch (Exception ex) {
                      Slog.e(TAG, "Exception preloading default resources", ex);
                  }
              }, SECONDARY_ZYGOTE_PRELOAD);
  
              traceBeginAndSlog("StartKeyAttestationApplicationIdProviderService");
              ServiceManager.addService("sec_key_att_app_id_provider",
                      new KeyAttestationApplicationIdProviderService(context));
              traceEnd();
  
              traceBeginAndSlog("StartKeyChainSystemService");
              mSystemServiceManager.startService(KeyChainSystemService.class);
              traceEnd();
  
              traceBeginAndSlog("StartSchedulingPolicyService");
              ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());
              traceEnd();
  		  
		final boolean safeMode = wm.detectSafeMode();
          if (safeMode) {
              // If yes, immediately turn on the global setting for airplane mode.
              // Note that this does not send broadcasts at this stage because
              // subsystems are not yet up. We will send broadcasts later to ensure
              // all listeners have the chance to react with special handling.
              Settings.Global.putInt(context.getContentResolver(),
                      Settings.Global.AIRPLANE_MODE_ON, 1);
          }

在SystemServer中的startOtherServices()中通过调用wm.detectSafeMode()判断是否进入安全模式, 接下来看下WMS源码看是怎么判断是否进入安全模式的,然后从这里屏蔽掉进入安全模式的入口就可以了。

WindowManagerService.java 中是否进入安全模式代码如下:

 

public boolean detectSafeMode() {
        if (!mInputManagerCallback.waitForInputDevicesReady(
                INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS)) {
            Slog.w(TAG_WM, "Devices still not ready after waiting "
                   + INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS
                   + " milliseconds before attempting to detect safe mode.");
        }
 
        if (Settings.Global.getInt(
                mContext.getContentResolver(), Settings.Global.SAFE_BOOT_DISALLOWED, 0) != 0) {
            return false;
        }
 
        int menuState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY,
                KeyEvent.KEYCODE_MENU);
        int sState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY, KeyEvent.KEYCODE_S);
        int dpadState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_DPAD,
                KeyEvent.KEYCODE_DPAD_CENTER);
        int trackballState = mInputManager.getScanCodeState(-1, InputDevice.SOURCE_TRACKBALL,
                InputManagerService.BTN_MOUSE);
        int volumeDownState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY,
                KeyEvent.KEYCODE_VOLUME_DOWN);
        mSafeMode = menuState > 0 || sState > 0 || dpadState > 0 || trackballState > 0
                || volumeDownState > 0;
        try {
            if (SystemProperties.getInt(ShutdownThread.REBOOT_SAFEMODE_PROPERTY, 0) != 0
                    || SystemProperties.getInt(ShutdownThread.RO_SAFEMODE_PROPERTY, 0) != 0) {
                mSafeMode = true;
                SystemProperties.set(ShutdownThread.REBOOT_SAFEMODE_PROPERTY, "");
            }
        } catch (IllegalArgumentException e) {
        }
        if (mSafeMode) {
            Log.i(TAG_WM, "SAFE MODE ENABLED (menu=" + menuState + " s=" + sState
                    + " dpad=" + dpadState + " trackball=" + trackballState + ")");
            // May already be set if (for instance) this process has crashed
            if (SystemProperties.getInt(ShutdownThread.RO_SAFEMODE_PROPERTY, 0) == 0) {
                SystemProperties.set(ShutdownThread.RO_SAFEMODE_PROPERTY, "1");
            }
        } else {
            Log.i(TAG_WM, "SAFE MODE not enabled");
        }
        mPolicy.setSafeMode(mSafeMode);
        return mSafeMode;
    }

从上面的函数可以看出是否进入安全模式的的判断,通过分析上述代码可知,系统在这里对5个键值进行了扫描:菜单键menuState、s键sState、dpad中间键dpadState、轨迹球trackballState以及音量减键volumeDownState。其中有一个被检测到,则会将安全模式唯一的全局变量标识SafeMode设为true相关操作,当然你也可以屏蔽掉安全模式,但是我们在这里是不推荐这样做的。文章来源地址https://www.toymoban.com/news/detail-503714.html

到了这里,关于Android 中的 安全模式(safe mode)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android安卓架构MVC、MVP、MVVM模式的概念与区别

    目录 MVC框架 MVP框架 MVVM框架 MVVM与MVP区别 MVVM与MVC区别 MVC、MVP、MVVM模式哪个要好一些 MVC(Model-View-Controller)、MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)是三种常见的软件架构模式,它们的目的都是将应用程序的不同部分分离开来,以提高代码的可维护性、可扩展性和可

    2024年02月21日
    浏览(36)
  • Android系统安全 — 6.2 Ethernet安卓架构

    整个Ethernet系统架构如下图所示: 以太网服务(EthernetService)的启动与注册流程; 应用层调用使能ethernet功能的方法流程来分析,从应用层如何将指令一步一步传到底层kernel; 底层kernel如何一步一步上报Uevent(例如网线的插拔等)给framework层实现。 由SystemServer启动的时候生

    2024年02月10日
    浏览(32)
  • 【Android安全】安装mitmproxy Https抓包证书 | 安卓SSL抓包

    macbook上 mitmproxy 抓取安卓手机https流量 重点是安装mitmproxy Https抓包证书 手机需要root,macbook上需要安装好mitmproxy 需要完成下文1-3: https://github.com/doug-leith/cydia (接入有线网并开启无线热点) 启用 IP 转发: sudo sysctl -w net.inet.ip.forwarding=1 保存文件: https://github.com/doug-leith/cy

    2024年01月22日
    浏览(34)
  • Java设计模式-前言

     馆长准备了很多学习资料,其中包含 java方面,jvm调优,spring / spring boot /spring cloud ,微服务,分布式,前端,js书籍资料,视频资料,以及各类常用软件工具,破解工具  等资源。请关注“IT技术馆”公众号,进行关注,馆长会每天更新资源和更新技术文章等。请大家多多关

    2024年01月21日
    浏览(30)
  • CentOS救援模式(Rescue Mode)及紧急模式(Emergency Mode)

    当CentOS操作系统崩溃,无法正常启动时,可以通过救援模式或者紧急模式进行系统登录。 启动CentOS, 当出现下面界面时,按e进入编辑界面。 在编辑界面里,加入参数:systemd.unit=rescue.target ,然后Ctrl-X启动进入救援模式。 在编辑界面里,加入参数:systemd.unit=emergency.target,

    2024年02月15日
    浏览(58)
  • 关于ftp的主动模式(Active Mode)和被动模式(Passive Mode)

    最近做一个项目用到FTP和其它系统进行文件传输,结果在FTP网络连接的问题上花了很多时间,由于太久没搞多FTP,忘记了FTP不单单开放21端口,客户端采用不同连接模式对网络有不同。在此重温一下FTP的主动模式和被动模式的相关知识。 ————————————————

    2024年02月15日
    浏览(24)
  • css 安全区域 safe-area-inset-

    安全区域与边界是iOS11 新增特性。 安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)影响。 Webkit 为此增加了相应的CSS 函数,用于获取安全区域边界值。 安全区域边界有4个预定义变量: safe-area-inset-left:安全区域距离左边边界距离 safe-area

    2023年04月20日
    浏览(31)
  • Android System Property讲解前言

    我们在开发过程中经常会使用到系统属性,例如获取系统软件版本,获取设备名名称,boardid等;有时也需要内置自己的属性,系统属性简单来说是用来存储系统中某些键值对数据,具有全局性、存取灵活方便的特点。 setprop 可以给属性设置int,bool,string等基本类型 在java代码中

    2024年02月07日
    浏览(34)
  • Java设计模式—策略模式(Strategy Mode)

    目录 前言 一、策略模式的简介 二、策略模式的概念 三、策略模式的作用 四、策略模式的优、缺点 策略模式的优点: 策略模式的缺点: 五、策略模式应用场景 六、代码案例 1)抽象接口类 2)具体的策略类:减 3)具体策略类:打折 4)上下文类 5)客户端Main代码测试 总结

    2024年02月08日
    浏览(33)
  • memcpy_s这类安全函数使用介绍(来自安全 C 库: Safe C Library )

    本文主要对带有 _s 的这类 安全 函数(如 memcpy_s)进行简单介绍,以及如何在自己的 Linux 开发环境中使用这些函数。 1. 引入这类安全函数   最近在写程序时,涉及内存拷贝的问题,比如我这里有三个字符类型数组 a、b、c,可以理解为三个缓冲区,其中 a 和 b 中的 内容需要根

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包