diff options
3 files changed, 43 insertions, 18 deletions
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 085f9afd1b83..3ba90981eeed 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -13143,8 +13143,8 @@ public final class ActivityManagerService extends ActivityManagerNative boolean removed = Intent.ACTION_PACKAGE_REMOVED.equals( intent.getAction()); if (!intent.getBooleanExtra(Intent.EXTRA_DONT_KILL_APP, false)) { - forceStopPackageLocked(ssp, - intent.getIntExtra(Intent.EXTRA_UID, -1), false, true, true, + forceStopPackageLocked(ssp, UserHandle.getAppId( + intent.getIntExtra(Intent.EXTRA_UID, -1)), false, true, true, false, userId, removed ? "pkg removed" : "pkg changed"); } if (removed) { diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 26d9bcf58e67..0397fd566645 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -478,37 +478,45 @@ final class ActivityStack { } final int userId = UserHandle.getUserId(info.applicationInfo.uid); + if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + target + " in " + this); for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { final TaskRecord task = mTaskHistory.get(taskNdx); if (task.userId != userId) { // Looking for a different task. + if (DEBUG_TASKS) Slog.d(TAG, "Skipping " + task + ": different user"); continue; } final ActivityRecord r = task.getTopActivity(); if (r == null || r.finishing || r.userId != userId || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { + if (DEBUG_TASKS) Slog.d(TAG, "Skipping " + task + ": mismatch root " + r); continue; } - //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString() - // + "/aff=" + r.task.affinity + " to new cls=" - // + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity); + if (DEBUG_TASKS) Slog.d(TAG, "Comparing existing cls=" + + r.task.intent.getComponent().flattenToShortString() + + "/aff=" + r.task.affinity + " to new cls=" + + intent.getComponent().flattenToShortString() + "/aff=" + info.taskAffinity); if (task.affinity != null) { if (task.affinity.equals(info.taskAffinity)) { - //Slog.i(TAG, "Found matching affinity!"); + if (DEBUG_TASKS) Slog.d(TAG, "Found matching affinity!"); return r; } } else if (task.intent != null && task.intent.getComponent().equals(cls)) { - //Slog.i(TAG, "Found matching class!"); + if (DEBUG_TASKS) Slog.d(TAG, "Found matching class!"); //dump(); - //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); + if (DEBUG_TASKS) Slog.d(TAG, "For Intent " + intent + " bringing to top: " + + r.intent); return r; } else if (task.affinityIntent != null && task.affinityIntent.getComponent().equals(cls)) { - //Slog.i(TAG, "Found matching class!"); + if (DEBUG_TASKS) Slog.d(TAG, "Found matching class!"); //dump(); - //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent); + if (DEBUG_TASKS) Slog.d(TAG, "For Intent " + intent + " bringing to top: " + + r.intent); return r; + } else if (DEBUG_TASKS) { + Slog.d(TAG, "Not a match: " + task); } } @@ -3575,6 +3583,7 @@ final class ActivityStack { @Override public String toString() { - return "stackId=" + mStackId + " tasks=" + mTaskHistory; + return "ActivityStack{" + Integer.toHexString(System.identityHashCode(this)) + + " stackId=" + mStackId + ", " + mTaskHistory.size() + " tasks}"; } } diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java index 2895552aede5..523015da0f29 100644 --- a/services/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/java/com/android/server/am/ActivityStackSupervisor.java @@ -1377,12 +1377,23 @@ public final class ActivityStackSupervisor { } final ActivityStack sourceStack; - TaskRecord sourceTask; if (sourceRecord != null) { - sourceTask = sourceRecord.task; - sourceStack = sourceTask.stack; + if (sourceRecord.finishing) { + // If the source is finishing, we can't further count it as our source. This + // is because the task it is associated with may now be empty and on its way out, + // so we don't want to blindly throw it in to that task. Instead we will take + // the NEW_TASK flow and try to find a task for it. + if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { + Slog.w(TAG, "startActivity called from finishing " + sourceRecord + + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); + launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; + } + sourceRecord = null; + sourceStack = null; + } else { + sourceStack = sourceRecord.task.stack; + } } else { - sourceTask = null; sourceStack = null; } @@ -1424,6 +1435,8 @@ public final class ActivityStackSupervisor { } targetStack = intentActivity.task.stack; targetStack.mLastPausedActivity = null; + if (DEBUG_TASKS) Slog.d(TAG, "Bring to front target: " + targetStack + + " from " + intentActivity); moveHomeStack(targetStack.isHomeStack()); if (intentActivity.task.intent == null) { // This task was started because of movement of @@ -1663,7 +1676,7 @@ public final class ActivityStackSupervisor { } } } else if (sourceRecord != null) { - sourceTask = sourceRecord.task; + TaskRecord sourceTask = sourceRecord.task; targetStack = sourceTask.stack; moveHomeStack(targetStack.isHomeStack()); if (!addingToTask && @@ -1683,7 +1696,7 @@ public final class ActivityStackSupervisor { targetStack.resumeTopActivityLocked(null); } ActivityOptions.abort(options); - if (r.task == null) Slog.v(TAG, + if (r.task == null) Slog.w(TAG, "startActivityUncheckedLocked: task left null", new RuntimeException("here").fillInStackTrace()); return ActivityManager.START_DELIVERED_TO_TOP; @@ -1712,7 +1725,7 @@ public final class ActivityStackSupervisor { // it. r.setTask(sourceTask, sourceRecord.thumbHolder, false); if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r - + " in existing task " + r.task); + + " in existing task " + r.task + " from source " + sourceRecord); } else { // This not being started from an existing activity, and not part @@ -2060,9 +2073,11 @@ public final class ActivityStackSupervisor { } ActivityRecord findTaskLocked(ActivityRecord r) { + if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + r); for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = mStacks.get(stackNdx); if (!r.isApplicationActivity() && !stack.isHomeStack()) { + if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: " + stack); continue; } final ActivityRecord ar = stack.findTaskLocked(r); @@ -2070,6 +2085,7 @@ public final class ActivityStackSupervisor { return ar; } } + if (DEBUG_TASKS) Slog.d(TAG, "No task found"); return null; } |