android安全模式

来源:互联网 发布:简单便宜的手表知乎 编辑:程序博客网 时间:2024/05/09 11:41
Android 
安全模式的分析
手机安装第三方软件后,有一定的概率出现软件与系统不兼容的情况,例如,系统文件操作,手机无法正常开机或开机或系统程序不停报错的现象.遇到此类现象,可重启,使手机进入安全模式.
手机在安全模式下,系统仅会加载维持系统基本功能运行的部分程序不会启动第三方的软件,同时可以通过此方法测试手机基本功能是否正常使用,且删除最近安装的第三方软件来排除某些不兼容的情况.
安全模式的特点
(1)任何第三方应用程序都不会自动启动,只有系统应用程序可以执行
(2)手机左下角会出现"安全模式"字样
(3)在安全模式下,用户可以接触安装有问题的应用程序
(4)安全模式下不会损坏任何应用程序和个人数据
 
进入安全模式的条件
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 
2254     public boolean detectSafeMode() {  
2255         try {  
2256             int menuState = mWindowManager.getKeycodeState(KeyEvent.KEYCODE_MENU);  
2257             int sState = mWindowManager.getKeycodeState(KeyEvent.KEYCODE_S);  
2258             int dpadState =  mWindowManager.getDPadKeycodeState(KeyEvent.KEYCODE_DPAD_CENTER);  
2259             int trackballState = mWindowManager.getTrackballScancodeState(BTN_MOUSE);  
2260             mSafeMode = menuState > 0 || sState > 0 || dpadState > 0 || trackballState > 0;  
2261             performHapticFeedbackLw(null, mSafeMode  
2262                     ? HapticFeedbackConstants.SAFE_MODE_ENABLED  
2263                     : HapticFeedbackConstants.SAFE_MODE_DISABLED, true);  
2264             if (mSafeMode) {  
2265                 Log.i(TAG, "SAFE MODE ENABLED (menu=" + menuState + " s=" + sState  
2266                         + " dpad=" + dpadState + " trackball=" + trackballState + ")");  
2267             } else {  
2268                 Log.i(TAG, "SAFE MODE not enabled");  
2269             }  
2270             return mSafeMode;  
2271         } catch (RemoteException e) {   
2272             // Doom! (it's also local)      
2273             throw new RuntimeException("window manager dead");  
2274         }  
2275     }  
menu键,全键盘的s键,DPAD_CENTER,轨迹球按键。
 
SystemServer 会在启动过程中,启动所有服务,然后检测是否是安全模式,如果是则通知
ActivityManagerService进入安全模式,ActivityManagerService又通知PackageManagerService进入安全模式,然后在左下角显示一个“安全模式”的文字。PackageManagerService进入安全模式,仅仅是设置了mSafeMode这个局部变量。
 
安全模式对PackageManagerService的影响:
在获得Persistent应用的时候如果是安全模式,则只返回SystemApp。
在解析ContentProvider的时候,如果是安全模式,只有制定的provider是系统自带的才能解析。
总的来说,如果PackageManagerService处于安全模式下,只有ApplicationInfo.FLAG_SYSTEM的组件才会返回。
设置了persistent标志的应用会在ActivityManagerService执行systemReady的时候,由AM来启动。
 
如果进入了安全模式,即使设置类persistent标志的第三方应用也不会启动。
 
launcher
在加载桌面的时候,会通过AMS来获得判断是否是SafeMode。
 
安全模式对广播的影响,AMS最终会通过PM来获得广播的接收着,
AppGlobals.getPackageManager().queryIntentReceivers 
mReceivers.queryIntent()  mReceivers的类型是
ActivityIntentResolver  这个类在解析
receivers的最后,会调用
newResult,这个函数会判断安全模式下,如果不是系统的应用,会排除在外。
 
总结: 
安全模式下,所有的第三方应用服务,不会自动运行,也不会收到广播。如果明确指定第三方的component 
name 还是可以运行的。
0 0
原创粉丝点击