Andorid P ActivityManagerService -Stack结构
Andorid 9.0 ActivityManagerService 中的Stack结构如下.
(1) frameworks/base/server/core/java/com/android/server/am/ActivityManagerService.java
/** Run all ActivityStacks through this */
final ActivityStackSupervisor mStackSupervisor;
public ActivityManagerService(Context systemContext) {
......
mStackSupervisor = createStackSupervisor();
mStackSupervisor.onConfigurationChanged(mTempConfig);
mKeyguardController = mStackSupervisor.getKeyguardController();
mTaskChangeNotificationController =
new TaskChangeNotificationController(this, mStackSupervisor, mHandler);
mRecentTasks = createRecentTasks();
mStackSupervisor.setRecentTasks(mRecentTasks);
mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mHandler);
......
}
protected RecentTasks createRecentTasks() {
return new RecentTasks(this, mStackSupervisor);
}
protected ActivityStackSupervisor createStackSupervisor() {
final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mHandler.getLooper());
supervisor.initialize();
return supervisor;
}
AWS在初始化的时候就会创建一个ActivityStackSupervisor , 在这个ActivityStackSupervisor中会运行所有活动堆栈.
(2) frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
void setWindowManager(WindowManagerService wm) {
synchronized (mService) {
mWindowManager = wm;
getKeyguardController().setWindowManager(wm);
mDisplayManager =
(DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
mDisplayManager.registerDisplayListener(this, null);
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
Display[] displays = mDisplayManager.getDisplays();
for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) {
final Display display = displays[displayNdx];
ActivityDisplay activityDisplay = new ActivityDisplay(this, display);
mActivityDisplays.put(display.getDisplayId(), activityDisplay);
calculateDefaultMinimalSizeOfResizeableTasks(activityDisplay);
}
mHomeStack = mFocusedStack = mLastFocusedStack = getDefaultDisplay().getOrCreateStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
}
}
在ActivityStackSupervisor中会setWindowManager中根据显示设备生成对应的ActivityDisplay,手机只有一个显示屏,所以只生成了一个ActivityDIsplay.
(3)ActivityDisplay中会保存多个ActivityStack并保存在mStacks中,其中有2个比较特殊分别是:
private ActivityStack mHomeStack = null;
private ActivityStack mRecentsStack = null;
这两个在AMS初始化早起就已经生成:
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
void setWindowManager(WindowManagerService wm) {
synchronized (mService) {
.....
mHomeStack = mFocusedStack = mLastFocusedStack = getDefaultDisplay().getOrCreateStack(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);
}
}
void setRecentTasks(RecentTasks recentTasks) {
mRecentTasks = recentTasks;
mRecentTasks.registerCallback(this);
}
而其他的ActivityStack的生成是在
frameworks/base/services/core/java/com/android/server/am/ActivityDisplay.ava
<T extends ActivityStack> T createStack(int windowingMode, int activityType, boolean onTop) {
if (activityType == ACTIVITY_TYPE_UNDEFINED) {
// Can't have an undefined stack type yet...so re-map to standard. Anyone that wants
// anything else should be passing it in anyways...
activityType = ACTIVITY_TYPE_STANDARD;
}
if (activityType != ACTIVITY_TYPE_STANDARD) {
// For now there can be only one stack of a particular non-standard activity type on a
// display. So, get that ignoring whatever windowing mode it is currently in.
T stack = getStack(WINDOWING_MODE_UNDEFINED, activityType);
if (stack != null) {
throw new IllegalArgumentException("Stack=" + stack + " of activityType="
+ activityType + " already on display=" + this + ". Can't have multiple.");
}
}
final ActivityManagerService service = mSupervisor.mService;
if (!isWindowingModeSupported(windowingMode, service.mSupportsMultiWindow,
service.mSupportsSplitScreenMultiWindow, service.mSupportsFreeformWindowManagement,
service.mSupportsPictureInPicture, activityType)) {
throw new IllegalArgumentException("Can't create stack for unsupported windowingMode="
+ windowingMode);
}
if (windowingMode == WINDOWING_MODE_UNDEFINED) {
// TODO: Should be okay to have stacks with with undefined windowing mode long term, but
// have to set them to something for now due to logic that depending on them.
windowingMode = getWindowingMode(); // Put in current display's windowing mode
if (windowingMode == WINDOWING_MODE_UNDEFINED) {
// Else fullscreen for now...
windowingMode = WINDOWING_MODE_FULLSCREEN;
}
}
final int stackId = getNextStackId();
return createStackUnchecked(windowingMode, activityType, stackId, onTop);
}
@VisibleForTesting
<T extends ActivityStack> T createStackUnchecked(int windowingMode, int activityType,
int stackId, boolean onTop) {
if (windowingMode == WINDOWING_MODE_PINNED) {
return (T) new PinnedActivityStack(this, stackId, mSupervisor, onTop);
}
return (T) new ActivityStack(
this, stackId, mSupervisor, windowingMode, activityType, onTop);
}
(4)frameworks/base/services/core/java/com/android/server/am/ActivityStack.java
TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
boolean toTop, ActivityRecord activity, ActivityRecord source,
ActivityOptions options) {
final TaskRecord task = TaskRecord.create(
mService, taskId, info, intent, voiceSession, voiceInteractor);
// add the task to stack first, mTaskPositioner might need the stack association
addTask(task, toTop, "createTaskRecord");
final int displayId = mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY;
final boolean isLockscreenShown = mService.mStackSupervisor.getKeyguardController()
.isKeyguardOrAodShowing(displayId);
if (!mStackSupervisor.getLaunchParamsController()
.layoutTask(task, info.windowLayout, activity, source, options)
&& !matchParentBounds() && task.isResizeable() && !isLockscreenShown) {
task.updateOverrideConfiguration(getOverrideBounds());
}
task.createWindowContainer(toTop, (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0);
return task;
}
生成TaskRecord是调用了TaskRecord的静态函数create,而create设计通过静态内部类TaskRecordFactory生成TaskRecord,从TaskRecordFactory的注释可以明白当系统启动时,TaskRecordFactory就会生成,而TaskRecordFactory是一个单例class.
frameworks/base/services/core/java/com/android/server/am/TaskRecord.java
/**
* The factory used to create {@link TaskRecord}. This allows OEM subclass {@link TaskRecord}.
*/
private static TaskRecordFactory sTaskRecordFactory;
@VisibleForTesting
static TaskRecordFactory getTaskRecordFactory() {
if (sTaskRecordFactory == null) {
setTaskRecordFactory(new TaskRecordFactory());
}
return sTaskRecordFactory;
}
static void setTaskRecordFactory(TaskRecordFactory factory) {
sTaskRecordFactory = factory;
}
static TaskRecord create(ActivityManagerService service, int taskId, ActivityInfo info,
Intent intent, TaskDescription taskDescription) {
return getTaskRecordFactory().create(service, taskId, info, intent, taskDescription);
}
/**
* A factory class used to create {@link TaskRecord} or its subclass if any. This can be
* specified when system boots by setting it with
* {@link #setTaskRecordFactory(TaskRecordFactory)}.
*/
static class TaskRecordFactory {
}
(5)frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java
ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(),
resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null,
mSupervisor, checkedOptions, sourceRecord);