Android AMS 整体架构

ActivityManagerService中常见的类及其作用,包括ActivityRecordProcessRecordTaskRecordActivityStackActivityStackSupervisor

ActivityRecord

Activity History Stack中的一个节点,代表了一个Activity实例在System_Server进程端的驻留对象。startActivity时,在ASS#startActivityLocked方法中通过new ActivityRecord()创建实例对象。

ProcessRecord

应用程序进程对象,表示一个应用程序,对应用程序的所有管理操作都依赖于它,通过ActivityManagerService#startProcessLocked()创建出来,Process.start()实际上是调用ZygoteServerfork出一个新进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// all activities running in the process(所有运行的Activity)
final ArrayList<ActivityRecord> activities = new ArrayList<>();
// all ServiceRecord running in this process
final ArraySet<ServiceRecord> services = new ArraySet<>();
// services that are currently executing code (need to remain foreground).
final ArraySet<ServiceRecord> executingServices = new ArraySet<>();
// All ConnectionRecord this process holds
final ArraySet<ConnectionRecord> connections = new ArraySet<>();
// all IIntentReceivers that are registered from this process.
final ArraySet<ReceiverList> receivers = new ArraySet<>();
// class (String) -> ContentProviderRecord
final ArrayMap<String, ContentProviderRecord> pubProviders = new ArrayMap<>();
// All ContentProviderRecord process is using
final ArrayList<ContentProviderConnection> conProviders = new ArrayList<>();

管理ActivityRecord

  • add: ASS#realStartActivityLocked()方法中,通过app.activities.add(r);将新的ActivityRecord添加到运行的activities列表中。
  • remove: ASK#destroyActivityLocked()方法中,通过r.app.activities.remove(r);ActivityRecordactivities列表中移除。

TaskRecord

通常一个应用程序会包含至少一个TaskRecord对象,用于管理ActivityRecord,如果有Activity在定义时指定了android:taskAffinity,则在启动该Activity时,会创建一个新的TaskRecord。每次退出LaunchActivity之后,再次进入,会重新创建。

1
2
3
4
5
6
7
{
/** List of all activities in the task arranged in history order */
final ArrayList<ActivityRecord> mActivities;
/** Current stack */
ActivityStack stack;
}

TaskRecord创建过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
final int startActivityUncheckedLocked(final ActivityRecord r, ActivityRecord sourceRecord, ...) { // ASS
// LaunchActivity: sourceRecord为空。
if (reuseTask == null) {
r.setTask(targetStack.createTaskRecord(getNextTaskId(),
newTaskInfo != null ? newTaskInfo : r.info,
newTaskIntent != null ? newTaskIntent : intent,
voiceSession, voiceInteractor, !launchTaskBehind /* toTop */),
taskToAffiliate);
}
// ...
// SubActivity: sourceRecord为上一级页面。
if (sourceRecord != null) {
final TaskRecord sourceTask = sourceRecord.task;
if (isLockTaskModeViolation(sourceTask)) {
Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
}
targetStack = sourceTask.stack;
targetStack.moveToFront("sourceStackToFront");
}
// ...
}

Launcher中点击图标启动一个Activity,在ASS#startActivityUncheckedLocked中通过createTaskRecord()中调用new TaskRecord()创建TaskRecord实例。其它二级页面ActivityLaunchActivity共用同一个TaskRecord。

管理ActivityRecord

  • add: ASK#startActivityLocked()->TaskRecord#addActivityToTop(r)->TaskRecord#addActivityAtIndex()ActivityRecord实例添加到mActivities中。
  • remove: ASK#activityDestoryedLocked()->ASK#removeActivityFromHistoryLocked()->TaskRecord#removeActivity()mActivities中移除ActivityRecord

ActivityStack

State and management of a single stack of activities,Activity栈列表,一个应用程序对应一个该对象实例,每次退出LaunchActivity之后,再次进入,会重新创建。

ActivityStack创建过程:startActivityUncheckedLocked()->computeStackFocus()->createStackOnDisplay()->new ActivityStack()

1
2
3
4
5
6
7
{
/**
* The back history of all previous (and possibly still
* running) activities. It contains #TaskRecord objects.
*/
private ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
}

管理TaskRecord

  • add: ASS#startActivityUncheckedLocked()->ASK#createTaskRecord()->ASK#addTask()->ASK#insertTaskAtTop(task)添加TaskRecord。

ASS/AMS: 整个Android系统中只有一个实例对象。