admin 发表于 2022-6-14 12:00:42

MT6737 Android7.0 取消安全模式

MT6737 Android7.0 取消安全模式

tsl 发表于 2022-6-27 10:41:19

本帖最后由 tsl 于 2022-6-27 11:59 编辑

1、安全模式的作用    设备在日常使用过程中,不可避免的会添加安装第三方应用。但并不是每一个应用都是安全的,对系统无伤害的。由于第三方应用程序,可能会存在一定的兼容性问题,所以在安装软件后可能会出现系统文件报错,甚至手机无法正常开机或者开机后系统程序不停报错的现象。遇到这种情况,若进行恢复出厂设置,手机中的资料是无法进行备份的,但是Android系统中添加了"安全模式"这项功能,有效的避免上述情况同时来排除故障。    当 Android 设备在安全模式(SafeMode)下工作时,任何的第三方应用程序或相关文件(主要为apk应用程序文件)都不可以使用,但可以使用 Android设备的任务管理器选项进行卸载或管理应用程序,即Android设备的操作系统或软件或相关文件出现问题导致系统进不了正常界面或不能正常启动系统时,则可以将设备进入安全模式(SafeMode)卸载或管理原系统以外安装的应用程序或驱动文件或其他第三方相关文件,当在安全模式(SafeMode)下完全卸载或管理了相关第三方安装的应用程序仍然不可以解决问题后,再进行安装或升级或更新操作系统或其他方法来解决问题。进入安全模式时,主界面的左下方显示“安全模式”或“SafeMode”提示。安全模式进入方法:机器启动后,在开机动画前, 按住 Menu 或 音量减键至开机完成,就可以进入安全模式。安全模式退出方法:若需要退出安全模式,当且Android设备在没有进行过特别使用或使用不当时(设备未使用非原装充电器充电,设备未拆过机等),将设备关机,然后重新开机,即可以退出安全模式,正常进入系统。
2、如何进入安全模式?进入到安全模式的方法一般有两种:扫描按键和系统重启到安全模式。方式1:扫描按键:按照Android原生逻辑,这里针对不同设备会扫描5个按键:菜单键、s键、dpad中间键、轨迹球以及音量减键,其中有任何一个按键按下,就会进入到安全模式。方式2:系统重启到安全模式:正常模式下长按power键,在弹出poweroff弹窗中,长触摸弹窗中的关机按钮,在弹出的"Reboot to safe mode"框中按确定键,设备重启后即进入安全模式。
3、系统如何检测、进入安全模式?   设备在启动到systemServer后,会在systemServer中进行安全模式的检测。    systemserver分两个步骤进行:检测安全模式detectSafeMode()和进入安全模式enterSafeMode()。看检测部分即可:frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java
public boolean detectSafeMode() {
   if (!mInputMonitor.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;
   }
   //menu键
   int menuState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY,
   KeyEvent.KEYCODE_MENU);
   //S键
   int sState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY, KeyEvent.KEYCODE_S);
   //dpad中间键dpadState
   int dpadState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_DPAD,
   KeyEvent.KEYCODE_DPAD_CENTER);
   //轨迹球trackballState
   int trackballState = mInputManager.getScanCodeState(-1, InputDevice.SOURCE_TRACKBALL,
   InputManagerService.BTN_MOUSE);
   //音量减键volumeDownState
   int volumeDownState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY,
   KeyEvent.KEYCODE_VOLUME_DOWN);
   //其中只要有一个被检测到,则会将安全模式唯一的全局变量标识SafeMode设为true
   mSafeMode = menuState > 0 || sState > 0 || dpadState > 0 || trackballState > 0
   || volumeDownState > 0;
   try {
   //系统获取ShutdownThread.REBOOT_SAFEMODE_PROPERTY prop项的值,如果该值存在,则也将mSafeMode设为true
   //该值为系统通过正常模式进入到安全模式的检测值,设为1时,重启后会进入到安全模式。
   if (SystemProperties.getInt(ShutdownThread.REBOOT_SAFEMODE_PROPERTY, 0) != 0
       || SystemProperties.getInt(ShutdownThread.RO_SAFEMODE_PROPERTY, 0) != 0) {
       int auditSafeMode = SystemProperties.getInt(ShutdownThread.AUDIT_SAFEMODE_PROPERTY, 0);

       if (auditSafeMode == 0) {
         mSafeMode = true;
         SystemProperties.set(ShutdownThread.REBOOT_SAFEMODE_PROPERTY, "");
       } else {
       // stay in safe mode until we have updated to a newer build
         int buildDate = SystemProperties.getInt(PROPERTY_BUILD_DATE_UTC, 0);

         if (auditSafeMode >= buildDate) {
         mSafeMode = true;
         showAuditSafeModeNotification();
         } else {
         SystemProperties.set(ShutdownThread.REBOOT_SAFEMODE_PROPERTY, "");
         SystemProperties.set(ShutdownThread.AUDIT_SAFEMODE_PROPERTY, "");
         }
       }
   }
   } catch (IllegalArgumentException e) {
   }
   //最终的检测
   if (mSafeMode) {
   Log.i(TAG_WM, "SAFE MODE ENABLED (menu=" + menuState + " s=" + sState
       + " dpad=" + dpadState + " trackball=" + trackballState + ")");
   SystemProperties.set(ShutdownThread.RO_SAFEMODE_PROPERTY, "1");
   } else {
   Log.i(TAG_WM, "SAFE MODE not enabled");
   }
   mPolicy.setSafeMode(mSafeMode);
   return mSafeMode;
}

4、如何取消安全模式?frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.javadetectSafeMode方法内:public boolean detectSafeMode() {
if (!mInputMonitor.waitForInputDevicesReady(
    .…
    Log.i(TAG_WM, "SAFE MODE not enabled");
}
mPolicy.setSafeMode(mSafeMode);
-       return mSafeMode;
+      return false;
}
这样修改之后,在正常开机时长触摸关机按钮,虽然会弹出安全模式的弹窗确认,但即使进行确认重启的操作,开机后也不会进入安全模式。


页: [1]
查看完整版本: MT6737 Android7.0 取消安全模式