Android安全模式

一、什么是安全模式?
提起安全模式,首先大家想到的应该就是windows的安全模式吧。而Android在4.0之后也相应加入了安全模式,在该模式下,只加载系统必要程序,系统之外的第三方程序或文件统统不会启动。

 

二、安全模式有什么用?
上文简单了解了Android的安全模式,但安全模式到底有什么用呢?

设备在日常使用过程中,不可避免的会添加安装第三方应用。但并不是每一个应用都是安全的,对系统无伤害的。由于第三方应用程序,可能会存在一定的兼容性问题,所以在安装软件后可能会出现系统文件报错,甚至手机无法正常开机或者开机后系统程序不停报错的现象。遇到这种情况,若进行恢复出厂设置,手机中的资料是无法进行备份的,但是Android系统中添加了"安全模式"这项功能,有效的避免上述情况同时来排除故障。

 

三、如何进入安全模式?
进入到安全模式的方法一般有两种:扫描按键和系统重启到安全模式。

扫描按键:按照Android原生逻辑,这里针对不同设备会扫描5个按键:菜单键、s键、dpad中间键、轨迹球以及音量减键,其中有任何一个按键按下,就会进入到安全模式。

系统重启到安全模式:正常模式下长按power键,在弹出power off中长按OK键,在弹出的"Reboot to safe mode"框中按确定键,设备重启后即进入安全模式。

 

四、安全模式流程梳理
设备在启动到systemServer后,会在systemServer中进行安全模式的检测:

SystemServer.java

private void startOtherServices() {

        

 final boolean safeMode = wm.detectSafeMode();
1520         if (safeMode) {
1521             traceBeginAndSlog("EnterSafeModeAndDisableJitCompilation");
1522             mActivityManagerService.enterSafeMode();
1523             // Disable the JIT for the system_server process
1524             VMRuntime.getRuntime().disableJitCompilation();
1525             traceEnd();
1526         } else {
1527             // Enable the JIT for the system_server process
1528             traceBeginAndSlog("StartJitCompilation");
1529             VMRuntime.getRuntime().startJitCompilation();
1530             traceEnd();
1531         }

}

这里system server分两个步骤进行:检测安全模式detectSafeMode()和进入安全模式enterSafeMode()。

这里只看检测部分:

WindowManagerService.java

public boolean detectSafeMode() {
4661         if (!mInputMonitor.waitForInputDevicesReady(
4662                 INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS)) {
4663             Slog.w(TAG_WM, "Devices still not ready after waiting "
4664                    + INPUT_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILLIS
4665                    + " milliseconds before attempting to detect safe mode.");
4666         }
      //public static final String SAFE_BOOT_DISALLOWED = "safe_boot_disallowed";
4667 
4668         if (Settings.Global.getInt(
4669                 mContext.getContentResolver(), Settings.Global.SAFE_BOOT_DISALLOWED, 0) != 0) {
4670             return false;
4671         }
4672         //菜单键
4673         int menuState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY,
4674                 KeyEvent.KEYCODE_MENU);
             //s键sState
4675         int sState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY, KeyEvent.KEYCODE_S);
             //dpad中间键dpadState
4676         int dpadState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_DPAD,
4677                 KeyEvent.KEYCODE_DPAD_CENTER);
             //轨迹球trackballState
4678         int trackballState = mInputManager.getScanCodeState(-1, InputDevice.SOURCE_TRACKBALL,
4679                 InputManagerService.BTN_MOUSE);
             //音量减键volumeDownState
4680         int volumeDownState = mInputManager.getKeyCodeState(-1, InputDevice.SOURCE_ANY,
4681                 KeyEvent.KEYCODE_VOLUME_DOWN);
4682         mSafeMode = menuState > 0 || sState > 0 || dpadState > 0 || trackballState > 0
4683                 || volumeDownState > 0;
4684         try {
         //public static final String REBOOT_SAFEMODE_PROPERTY = "persist.sys.safemode";
         //public static final String RO_SAFEMODE_PROPERTY = "ro.sys.safemode";
4685             if (SystemProperties.getInt(ShutdownThread.REBOOT_SAFEMODE_PROPERTY, 0) != 0
4686                     || SystemProperties.getInt(ShutdownThread.RO_SAFEMODE_PROPERTY, 0) != 0) {
4687                 mSafeMode = true;
4688                 SystemProperties.set(ShutdownThread.REBOOT_SAFEMODE_PROPERTY, "");
4689             }
4690         } catch (IllegalArgumentException e) {
4691         }
4692         if (mSafeMode) {
4693             Log.i(TAG_WM, "SAFE MODE ENABLED (menu=" + menuState + " s=" + sState
4694                     + " dpad=" + dpadState + " trackball=" + trackballState + ")");
4695             SystemProperties.set(ShutdownThread.RO_SAFEMODE_PROPERTY, "1");
4696         } else {
4697             Log.i(TAG_WM, "SAFE MODE not enabled");
4698         }
4699         mPolicy.setSafeMode(mSafeMode);
4700         return mSafeMode;
4701     }

通过分析上述代码可知,系统在这里对5个键值进行了扫描:菜单键menuState、s键sState、dpad中间键dpadState、轨迹球trackballState以及音量减键volumeDownState。其中有一个被检测到,则会将安全模式唯一的全局变量标识SafeMode设为true。往下看,在try阶段,系统会获取ShutdownThread.REBOOT_SAFEMODE_PROPERTY prop项的值,如果该值存在,则也将mSafeMode设为true。这里也许会比较奇怪,为何通过按键值设置完mSafeMode后还需要检测下REBOOT_SAFEMODE_PROPERTY prop项?其实这里是为了系统在正常模式下重启后进入安全模式准备的。系统通过正常模式进入到安全模式前,会将REBOOT_SAFEMODE_PROPERTY prop项的值设为1,这里既是上述5个按键没有一个按下也可以进安全模式。具体代码位置如下:

ShutdownThread.java

public void run() {

...

        /*

* If we are rebooting into safe mode, write a system property

* indicating so.

*/

if (mRebootSafeMode) {

SystemProperties.set(REBOOT_SAFEMODE_PROPERTY, "1");

}

...

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值