Loading services/core/java/com/android/server/wm/ActivityTaskManagerService.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -6218,7 +6218,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { public void onProcessRemoved(String name, int uid) { public void onProcessRemoved(String name, int uid) { synchronized (mGlobalLockWithoutBoost) { synchronized (mGlobalLockWithoutBoost) { final WindowProcessController proc = mProcessNames.remove(name, uid); final WindowProcessController proc = mProcessNames.remove(name, uid); if (proc != null && !mStartingProcessActivities.isEmpty()) { if (proc != null && !proc.mHasEverAttached && !mStartingProcessActivities.isEmpty()) { // Use a copy in case finishIfPossible changes the list indirectly. // Use a copy in case finishIfPossible changes the list indirectly. final ArrayList<ActivityRecord> activities = final ArrayList<ActivityRecord> activities = new ArrayList<>(mStartingProcessActivities); new ArrayList<>(mStartingProcessActivities); Loading services/core/java/com/android/server/wm/RootWindowContainer.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -1841,6 +1841,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } } boolean attachApplication(WindowProcessController app) throws RemoteException { boolean attachApplication(WindowProcessController app) throws RemoteException { app.mHasEverAttached = true; final ArrayList<ActivityRecord> activities = mService.mStartingProcessActivities; final ArrayList<ActivityRecord> activities = mService.mStartingProcessActivities; RemoteException remoteException = null; RemoteException remoteException = null; boolean hasActivityStarted = false; boolean hasActivityStarted = false; Loading services/core/java/com/android/server/wm/WindowProcessController.java +3 −0 Original line number Original line Diff line number Diff line Loading @@ -204,6 +204,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio // Set to true when process was launched with a wrapper attached // Set to true when process was launched with a wrapper attached private volatile boolean mUsingWrapper; private volatile boolean mUsingWrapper; /** Whether this process has ever completed ActivityThread#handleBindApplication. */ boolean mHasEverAttached; /** Non-null if this process may have a window. */ /** Non-null if this process may have a window. */ @Nullable @Nullable Session mWindowSession; Session mWindowSession; Loading services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +10 −0 Original line number Original line Diff line number Diff line Loading @@ -331,6 +331,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final WindowProcessController proc = mSystemServicesTestRule.addProcess( final WindowProcessController proc = mSystemServicesTestRule.addProcess( activity.packageName, activity.processName, activity.packageName, activity.processName, 6789 /* pid */, activity.info.applicationInfo.uid); 6789 /* pid */, activity.info.applicationInfo.uid); assertFalse(proc.mHasEverAttached); try { try { mRootWindowContainer.attachApplication(proc); mRootWindowContainer.attachApplication(proc); verify(mSupervisor).realStartActivityLocked(eq(topActivity), eq(proc), verify(mSupervisor).realStartActivityLocked(eq(topActivity), eq(proc), Loading @@ -338,6 +339,15 @@ public class RootWindowContainerTests extends WindowTestsBase { } catch (RemoteException e) { } catch (RemoteException e) { e.rethrowAsRuntimeException(); e.rethrowAsRuntimeException(); } } // Verify that onProcessRemoved won't clear the launching activities if an attached process // is died. Because in real case, it should be handled from WindowProcessController's // and ActivityRecord's handleAppDied to decide whether to remove the activities. assertTrue(proc.mHasEverAttached); assertTrue(mAtm.mStartingProcessActivities.isEmpty()); mAtm.mStartingProcessActivities.add(activity); mAtm.mInternal.onProcessRemoved(proc.mName, proc.mUid); assertFalse(mAtm.mStartingProcessActivities.isEmpty()); } } /** /** Loading Loading
services/core/java/com/android/server/wm/ActivityTaskManagerService.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -6218,7 +6218,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { public void onProcessRemoved(String name, int uid) { public void onProcessRemoved(String name, int uid) { synchronized (mGlobalLockWithoutBoost) { synchronized (mGlobalLockWithoutBoost) { final WindowProcessController proc = mProcessNames.remove(name, uid); final WindowProcessController proc = mProcessNames.remove(name, uid); if (proc != null && !mStartingProcessActivities.isEmpty()) { if (proc != null && !proc.mHasEverAttached && !mStartingProcessActivities.isEmpty()) { // Use a copy in case finishIfPossible changes the list indirectly. // Use a copy in case finishIfPossible changes the list indirectly. final ArrayList<ActivityRecord> activities = final ArrayList<ActivityRecord> activities = new ArrayList<>(mStartingProcessActivities); new ArrayList<>(mStartingProcessActivities); Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +1 −0 Original line number Original line Diff line number Diff line Loading @@ -1841,6 +1841,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } } boolean attachApplication(WindowProcessController app) throws RemoteException { boolean attachApplication(WindowProcessController app) throws RemoteException { app.mHasEverAttached = true; final ArrayList<ActivityRecord> activities = mService.mStartingProcessActivities; final ArrayList<ActivityRecord> activities = mService.mStartingProcessActivities; RemoteException remoteException = null; RemoteException remoteException = null; boolean hasActivityStarted = false; boolean hasActivityStarted = false; Loading
services/core/java/com/android/server/wm/WindowProcessController.java +3 −0 Original line number Original line Diff line number Diff line Loading @@ -204,6 +204,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio // Set to true when process was launched with a wrapper attached // Set to true when process was launched with a wrapper attached private volatile boolean mUsingWrapper; private volatile boolean mUsingWrapper; /** Whether this process has ever completed ActivityThread#handleBindApplication. */ boolean mHasEverAttached; /** Non-null if this process may have a window. */ /** Non-null if this process may have a window. */ @Nullable @Nullable Session mWindowSession; Session mWindowSession; Loading
services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +10 −0 Original line number Original line Diff line number Diff line Loading @@ -331,6 +331,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final WindowProcessController proc = mSystemServicesTestRule.addProcess( final WindowProcessController proc = mSystemServicesTestRule.addProcess( activity.packageName, activity.processName, activity.packageName, activity.processName, 6789 /* pid */, activity.info.applicationInfo.uid); 6789 /* pid */, activity.info.applicationInfo.uid); assertFalse(proc.mHasEverAttached); try { try { mRootWindowContainer.attachApplication(proc); mRootWindowContainer.attachApplication(proc); verify(mSupervisor).realStartActivityLocked(eq(topActivity), eq(proc), verify(mSupervisor).realStartActivityLocked(eq(topActivity), eq(proc), Loading @@ -338,6 +339,15 @@ public class RootWindowContainerTests extends WindowTestsBase { } catch (RemoteException e) { } catch (RemoteException e) { e.rethrowAsRuntimeException(); e.rethrowAsRuntimeException(); } } // Verify that onProcessRemoved won't clear the launching activities if an attached process // is died. Because in real case, it should be handled from WindowProcessController's // and ActivityRecord's handleAppDied to decide whether to remove the activities. assertTrue(proc.mHasEverAttached); assertTrue(mAtm.mStartingProcessActivities.isEmpty()); mAtm.mStartingProcessActivities.add(activity); mAtm.mInternal.onProcessRemoved(proc.mName, proc.mUid); assertFalse(mAtm.mStartingProcessActivities.isEmpty()); } } /** /** Loading