From e9d60f87d0d06cb89653720025937450091ea9ec Mon Sep 17 00:00:00 2001 From: Tony Huang Date: Wed, 9 Dec 2020 13:45:58 +0800 Subject: [PATCH] Fix some exception occrued possible code 1. When removeTask, task surface might be null so check null before call migrateToNewSurfaceControl. Refactor code in dispose too. 2. onTaskInfoChanged callback might before onTaskAppeared or after onTaskVanished in race condition then cause crash. Avoid it by check TaskAppearedInfo is null or not in the list. This is temp workaround and it should finally fixed in TaskOrganizerController side. Bug: 161803994 Bug: 174482124 Test: check app lunch, split screen, pip Test: atest WMShellUnitTests Test: atest WmTests:WindowOrganizerTests Change-Id: Iec5ec516ed71589832366c2b61e91c8804139f6e --- .../src/com/android/wm/shell/ShellTaskOrganizer.java | 9 ++++++--- .../com/android/server/wm/TaskOrganizerController.java | 7 ++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java index 174c16afc75fd..e68a7471fdaf2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java @@ -31,14 +31,12 @@ import android.os.Binder; import android.os.IBinder; import android.util.ArrayMap; import android.util.Log; -import android.util.Slog; import android.util.SparseArray; import android.view.SurfaceControl; import android.window.ITaskOrganizerController; import android.window.TaskAppearedInfo; import android.window.TaskOrganizer; -import androidx.annotation.BinderThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -47,7 +45,6 @@ import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TransactionPool; -import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.startingsurface.StartingSurfaceDrawer; import java.io.PrintWriter; @@ -275,6 +272,12 @@ public class ShellTaskOrganizer extends TaskOrganizer { synchronized (mLock) { ProtoLog.v(WM_SHELL_TASK_ORG, "Task info changed taskId=%d", taskInfo.taskId); final TaskAppearedInfo data = mTasks.get(taskInfo.taskId); + if (data == null) { + // TODO(b/171749427): It means onTaskInfoChanged send before onTaskAppeared or + // after onTaskVanished, it should be fixed in controller side. + return; + } + final TaskListener oldListener = getTaskListener(data.getTaskInfo()); final TaskListener newListener = getTaskListener(taskInfo); mTasks.put(taskInfo.taskId, new TaskAppearedInfo(taskInfo, data.getLeash())); diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index e635219bc6e53..2095d1925e4b7 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -272,7 +272,9 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { void removeTask(Task t) { if (t.mTaskAppearedSent) { - t.migrateToNewSurfaceControl(); + if (t.getSurfaceControl() != null) { + t.migrateToNewSurfaceControl(); + } t.mTaskAppearedSent = false; mOrganizer.onTaskVanished(t); } @@ -288,8 +290,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { // possible. while (!mOrganizedTasks.isEmpty()) { final Task t = mOrganizedTasks.get(0); - t.updateTaskOrganizerState(true /* forceUpdate */); - if (mOrganizedTasks.contains(t)) { + if (!t.updateTaskOrganizerState(true /* forceUpdate */)) { removeTask(t); } }