Android SafeMode 解析

android系统,通常按住MENU键开机,会安全模式进入系统。安全模式下,所有的第三方应用服务,不会自动运行,也不会收到广播。如果明确指定第三方的component name 还是可以运行的。


2.1代码位置:

frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java

收索SAFE MODE 这个tag会看到相关代码。


现分析如下:

步骤:在开机动画时,按住MENU键(或者字母S键,方向键的中间键,轨迹球按键中的一个)直到开机,会进入安全模式。

得到log如下:

I/WindowManager( 101): SAFE MODE ENABLED (menu=1 s=-1 dpad=-1 trackball=-1)

现象:在机器左小脚显示“安全模式”。

源码

2.3版本:frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

2291 public boolean detectSafeMode() {
2292 try {
2293 int menuState = mWindowManager.getKeycodeState(KeyEvent.KEYCODE_MENU);
2294 int sState = mWindowManager.getKeycodeState(KeyEvent.KEYCODE_S);
2295 int dpadState = mWindowManager.getDPadKeycodeState(KeyEvent.KEYCODE_DPAD_CENTER);
2296 int trackballState = mWindowManager.getTrackballScancodeState(BTN_MOUSE);
2297 mSafeMode = menuState > 0 || sState > 0 || dpadState > 0 || trackballState > 0;
2298 performHapticFeedbackLw(null, mSafeMode
2299 ? HapticFeedbackConstants.SAFE_MODE_ENABLED
2300 : HapticFeedbackConstants.SAFE_MODE_DISABLED, true);
2301 if (mSafeMode) {
2302 Log.i(TAG, "SAFE MODE ENABLED (menu=" + menuState + " s=" + sState
2303 + " dpad=" + dpadState + " trackball=" + trackballState + ")");
2304 } else {
2305 Log.i(TAG, "SAFE MODE not enabled");
2306 }
2307 return mSafeMode;
2308 } catch (RemoteException e) {
2309 // Doom! (it's also local)
2310 throw new RuntimeException("window manager dead");
2311 }
2312 }

要把safe mode禁止掉,把mSafeMode赋值为false即可。

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,这个函数会判断安全模式下,如果不是系统的应用,会排除在外。


按键值参考:

参考:

http://developer.android.com/reference/android/view/KeyEvent.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值