From f7b8d687bf6cc3d0109b9003631851c5698fdafa Mon Sep 17 00:00:00 2001 From: Rambo Wang Date: Fri, 16 Jun 2023 02:16:08 +0000 Subject: [PATCH] Fix Settings app ANR due to blocking IDumpstateDevice IPC call This CL fixes the ANR by moving possible blocking IDumpstateDevice IPC call from main thread to background thread. Settings develop options depends on IDumpstateDevice IPC call to set and get Vendor Verbose Logging feature. The IPC may occasionally get blocked in system_server which is extremely busy (e.g. during bugreport generating). This may cause Settings app crashing with ANR. Bug: 287126040 Bug: 280015761 Test: atest EnableVerboseVendorLoggingPreferenceControllerTest Test: Verbose Vendor Logging regression Test: Stress test (heavily trigger on/off during BR generating) Change-Id: I0b88ef089097930b62dcb1cb7d6fe9990356ab5d --- ...boseVendorLoggingPreferenceController.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceController.java b/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceController.java index 051cede54b5..f13143dfdce 100644 --- a/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceController.java +++ b/src/com/android/settings/development/EnableVerboseVendorLoggingPreferenceController.java @@ -29,6 +29,7 @@ import androidx.preference.SwitchPreference; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.development.DeveloperOptionsPreferenceController; +import com.android.settingslib.utils.ThreadUtils; import java.util.NoSuchElementException; @@ -66,23 +67,34 @@ public class EnableVerboseVendorLoggingPreferenceController return isIDumpstateDeviceAidlServiceAvailable() || isIDumpstateDeviceV1_1ServiceAvailable(); } + @SuppressWarnings("FutureReturnValueIgnored") @Override public boolean onPreferenceChange(Preference preference, Object newValue) { final boolean isEnabled = (Boolean) newValue; - setVerboseLoggingEnabled(isEnabled); + // IDumpstateDevice IPC may be blocking when system is extremely heavily-loaded. + // Post to background thread to avoid ANR. Ignore the returned Future. + ThreadUtils.postOnBackgroundThread(() -> + setVerboseLoggingEnabled(isEnabled)); return true; } + @SuppressWarnings("FutureReturnValueIgnored") @Override public void updateState(Preference preference) { - final boolean enabled = getVerboseLoggingEnabled(); - ((SwitchPreference) mPreference).setChecked(enabled); + ThreadUtils.postOnBackgroundThread(() -> { + final boolean enabled = getVerboseLoggingEnabled(); + ThreadUtils.getUiThreadHandler().post(() -> + ((SwitchPreference) mPreference).setChecked(enabled)); + } + ); } + @SuppressWarnings("FutureReturnValueIgnored") @Override protected void onDeveloperOptionsSwitchDisabled() { super.onDeveloperOptionsSwitchDisabled(); - setVerboseLoggingEnabled(false); + ThreadUtils.postOnBackgroundThread(() -> + setVerboseLoggingEnabled(false)); ((SwitchPreference) mPreference).setChecked(false); }