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
This commit is contained in:
Tony Huang
2020-12-09 13:45:58 +08:00
parent 087a5215d2
commit e9d60f87d0
2 changed files with 10 additions and 6 deletions

View File

@@ -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()));

View File

@@ -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);
}
}