Loading services/core/java/com/android/server/wm/ActivityStarter.java +44 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.HeavyWeightSwitcherActivity; import com.android.internal.app.IVoiceInteractor; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.FrameworkStatsLog; import com.android.server.am.PendingIntentRecord; import com.android.server.pm.InstantAppResolver; import com.android.server.power.ShutdownCheckPoints; Loading Loading @@ -2095,6 +2096,49 @@ class ActivityStarter { } } // Log activity starts which violate one of the following rules of the // activity security model (ASM): // 1. Only the top activity on a task can start activities on that task // 2. Only the top activity on the top task can create new (top) tasks // We don't currently block, but these checks may later become blocks // TODO(b/236234252): Shift to BackgroundActivityStartController once // class is ready if (mSourceRecord != null) { int callerUid = mSourceRecord.getUid(); ActivityRecord targetTopActivity = targetTask != null ? targetTask.getTopNonFinishingActivity() : null; boolean passesAsmChecks = newTask ? mRootWindowContainer.hasResumedActivity(callerUid) : targetTopActivity != null && targetTopActivity.getUid() == callerUid; if (!passesAsmChecks) { Slog.i(TAG, "Launching r: " + r + " from background: " + mSourceRecord + ". New task: " + newTask); boolean newOrEmptyTask = newTask || (targetTopActivity == null); FrameworkStatsLog.write(FrameworkStatsLog.ACTIVITY_ACTION_BLOCKED, /* caller_uid */ callerUid, /* caller_activity_class_name */ mSourceRecord.info.name, /* target_task_top_activity_uid */ newOrEmptyTask ? -1 : targetTopActivity.getUid(), /* target_task_top_activity_class_name */ newOrEmptyTask ? null : targetTopActivity.info.name, /* target_task_is_different */ newTask || !mSourceRecord.getTask().equals(targetTask), /* target_activity_uid */ r.getUid(), /* target_activity_class_name */ r.info.name, /* target_intent_action */ r.intent.getAction(), /* target_intent_flags */ r.intent.getFlags() ); } } return START_SUCCESS; } Loading services/core/java/com/android/server/wm/RootWindowContainer.java +4 −0 Original line number Diff line number Diff line Loading @@ -1820,6 +1820,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return getItemFromTaskDisplayAreas(TaskDisplayArea::getFocusedActivity); } boolean hasResumedActivity(int uid) { return forAllActivities(ar -> ar.isState(RESUMED) && ar.getUid() == uid); } boolean isTopDisplayFocusedRootTask(Task task) { return task != null && task == getTopDisplayFocusedRootTask(); } Loading Loading
services/core/java/com/android/server/wm/ActivityStarter.java +44 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.HeavyWeightSwitcherActivity; import com.android.internal.app.IVoiceInteractor; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.FrameworkStatsLog; import com.android.server.am.PendingIntentRecord; import com.android.server.pm.InstantAppResolver; import com.android.server.power.ShutdownCheckPoints; Loading Loading @@ -2095,6 +2096,49 @@ class ActivityStarter { } } // Log activity starts which violate one of the following rules of the // activity security model (ASM): // 1. Only the top activity on a task can start activities on that task // 2. Only the top activity on the top task can create new (top) tasks // We don't currently block, but these checks may later become blocks // TODO(b/236234252): Shift to BackgroundActivityStartController once // class is ready if (mSourceRecord != null) { int callerUid = mSourceRecord.getUid(); ActivityRecord targetTopActivity = targetTask != null ? targetTask.getTopNonFinishingActivity() : null; boolean passesAsmChecks = newTask ? mRootWindowContainer.hasResumedActivity(callerUid) : targetTopActivity != null && targetTopActivity.getUid() == callerUid; if (!passesAsmChecks) { Slog.i(TAG, "Launching r: " + r + " from background: " + mSourceRecord + ". New task: " + newTask); boolean newOrEmptyTask = newTask || (targetTopActivity == null); FrameworkStatsLog.write(FrameworkStatsLog.ACTIVITY_ACTION_BLOCKED, /* caller_uid */ callerUid, /* caller_activity_class_name */ mSourceRecord.info.name, /* target_task_top_activity_uid */ newOrEmptyTask ? -1 : targetTopActivity.getUid(), /* target_task_top_activity_class_name */ newOrEmptyTask ? null : targetTopActivity.info.name, /* target_task_is_different */ newTask || !mSourceRecord.getTask().equals(targetTask), /* target_activity_uid */ r.getUid(), /* target_activity_class_name */ r.info.name, /* target_intent_action */ r.intent.getAction(), /* target_intent_flags */ r.intent.getFlags() ); } } return START_SUCCESS; } Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +4 −0 Original line number Diff line number Diff line Loading @@ -1820,6 +1820,10 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return getItemFromTaskDisplayAreas(TaskDisplayArea::getFocusedActivity); } boolean hasResumedActivity(int uid) { return forAllActivities(ar -> ar.isState(RESUMED) && ar.getUid() == uid); } boolean isTopDisplayFocusedRootTask(Task task) { return task != null && task == getTopDisplayFocusedRootTask(); } Loading