Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 03c86424 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Fix NPE when popping ANR dialog for system

The process record of system server is created before
initializing window manager. Then its wm internal is
always null.

Bug: 117877476
Bug: 147912509
Test: Simulate ANR in system server:
      Install a test app that contains a no response receiver
      declared with running in system server.
      Use command "shell am broadcast --receiver-foreground ..."
      to start the receiver and check ANR dialog is popped.

Change-Id: If41370e7e0ef799bbd4055d73e020bd3871df092
parent fb342fcf
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -362,6 +362,7 @@ import com.android.server.wm.ActivityMetricsLaunchObserver;
import com.android.server.wm.ActivityServiceConnectionsHolder;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.ActivityTaskManagerService;
import com.android.server.wm.WindowManagerInternal;
import com.android.server.wm.WindowManagerService;
import com.android.server.wm.WindowProcessController;
@@ -1504,6 +1505,7 @@ public class ActivityManagerService extends IActivityManager.Stub
    @VisibleForTesting
    public WindowManagerService mWindowManager;
    WindowManagerInternal mWmInternal;
    @VisibleForTesting
    public ActivityTaskManagerService mActivityTaskManager;
    @VisibleForTesting
@@ -2084,6 +2086,7 @@ public class ActivityManagerService extends IActivityManager.Stub
    public void setWindowManager(WindowManagerService wm) {
        synchronized (this) {
            mWindowManager = wm;
            mWmInternal = LocalServices.getService(WindowManagerInternal.class);
            mActivityTaskManager.setWindowManager(wm);
        }
    }
+3 −6
Original line number Diff line number Diff line
@@ -62,8 +62,6 @@ import com.android.internal.app.procstats.ProcessStats;
import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.ProcessCpuTracker;
import com.android.internal.os.Zygote;
import com.android.server.LocalServices;
import com.android.server.wm.WindowManagerInternal;
import com.android.server.wm.WindowProcessController;
import com.android.server.wm.WindowProcessListener;

@@ -1793,9 +1791,6 @@ class ProcessRecord implements WindowProcessListener {
        /** current wait for debugger dialog */
        private AppWaitingForDebuggerDialog mWaitDialog;

        private final WindowManagerInternal mWmInternal =
                LocalServices.getService(WindowManagerInternal.class);

        boolean hasCrashDialogs() {
            return mCrashDialogs != null;
        }
@@ -1921,7 +1916,9 @@ class ProcessRecord implements WindowProcessListener {
            }
            // If there is no foreground window display, fallback to last used display.
            if (displayContexts.isEmpty() || lastUsedOnly) {
                displayContexts.add(mWmInternal.getTopFocusedDisplayUiContext());
                displayContexts.add(mService.mWmInternal != null
                        ? mService.mWmInternal.getTopFocusedDisplayUiContext()
                        : mService.mUiContext);
            }
            return displayContexts;
        }