Android 屏蔽某应用的ANR弹窗
Android 屏蔽某应用的ANR弹窗
frameworks/base/services/core/java/com/android/server/am/ErrorDialogController.java
已屏蔽"com.google.android.apps.wellbeing"应用的ANR弹窗为例:
@GuardedBy("mProcLock")
void showAnrDialogs(AppNotRespondingDialog.Data data) {
List<Context> contexts = getDisplayContexts(
mApp.mErrorState.isSilentAnr() /* lastUsedOnly */);
mAnrDialogs = new ArrayList<>();
for (int i = contexts.size() - 1; i >= 0; i--) {
final Context c = contexts.get(i);
mAnrDialogs.add(new AppNotRespondingDialog(mService, c, data));
}
scheduleForAllDialogs(mAnrDialogs, Dialog::show);
}
修改为:
@GuardedBy("mProcLock")
void showAnrDialogs(AppNotRespondingDialog.Data data) {
Slog.w("TAG", "swallow a anr dialog, occur in app:" + data.proc.info.processName + ".");
if (!"com.google.android.apps.wellbeing".equals(data.proc.info.processName)) {
List<Context> contexts = getDisplayContexts(
mApp.mErrorState.isSilentAnr() /* lastUsedOnly */);
mAnrDialogs = new ArrayList<>();
for (int i = contexts.size() - 1; i >= 0; i--) {
final Context c = contexts.get(i);
mAnrDialogs.add(new AppNotRespondingDialog(mService, c, data));
}
scheduleForAllDialogs(mAnrDialogs, Dialog::show);
} else {
ProcessRecord app = data.proc;
final ProcessErrorStateRecord errState = app.mErrorState;
errState.setNotResponding(false);
errState.getDialogController().clearAnrDialogs();
}
}