Android安全模式

Android安全模式,第1张

概述设备在日常使用过程中,不可避免的会添加安装第三方应用。但并不是每一个应用都是安全的,对系统无伤害的。由于第三方应用程序,可能会存在一定的兼容性问题,所以在安装软件后可能会出现系统文件报错,甚至手机无法正常开机或者开机后系统程序不停报错的现象。遇到这种情况,若进行恢复

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

流程:

设备在启动到systemServer后,会在systemServer中进行安全模式的检测:

\frameworks\base\services\java\com\androID\server\SystemServer.java
SystemServer.java

private voID startOtherServices() {

    // Before things start rolling, be sure we have decIDed whether
    // we are in safe mode.

    final boolean safeMode = wm.detectSafeMode();

    if (safeMode) {

        mActivityManagerService.enterSafeMode();

        // disable the JIT for the system_server process

        vmruntime.getRuntime().disableJitCompilation();

    } else {

        // Enable the JIT for the system_server process

        vmruntime.getRuntime().startJitCompilation();

    }

}

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

这里只看检测部分:

\frameworks\base\services\core\java\com\androID\server\wm\WindowManagerService.java
WindowManagerService.java

public boolean detectSafeMode() {

    if (!minputMonitor.waitForinputDevicesReady(

    input_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILliS)) {

    Slog.w(TAG, "Devices still not ready after waiting "

    + input_DEVICES_READY_FOR_SAFE_MODE_DETECTION_TIMEOUT_MILliS

    + " milliseconds before attempting to detect safe mode.");

    }

 

    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) {

            mSafeMode = true;

            SystemPropertIEs.set(ShutdownThread.REBOOT_SAFEMODE_PROPERTY, "");

        }

    } catch (IllegalArgumentException e) {

    }

    if (mSafeMode) {

        Log.i(TAG, "SAFE MODE ENABLED (menu=" + menuState + " s=" + sstate

        + " dpad=" + dpadState + " trackball=" + trackballState + ")");

    } else {

        Log.i(TAG, "SAFE MODE not enabled");

    }

    mPolicy.setSafeMode(mSafeMode);

    return mSafeMode;

}

通过分析上述代码可知,系统在这里对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");

    }

}

总结

以上是内存溢出为你收集整理的Android安全模式全部内容,希望文章能够帮你解决Android安全模式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1105080.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存