需求
屏蔽系统的crash和anr弹窗
原理
在frameworks/base/services/core/java/com/android/server/am/AppErrors.java的handleShowAppErrorUi方法中做是否屏蔽判断mSystemConfiguration.hideCrashWindow() , 以及ActivityTaskManagerService.java的mShowDialogs属性
实现
frameworks/base/services/core/java/com/android/server/am/AppErrors.java
void handleShowAppErrorUi(Message msg) {
AppErrorDialog.Data data = (AppErrorDialog.Data) msg.obj;.......
if ((mService.mAtmInternal.canShowErrorDialogs() || showBackground)
&& !crashSilenced && !shouldThottle
&& (showFirstCrash || showFirstCrashDevOption || data.repeating)
&& !mSystemConfiguration.hideCrashWindow()) {
Slog.i(TAG, "Showing crash dialog for package " + packageName + " u" + userId);
errState.getDialogController().showCrashDialogs(data);
if (!proc.isolated) {
mProcessCrashShowDialogTimes.put(proc.processName, proc.uid, now);
}
} else {
// The device is asleep, so just pretend that the user
// saw a crash dialog and hit "force quit".
if (res != null) {
res.set(AppErrorDialog.CANT_SHOW);
}
}
}
}}
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
private final class SettingObserver extends ContentObserver {
private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE);
private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS);
mWindowOrganizerController.mTaskFragmentOrganizerController;
mBackNavigationController = BackNavigationController.isEnabled()
? new BackNavigationController() : null;
mSystemConfiguration = SystemConfiguration.getInstance(mContext);
if (mSystemConfiguration.hideCrashWindow()){
mShowDialogs = false;
}
}ss
ss
private void updateShouldShowDialogsLocked(Configuration config) {
........
mShowDialogs = inputMethodExists&&ActivityTaskManager.currentUiModeSupportsErrorDialogs(config) && !hideDialogsSet&& !mSystemConfiguration.hideCrashWindow();
}