Loading core/java/android/window/flags/windowing_sdk.aconfig +11 −0 Original line number Diff line number Diff line Loading @@ -184,3 +184,14 @@ flag { bug: "400351723" is_fixed_read_only: true } flag { namespace: "windowing_sdk" name: "dispose_task_fragment_synchronously" description: "Handle TaskFragment disposal synchronously when handling app died." bug: "429336735" is_fixed_read_only: true metadata { purpose: PURPOSE_BUGFIX } } No newline at end of file services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java +41 −14 Original line number Diff line number Diff line Loading @@ -181,6 +181,13 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr private final ArrayMap<IBinder, Transition.ReadyCondition> mInFlightTransactions = new ArrayMap<>(); /** Listener for process death event. */ private final WindowProcessController.Listener mProcessListener = () -> { synchronized (mGlobalLock) { handleAppDied(); } }; TaskFragmentOrganizerState(@NonNull ITaskFragmentOrganizer organizer, int pid, int uid, boolean isSystemOrganizer) { mAppThread = getAppThread(pid, uid); Loading @@ -188,22 +195,23 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr mOrganizerPid = pid; mOrganizerUid = uid; mIsSystemOrganizer = isSystemOrganizer; try { mOrganizer.asBinder().linkToDeath(this, 0 /*flags*/); } catch (RemoteException e) { Slog.e(TAG, "TaskFragmentOrganizer failed to register death recipient"); } registerProcessDiedHandler(pid); } @Override public void binderDied() { synchronized (mGlobalLock) { handleAppDied(); } } private void handleAppDied() { // TODO(b/419688177): remove the debug log ProtoLog.d(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "TaskFragmentOrganizer=%s died", mOrganizer); removeOrganizer(mOrganizer, "client died"); } } void restore(@NonNull ITaskFragmentOrganizer organizer, int pid) { mOrganizer = organizer; Loading @@ -218,12 +226,23 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr mOrganizedTaskFragments.remove(taskFragment); } } registerProcessDiedHandler(pid); } private void registerProcessDiedHandler(int pid) { if (com.android.window.flags.Flags.disposeTaskFragmentSynchronously()) { final WindowProcessController wpc = mAtmService.mProcessMap.getProcess(pid); if (wpc != null) { wpc.addListener(mProcessListener); } } else { try { mOrganizer.asBinder().linkToDeath(this, 0 /*flags*/); } catch (RemoteException e) { Slog.e(TAG, "TaskFragmentOrganizer failed to register death recipient"); } } } boolean hasSavedState() { return mSavedState != null && !mSavedState.isEmpty(); Loading Loading @@ -312,8 +331,16 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr // Cleanup any in-flight transactions to unblock the transition. mInFlightTransactions.valueAt(i).meetAlternate("disposed(" + reason + ")"); } if (com.android.window.flags.Flags.disposeTaskFragmentSynchronously()) { final WindowProcessController wpc = mAtmService.mProcessMap.getProcess( mOrganizerPid); if (wpc != null) { wpc.removeListener(mProcessListener); } } else { mOrganizer.asBinder().unlinkToDeath(this, 0 /* flags */); } } @NonNull TaskFragmentTransaction.Change prepareTaskFragmentAppeared(@NonNull TaskFragment tf) { Loading services/core/java/com/android/server/wm/WindowProcessController.java +39 −0 Original line number Diff line number Diff line Loading @@ -274,6 +274,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio private volatile boolean mIsActivityConfigOverrideAllowed = true; /** Non-zero to pause dispatching process configuration change. */ private int mPauseConfigurationDispatchCount; /** Listeners to handle the process died event. */ private List<WindowProcessController.Listener> mListeners = null; /** * Activities that hosts some UI drawn by the current process. The activities live Loading Loading @@ -1566,6 +1568,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } clearRecentTasks(); clearActivities(); notifyHandleAppDied(); return hasVisibleActivities; } Loading Loading @@ -2314,4 +2317,40 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio PackageOptimizationInfo getOptimizationInfo() { return mOptimizationInfo; } void addListener(@NonNull WindowProcessController.Listener listener) { if (!com.android.window.flags.Flags.disposeTaskFragmentSynchronously()) { return; } if (mListeners == null) { mListeners = new ArrayList<>(); } mListeners.add(listener); } void removeListener(@NonNull WindowProcessController.Listener listener) { if (mListeners == null) { return; } mListeners.remove(listener); } private void notifyHandleAppDied() { if (mListeners == null) { return; } for (int i = mListeners.size() - 1; i >= 0; --i) { mListeners.get(i).onHandleAppDied(); } mListeners = null; } interface Listener { /** * Called when the process died. */ void onHandleAppDied(); } } Loading
core/java/android/window/flags/windowing_sdk.aconfig +11 −0 Original line number Diff line number Diff line Loading @@ -184,3 +184,14 @@ flag { bug: "400351723" is_fixed_read_only: true } flag { namespace: "windowing_sdk" name: "dispose_task_fragment_synchronously" description: "Handle TaskFragment disposal synchronously when handling app died." bug: "429336735" is_fixed_read_only: true metadata { purpose: PURPOSE_BUGFIX } } No newline at end of file
services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java +41 −14 Original line number Diff line number Diff line Loading @@ -181,6 +181,13 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr private final ArrayMap<IBinder, Transition.ReadyCondition> mInFlightTransactions = new ArrayMap<>(); /** Listener for process death event. */ private final WindowProcessController.Listener mProcessListener = () -> { synchronized (mGlobalLock) { handleAppDied(); } }; TaskFragmentOrganizerState(@NonNull ITaskFragmentOrganizer organizer, int pid, int uid, boolean isSystemOrganizer) { mAppThread = getAppThread(pid, uid); Loading @@ -188,22 +195,23 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr mOrganizerPid = pid; mOrganizerUid = uid; mIsSystemOrganizer = isSystemOrganizer; try { mOrganizer.asBinder().linkToDeath(this, 0 /*flags*/); } catch (RemoteException e) { Slog.e(TAG, "TaskFragmentOrganizer failed to register death recipient"); } registerProcessDiedHandler(pid); } @Override public void binderDied() { synchronized (mGlobalLock) { handleAppDied(); } } private void handleAppDied() { // TODO(b/419688177): remove the debug log ProtoLog.d(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN, "TaskFragmentOrganizer=%s died", mOrganizer); removeOrganizer(mOrganizer, "client died"); } } void restore(@NonNull ITaskFragmentOrganizer organizer, int pid) { mOrganizer = organizer; Loading @@ -218,12 +226,23 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr mOrganizedTaskFragments.remove(taskFragment); } } registerProcessDiedHandler(pid); } private void registerProcessDiedHandler(int pid) { if (com.android.window.flags.Flags.disposeTaskFragmentSynchronously()) { final WindowProcessController wpc = mAtmService.mProcessMap.getProcess(pid); if (wpc != null) { wpc.addListener(mProcessListener); } } else { try { mOrganizer.asBinder().linkToDeath(this, 0 /*flags*/); } catch (RemoteException e) { Slog.e(TAG, "TaskFragmentOrganizer failed to register death recipient"); } } } boolean hasSavedState() { return mSavedState != null && !mSavedState.isEmpty(); Loading Loading @@ -312,8 +331,16 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr // Cleanup any in-flight transactions to unblock the transition. mInFlightTransactions.valueAt(i).meetAlternate("disposed(" + reason + ")"); } if (com.android.window.flags.Flags.disposeTaskFragmentSynchronously()) { final WindowProcessController wpc = mAtmService.mProcessMap.getProcess( mOrganizerPid); if (wpc != null) { wpc.removeListener(mProcessListener); } } else { mOrganizer.asBinder().unlinkToDeath(this, 0 /* flags */); } } @NonNull TaskFragmentTransaction.Change prepareTaskFragmentAppeared(@NonNull TaskFragment tf) { Loading
services/core/java/com/android/server/wm/WindowProcessController.java +39 −0 Original line number Diff line number Diff line Loading @@ -274,6 +274,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio private volatile boolean mIsActivityConfigOverrideAllowed = true; /** Non-zero to pause dispatching process configuration change. */ private int mPauseConfigurationDispatchCount; /** Listeners to handle the process died event. */ private List<WindowProcessController.Listener> mListeners = null; /** * Activities that hosts some UI drawn by the current process. The activities live Loading Loading @@ -1566,6 +1568,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } clearRecentTasks(); clearActivities(); notifyHandleAppDied(); return hasVisibleActivities; } Loading Loading @@ -2314,4 +2317,40 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio PackageOptimizationInfo getOptimizationInfo() { return mOptimizationInfo; } void addListener(@NonNull WindowProcessController.Listener listener) { if (!com.android.window.flags.Flags.disposeTaskFragmentSynchronously()) { return; } if (mListeners == null) { mListeners = new ArrayList<>(); } mListeners.add(listener); } void removeListener(@NonNull WindowProcessController.Listener listener) { if (mListeners == null) { return; } mListeners.remove(listener); } private void notifyHandleAppDied() { if (mListeners == null) { return; } for (int i = mListeners.size() - 1; i >= 0; --i) { mListeners.get(i).onHandleAppDied(); } mListeners = null; } interface Listener { /** * Called when the process died. */ void onHandleAppDied(); } }