1.简述

ActivityManagerService是Android系统中一个特别重要的系统服务,也是我们上层APP打交道最多的系统服务之一。ActivityManagerService(以下简称AMS) 主要负责四大组件的启动、切换、调度以及应 用进程的管理和调度工作。所有的APP应用都需要与AMS打交道。

Activity Manager的组成主要分为以下几个部分:

  • 1.服务代理:由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信
  • 2.服务中枢:ActivityManagerNative继承自Binder并实现IActivityManager,它提供了服务接口和 Binder接口的相互转化功能,并在内部存储服务代理对像,并提供了getDefault方法返回服务代理
  • 3.Client:由ActivityManager封装一部分服务接口供Client调用。ActivityManager内部通过调用 ActivityManagerNative的getDefault方法,可以得到一个ActivityManagerProxy对像的引用,进而通过该代理对像调用远程服务的方法
  • 4.Server:由ActivityManagerService实现,提供Server端的系统服务

2.从不同角度看AMS

2.1 从java角度看

从java角度来看,ams就是一个java对象,实现了Ibinder接口,所以它是一个用于进程之间通信的接口,这个对象初始化是在systemServer.java 的run()方法里面。

1
2
3
4
public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context);
}
2.2 AMS是一个服务

ActivityManagerService从名字就可以看出,它是一个服务,用来管理Activity,而且是一个系统服 务,就是包管理服务,电池管理服务,震动管理服务等。

2.3 AMS是一个Binder

ams实现了Ibinder接口,所以它是一个Binder,这意味着他不但可以用于进程间通信,还是一个 线程,因为一个Binder就是一个线程。

如果我们启动一个hello World安卓用于程序,里面不另外启动其他线程,这个里面最少要启动4个线程:

  • main线程,只是程序的主线程,也是日常用到的最多的线程,也叫UI线程,因为android的组 件是非线程安全的,所以只允许UI/MAIN线程来操作。
  • GC线程,java有垃圾回收机制,每个java程序都有一个专门负责垃圾回收的线程。
  • Binder1 就是我们的ApplicationThread,这个类实现了Ibinder接口,用于进程之间通信,具体来说,就是我们程序和AMS通信的工具
  • Binder2 就是我们的ViewRootImpl.W对象,他也是实现了IBinder接口,就是用于我们的应用程序和 wms通信的工具。

3. AMS的启动过程

AMS是在SystemServer中被添加的, 所以先到SystemServer中查看初始化。详细的SystemServer启动过程可以参考Android系统启动流程分析的第五章节。

1
2
3
public static void main(String[] args) {        
new SystemServer().run();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private void run() {
......

// Initialize the system context.
createSystemContext();

// Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
SystemServerInitThreadPool.get();
} finally {
traceEnd(); // InitBeforeStartServices
}

// Start services.
try {
traceBeginAndSlog("StartServices");
// 启动引导服务中启动AMS
startBootstrapServices();
startCoreServices();
startOtherServices();
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {

// Loop forever.
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private void startBootstrapServices() {
......

// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();

// Power manager needs to be started early because other services need it.
// Native daemons may be watching for it to be registered so it must be ready
// to handle incoming binder calls immediately (including being able to verify
// the permissions for those calls).
traceBeginAndSlog("StartPowerManager");
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
traceEnd();

// Now that the power manager has been started, let the activity manager
// initialize power management features.
traceBeginAndSlog("InitPowerManagement");
// 初始化AMS中的powerManager
mActivityManagerService.initPowerManagement();
traceEnd();

......
// Set up the Application instance for the system process and get started.
traceBeginAndSlog("SetSystemProcess");
//启动系统进程的应用实例
mActivityManagerService.setSystemProcess();
traceEnd();

......
}

AMS是通过SystemServiceManager.startService去启动的,参数是 ActivityManagerService.Lifecycle.class, 首先看看startService方法。

1
2
3
4
5
6
7
8
9
10
11
public SystemService startService(String className) {
//此处的SystemService是生命周期
final Class<SystemService> serviceClass;
try {
serviceClass = (Class<SystemService>)Class.forName(className);
} catch (ClassNotFoundException ex) {
Slog.i(TAG, "Starting " + className);
......
}
return startService(serviceClass);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {
final String name = serviceClass.getName();
Slog.i(TAG, "Starting " + name);
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);

// Create the service.
if (!SystemService.class.isAssignableFrom(serviceClass)) {
throw new RuntimeException("Failed to create " + name
+ ": service must extend " + SystemService.class.getName());
}
final T service;
try {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
......
}

startService(service);
//此service是lifecycle
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void startService(@NonNull final SystemService service) {
// Register it.
//加入到列表中
mServices.add(service);
// Start it.
long time = System.currentTimeMillis();
try {
//lifecycle的onStart()方法
//最终调到ActivityManagerService.start方法
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ ": onStart threw an exception", ex);
}
warnIfTooLong(System.currentTimeMillis() - time, service, "onStart");
}

startService方法很简单,是通过传进来的class然后反射创建对应的service服务。所以此处创建的是 Lifecycle的实例, 然后通过startService启动了AMS服务。

那我们再去看看ActivityManagerService.Lifecycle这个类的构造方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;

public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context);
}

@Override
public void onStart() {
mService.start();
}

public ActivityManagerService getService() {
return mService;
}
}

Lifecycle中单纯的创建AMS对象。接着看AMS构造方法中干了什么。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
public ActivityManagerService(Context systemContext) {
LockGuard.installLock(this, LockGuard.INDEX_ACTIVITY);
mInjector = new Injector();
mContext = systemContext;

mFactoryTest = FactoryTest.getMode();
//获取当前的 ActivityThread,当前在SystemServer中,因此是SystemServer创建context的时候创建的ActivityThread。
mSystemThread = ActivityThread.currentActivityThread();
mUiContext = mSystemThread.getSystemUiContext();

Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());

mPermissionReviewRequired = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_permissionReviewRequired);

// 创建Handler线程,用来处理handler消息
mHandlerThread = new ServiceThread(TAG,
THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start();
mHandler = new MainHandler(mHandlerThread.getLooper());
//处理ui相关msg的Handler
mUiHandler = mInjector.getUiHandler(this);

//管理AMS的一些常量,厂商定制系统就可能修改此处
mConstants = new ActivityManagerConstants(this, mHandler);

/* static; one-time init here */
if (sKillHandler == null) {
sKillThread = new ServiceThread(TAG + ":kill",
THREAD_PRIORITY_BACKGROUND, true /* allowIo */);
sKillThread.start();
sKillHandler = new KillHandler(sKillThread.getLooper());
}

// 前台广播队列
mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
"foreground", BROADCAST_FG_TIMEOUT, false);
// 后台广播队列
mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
"background", BROADCAST_BG_TIMEOUT, true);
// 系统会优先遍历发送前台广播
mBroadcastQueues[0] = mFgBroadcastQueue;
mBroadcastQueues[1] = mBgBroadcastQueue;

//初始化管理Service的ActiveServices对象
mServices = new ActiveServices(this);
mProviderMap = new ProviderMap(this);//初始化Provider的管理者
mAppErrors = new AppErrors(mUiContext, this);//初始化APP错误日志的打印器

// TODO: Move creation of battery stats service outside of activity manager service.
//创建电池统计服务,并输出到指定目录
File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system");
systemDir.mkdirs();
mBatteryStatsService = new BatteryStatsService(systemDir, mHandler);
mBatteryStatsService.getActiveStatistics().readLocked();
mBatteryStatsService.scheduleWriteToDisk();
//创建进程统计分析服务,追踪统计哪些进程有滥用或不良行为
mOnBattery = DEBUG_POWER ? true
: mBatteryStatsService.getActiveStatistics().getIsOnBattery();
mBatteryStatsService.getActiveStatistics().setCallback(this);

mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));

mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);
mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
new IAppOpsCallback.Stub() {
@Override public void opChanged(int op,int uid, String packageName) {
if (op == AppOpsManager.OP_RUN_IN_BACKGROUND &&
packageName != null) {
if (mAppOpsService.checkOperation(op, uid, packageName)
!= AppOpsManager.MODE_ALLOWED) {
runInBackgroundDisabled(uid);
}
}
}
});

//加载Uri的授权文件
mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"));
//负责管理多用户
mUserController = new UserController(this);
//vr功能的控制器
mVrController = new VrController(this);
//初始化OpenGL版本号
GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
ConfigurationInfo.GL_ES_VERSION_UNDEFINED);

if (SystemProperties.getInt("sys.use_fifo_ui", 0) != 0) {
mUseFifoUiScheduling = true;
}

mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
mTempConfig.setToDefaults();
mTempConfig.setLocales(LocaleList.getDefault());
mConfigurationSeq = mTempConfig.seq = 1;
//管理ActivityStack的重要类,这里面记录着activity状态信息,是AMS中的核心类
mStackSupervisor = createStackSupervisor();
mStackSupervisor.onConfigurationChanged(mTempConfig);
//根据当前可见的Activity类型,控制Keyguard遮挡,关闭和转换。Keyguard就是锁屏相关页面
mKeyguardController = mStackSupervisor.mKeyguardController;
// 管理APK的兼容性配置,解析/data/system/packages-compat.xml文件,该文件用于存储那些需要考虑屏幕尺寸的APK信息。
mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
// Intent防火墙,Google定义了一组规则,来过滤intent,如果触发了,则intent会 被系统丢弃,且不会告知发送者。
mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
mTaskChangeNotificationController =
new TaskChangeNotificationController(this, mStackSupervisor, mHandler);
//这是activity启动的处理类,这里管理者activity启动中用到的intent信息和flag 标识,也和stack和task有重要的联系
mActivityStarter = new ActivityStarter(this, mStackSupervisor);
mRecentTasks = new RecentTasks(this, mStackSupervisor);
//启动一个线程专门跟进cpu当前状态信息,AMS对当前cpu状态了如指掌,可以更加高效的安排其他工作
mProcessCpuThread = new Thread("CpuTracker") {
@Override
public void run() {
synchronized (mProcessCpuTracker) {
mProcessCpuInitLatch.countDown();
mProcessCpuTracker.init();
}
while (true) {
try {
try {
synchronized(this) {
final long now = SystemClock.uptimeMillis();
long nextCpuDelay = (mLastCpuTime.get()+MONITOR_CPU_MAX_TIME)-now;
long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
//Slog.i(TAG, "Cpu delay=" + nextCpuDelay
// + ", write delay=" + nextWriteDelay);
if (nextWriteDelay < nextCpuDelay) {
nextCpuDelay = nextWriteDelay;
}
if (nextCpuDelay > 0) {
mProcessCpuMutexFree.set(true);
this.wait(nextCpuDelay);
}
}
} catch (InterruptedException e) {
}
updateCpuStatsNow();
} catch (Exception e) {
Slog.e(TAG, "Unexpected exception collecting process stats", e);
}
}
}
};
//看门狗,监听进程。这个类每分钟调用一次监视器。如果进程没有任何返回就杀掉
Watchdog.getInstance().addMonitor(this);
Watchdog.getInstance().addThread(mHandler);
}

创建完AMS对象之后,就会通过Lifecycle的start()方法调用到AMS的start()方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void start() {
//移除所有进程组
removeAllProcessGroups();
mProcessCpuThread.start();

mBatteryStatsService.publish(mContext);
mAppOpsService.publish(mContext);
Slog.d("AppOps", "AppOpsService published");
LocalServices.addService(ActivityManagerInternal.class, new LocalService());
// Wait for the synchronized block started in mProcessCpuThread,
// so that any other acccess to mProcessCpuTracker from main thread
// will be blocked during mProcessCpuTracker initialization.
try {
//等待mProcessCpuThread完成初始化后,释放锁,初始化期间禁止访问
mProcessCpuInitLatch.await();
} catch (InterruptedException e) {
Slog.wtf(TAG, "Interrupted wait during start", e);
Thread.currentThread().interrupt();
throw new IllegalStateException("Interrupted wait during start");
}
}

以上AMS构造好之后,SystetmServer就会调用AMS的setSystemProcess()方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public void setSystemProcess() {
try {
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
ServiceManager.addService("meminfo", new MemBinder(this));
ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
ServiceManager.addService("dbinfo", new DbBinder(this));
if (MONITOR_CPU_USAGE) {
ServiceManager.addService("cpuinfo", new CpuBinder(this));
}
ServiceManager.addService("permission", new PermissionController(this));
ServiceManager.addService("processinfo", new ProcessInfoService(this));

// 查询Android的应用信息
ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
"android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());

synchronized (this) {
ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
app.persistent = true;
app.pid = MY_PID;
app.maxAdj = ProcessList.SYSTEM_ADJ;
app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
synchronized (mPidsSelfLocked) {
mPidsSelfLocked.put(app.pid, app);
}
updateLruProcessLocked(app, false, null);
updateOomAdjLocked();
}
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(
"Unable to find android system package", e);
}
}

setSystemProcess()中主要完成如下三件事情:

  • 将ActivityManagerService注册到ServiceManager中,其次将几个与系统性能调试相关 的服务注册到ServiceManager。

  • 查询并处理ApplicationInfo。首先调用PackageManagerService的接口,查询包名为android的应用程 序的ApplicationInfo信息,对应于framework-res.apk。然后以该信息为参数调用ActivityThread上的 installSystemApplicationInfo方法。

  • 创建并处理ProcessRecord。调用ActivityManagerService上的newProcessRecordLocked,创建一个 ProcessRecord类型的对象,并保存该对象的信息

至此,AMS就启动完成了。

4. 与AMS相关重要类说明

4.1 ProcessRecord 数据结构

4.1.1 第一类数据:描述身份的数据

  • 1.ApplicationInfo info:AndroidManifest.xml中定义的Application信息
  • 2.boolean isolated:是不是isolated进程
  • 3.int uid:进程uid
  • 4.int userId:这个是android做的多用户系统id,就像windows可以登录很多用户一样,android 也希望可以实现类似的多用户
  • 5.String processName:进程名字,默认情况下是包名
  • 6.UidRecord uidRecord:记录已经使用的uid
  • 7.IApplicationThread thread:这个很重要,它是ApplicationThread的客户端,AMS就是通过这个对象给apk进程发送异步消息的(管理四大组件的消息),所以只有这个对象不为空的情况下, 才代表apk进程可是使用了
  • 8.int pid:进程的pid
  • 9.String procStatFile:proc目录下每一个进程都有一个以pid命名的目录文件,这个目录下记载着进程的详细信息,这个目录及目录下的文件是内核创建的, proc是内核文件系统,proc就是 process的缩写,设计的目的就是导出进程内核信息
  • 10.int[] gids:gid组
  • 11.CompatibilityInfo compat : 兼容性信息
  • 12.String requiredAbi : abi信息
  • 13.String instructionSet : 指令集信息’

4.1.2 第二类数据:描述进程中组件的数据

  • 1.pkgList:进程中运行的包

  • 2.ArraySet pkgDeps:进程运行依赖的包

  • 3.ArrayList activities:进程启动的所有的activity组件记录表

  • 4.ArraySet services:进程启动的所有的service组件记录表

  • 5.ArraySet executingServices:正在运行的服务。

    正在运行(executing)是怎么定义的?首先需要明确的是系统是怎么控制组件的?发送消息给apk进程,apk进程处理消息,上报消息完成,这被定义为一个完整的执行过程,因此正在执行(executing)被定义为发送消息到上报完成这段时间。

  • 6.ArraySet connections:绑定service的客户端记录表

  • 7.ArraySet receivers:广播接收器的记录表

  • 8.ContentProviderRecord pubProviders:pub是publish(发布)的意思,ContentProvider需要安装然后把自己发布到系统(AMS)中后才能使用,安装指的是apk进程加载ContentProvider 子类、初始化、创建数据库等过程,发布是将ContentProvider的binder客户端注册到AMS中 。

  • 9.ArrayList conProviders:使用ContentProvider的客户端记录表

  • 10.BroadcastRecord curReceiver:当前进程正在执行的广播

4.1.3 第三类数据:描述进程状态的数据

  • 1.int maxAdj:进程的adj上限(adjustment)
  • 2.int curRawAdj:当前正在计算的adj,这个值有可能大于maxAdj
  • 3.int setRawAdj:上次计算的curRawAdj设置到lowmemorykiller系统后的adj
  • 4.int curAdj:当前正在计算的adj,这是curRawAdj被maxAdj削平的值
  • 5.int setAdj:上次计算的curAdj设置到lowmemorykiller系统后的adj
  • 6.int verifiedAdj:setAdj校验后的值
  • 7.int curSchedGroup:正在计算的调度组
  • 8.int setSchedGroup:保存上次计算的调度组
  • 9.int curProcState:正在计算的进程状态
  • 10.int repProcState:发送给apk进程的状态
  • 11.int setProcState:保存上次计算的进程状态
  • 12.int pssProcState:pss进程状态
  • 13.ProcessState baseProcessTracker:进程状态监测器
  • 14.int adjSeq:计算adj的序列数
  • 15.int lruSeq:lru序列数
  • 16.IBinder forcingToForeground:强制将进程的状态设置为前台运行的IBinder,IBinder代表的是组件的ID,这个是整个android系统唯一

4.1.4 第四类数据:和pss相关的数据

VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

  • 1.long initialIdlePss:初始化pss
  • 2.long lastPss:上次pss
  • 3.long lastSwapPss:上次SwapPss数据
  • 4.long lastCachedPss:上次CachedPss数据
  • 5.long lastCachedSwapPss:上次CachedSwapPss数据

4.1.5 第五类数据:和时间相关的数据

  • 1.long lastActivityTime:上次使用时间
  • 2.long lastPssTime:上次计算pss的时间
  • 3.long nextPssTime:下次计算pss的时间
  • 4.long lastStateTime:上次设置进程状态的时间
  • 5.long lastWakeTime:持有wakelock的时长
  • 6.long lastCpuTime:上次计算占用cpu的时长
  • 7.long curCpuTime:当前最新占用cpu的时长
  • 8.long lastRequestedGc:上次发送gc命令给apk进程的时间
  • 9.long lastLowMemory:上次发送低内存消息给apk进程的时间
  • 10.long lastProviderTime:上次进程中ContentProvider被使用的时间
  • 11.long interactionEventTime:上次发送交互时间时间
  • 12.long fgInteractionTime:变成前台的时间

4.1.6 第六类数据:crash和anr相关的数据

  • 1.IBinder.DeathRecipient deathRecipient:apk进程退出运行的话,会触发这个对象的 binderDied()方法,来回收系统资源
  • 2.boolean crashing:进程已经crash
  • 3.Dialog crashDialog:crash对话框
  • 4.boolean forceCrashReport:强制crash对话框显示
  • 5.boolean notResponding:是否处于anr状态
  • 6.Dialog anrDialog:anr显示对话框
  • 7.Runnable crashHandler:crash回调
  • 8.ActivityManager.ProcessErrorStateInfo crashingReport:crash报告的进程状态
  • 9.ActivityManager.ProcessErrorStateInfo notRespondingReport:anr报告的进程状态
  • 10.String waitingToKill:后台进程被kill原因
  • 11.ComponentName errorReportReceiver:接收error信息的组件

4.1.7 第七类数据:和instrumentation相关的数据

instrumentation 也可以说是apk的一个组件,如果我们提供的话,系统会默认使用 Instrumentation.java类,按照我们一般的理解,UI 线程控制activity的生命周期,是直接调用Activity 类的方法,实际是这样子的,UI线程调用的是instrumentation的方法,由它在调用Activity涉及生命周期的方法,所有如果我们覆写了instrumentation的这些方法,就可以了解所有的Activity的生命周期了

  • 1.ComponentName instrumentationClass:AndroidManifest.xml中定义的instrumentation信 息
  • 2.ApplicationInfo instrumentationInfo:instrumentation应用信息
  • 3.String instrumentationProfileFile:instrumentation配置文件
  • 4.IInstrumentationWatcher instrumentationWatcher:instrumentation监测器
  • 5.IUiAutomationConnection instrumentationUiAutomationConnection:UiAutomation连接器
  • 6.ComponentName instrumentationResultClass:返回结果组件

4.1.8 第八类数据:电源信息和调试信息

  • 1.BatteryStatsImpl mBatteryStats:电量信息
  • 2.BatteryStatsImpl.Uid.Proc curProcBatteryStats:当前进程电量信息
  • 3.boolean debugging:处于调试中
  • 4.boolean waitedForDebugger:等待调试
  • 5.Dialog waitDialog:等待对话框
  • 6.String adjType:adj类型(或者说标示)
  • 7.int adjTypeCode:adj类型码(也是一种标示)
  • 8.Object adjSource:改变adj的组件记录表
  • 9.int adjSourceProcState:影响adj的进程状态
  • 10.Object adjTarget:改变adj的组件
  • 11.String shortStringName:进程记录表的字符串显示
  • 12.String stringName:进程记录表的字符串显示

4.1.9 第九类数据:状态boolean值分类

  • 1.进程声明周期相关的

    • a.boolean starting:进程正在启动
    • b.boolean removed:进程系统资源已经清理
    • c.boolean killedByAm:进程被AMS主动kill掉
    • d.boolean killed:进程被kill掉了
    • e:boolean persistent:常驻内存进程
  • 2.组件状态影响进程行为的

    • a.boolean empty:空进程,不含有任何组件的进程
    • b.boolean cached:缓存进程
    • c.boolean bad:60s内连续crash两次的进程被定义为bad进程
    • d.boolean hasClientActivities:进程有Activity绑定其他Service
    • e.boolean hasStartedServices:进程中包含启动了的Service
    • f.boolean foregroundServices:进程中包含前台运行的Service
    • g.boolean foregroundActivities:进程中包含前台运行的Activity
    • h.boolean repForegroundActivities: 是否上次上报了前台Activity
    • i.boolean systemNoUi:系统进程,没有显示UI
    • j.boolean hasShownUi:重进程启动开始,是否已经显示UI
    • k.boolean pendingUiClean: 是否希望清楚UI资源
    • l.boolean hasAboveClient:进程中有组件使用BIND_ABOVE_CLIENT标志绑定其他Service
    • m.boolean treatLikeActivity:进程中有组件使用BIND_TREAT_LIKE_ACTIVITY标志绑定其他 Service
    • n.boolean execServicesFg:前台执行Service
    • o.boolean setIsForeground:设置运行前台UI
  • 3.其他
    • a. boolean serviceb:进程存在service B list中
    • b.boolean serviceHighRam:由于内存原因,进程强制存在service B list中
    • c.boolean notCachedSinceIdle:进程自从上次空闲,是否属于缓存进程
    • d.boolean procStateChanged:进程状态改变
    • e.boolean reportedInteraction:是否报告交互事件
    • f.boolean unlocked:解锁状态下进程启动
    • g.boolean usingWrapper:zygote是否使用了wrapper启动apk进程
    • h.boolean reportLowMemory:报告低内存
    • i.boolean inFullBackup:进程中存在backup组件在运行
    • j.boolean whitelistManager:和电源管理相关
4.2 ProcessRecord容器

永久性容器

1.mProcessNames:根据进程名字检索进程记录表

2.mPidsSelfLocked:根据进程pid检索进程记录表

3.mLruProcesses:lru进程记录表容器,这个容器使用的是最近最少使用算法对进程记录表进行排序,越是处于上层的越是最近使用的,对于系统来说就是最重要的,在内存吃紧回收进程时,越不容易被回收,实现起来也很简单

临时性容器

1.mPersistentStartingProcesses:常驻内存进程启动时容器

2.mProcessesOnHold:进程启动挂起容器

3.mProcessesToGc:将要执行gc回收的进程容器

4.mPendingPssProcesses:将要计算Pss数据的进程容器

一个特别的容器

1.mRemovedProcesses:从名字上的意思是已经移除的进程,那么什么是已经移除的进程?移除的 进程为什么还需要保存?

如果进程不重启的话,pid会设置为0,就代表无效。

4.3 与Activity管理有关的数据结构
4.3.1 ActivityRecord

ActivityRecord,源码中的注释介绍:An entry in the history stack, representing an activity.

翻译:历史栈中的一个条目,代表一个activity。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
final class ActivityRecord extends WindowToken {
......
// ActivityRecord所在的TaskRecord
private TaskRecord task;
// 该Activity由哪个栈管理者管理
final ActivityStackSupervisor mStackSupervisor;

ActivityRecord(ActivityTaskManagerService _service, WindowProcessController _caller,
int _launchedFromPid, int _launchedFromUid, String _launchedFromPackage,
@Nullable String _launchedFromFeature, Intent _intent, String _resolvedType,
ActivityInfo aInfo, Configuration _configuration, ActivityRecord _resultTo,
String _resultWho, int _reqCode, boolean _componentSpecified,
boolean _rootVoiceInteraction, ActivityStackSupervisor supervisor,
ActivityOptions options, ActivityRecord sourceRecord) {
.....
}
}

从ActivityRecord的构造方法可以看出,要在AMS中构建一个ActivityRecord, 需要将大量信息保存在ActivityRecord中,AMS在管理各个Activity的时候,就容易知道该ActivityRecord属于哪些进程,由哪些资源,如何启动。

ActivityRecord中存在着大量的成员变量,包含了一个Activity的所有信息。 ActivityRecord中的成员变量task表示其所在的TaskRecord,由此可以看出:ActivityRecord与 TaskRecord建立了联系。

1
2
3
4
5
6
7
// \frameworks\base\services\core\java\com\android\server\am\ActivityStarter.java
private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,String resolvedType, ......,TaskRecord inTask) {
......
// 在通过ActivityStarter启动Activity的时候创建ActivityRecord
ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,
callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(), resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null, mSupervisor, container, options, sourceRecord);
}
4.3.2 TaskRecord

TaskRecord,内部维护一个 ArrayList 用来保存ActivityRecord。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// \frameworks\base\services\core\java\com\android\server\am\TaskRecord.java
final class TaskRecord extends ConfigurationContainer implements TaskWindowContainerListener {
final int taskId; //任务ID
final ArrayList<ActivityRecord> mActivities; //使用一个ArrayList来保存所有的ActivityRecord
private ActivityStack mStack; //TaskRecord所在的ActivityStack

//添加Activity到顶部
void addActivityToTop(com.android.server.am.ActivityRecord r) {
addActivityAtIndex(mActivities.size(), r);
}

//添加Activity到指定的索引位置
void addActivityAtIndex(int index, ActivityRecord r) {
......
r.setTask(this);//为ActivityRecord设置TaskRecord,就是这里建立的联系
index = Math.min(size, index);
mActivities.add(index, r);//添加到mActivities
}

}

可以看到TaskRecord中使用了一个ArrayList来保存所有的ActivityRecord。 同样,TaskRecord中的mStack表示其所在的ActivityStack。 startActivity()时也会创建一个TaskRecord

1
2
3
4
5
6
7
8
9
10
11
12
13
// \frameworks\base\services\core\java\com\android\server\am\ActivityStarter.java
private int setTaskFromReuseOrCreateNewTask(TaskRecord taskToAffiliate, int preferredLaunchStackId, ActivityStack topStack) {

if (mReuseTask == null) {
//创建一个createTaskRecord,实际上是调用ActivityStack里面的createTaskRecord()方法
final TaskRecord task = mTargetStack.createTaskRecord(
mSupervisor.getNextTaskIdForUserLocked(mStartActivity.userId),
mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info,
mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession,
mVoiceInteractor, !mLaunchTaskBehind /* toTop */, mStartActivity.mActivityType);
addOrReparentStartingActivity(task, "setTaskFromReuseOrCreateNewTask - mReuseTask");
......
}
4.3.3 ActivityStack

ActivityStack,内部维护了一个 ArrayList ,用来管理TaskRecord。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class ActivityStack<T extends StackWindowController> extends ConfigurationContainer
implements StackWindowListener {
//使用一个ArrayList来保存TaskRecord
private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();

//持有一个ActivityStackSupervisor,所有的运行中的ActivityStacks都通过它来进行管
protected final ActivityStackSupervisor mStackSupervisor;

TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
boolean toTop, int type) {
//创建一个task
TaskRecord task = new TaskRecord(mService, taskId, info, intent, voiceSession,
voiceInteractor, type);
//将task添加到ActivityStack中去
addTask(task, toTop, "createTaskRecord");
......
return task;
}

void addTask(final TaskRecord task, int position, boolean schedulePictureInPictureModeChange, String reason) {
mTaskHistory.remove(task);//若存在,先移除
position = getAdjustedPositionForTask(task, position, null /* starting */);
final boolean toTop = position >= mTaskHistory.size();
final ActivityStack prevStack = preAddTask(task, reason, toTop);

mTaskHistory.add(position, task);//添加task到mTaskHistory
task.setStack(this);//为TaskRecord设置ActivityStack,关联TaskRecord和ActivityStack
......
}
}

可以看到ActivityStack使用了一个ArrayList来保存TaskRecord。 另外,ActivityStack中还持有ActivityStackSupervisor对象,这个是用来管理ActivityStacks的。 ActivityStack是由ActivityStackSupervisor来创建的,实际ActivityStackSupervisor就是用来管理 ActivityStack的。

4.3.4 ActivityStackSupervisor

ActivityStackSupervisor,顾名思义,就是用来管理ActivityStack的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener {
ActivityStack mHomeStack;//管理的是Launcher相关的任务

ActivityStack mFocusedStack;// 接收用户输入或者即将启动的Activity

// 创建ActivityStack
protected void createStack(int stackId, boolean onTop) {
switch (stackId) {
case PINNED_STACK_ID:
//PinnedActivityStack是ActivityStack的子类
new PinnedActivityStack(this, mRecentTasks, onTop);
break;
default:
//创建一个ActivityStack
new ActivityStack(this, mRecentTasks, onTop);
break;
}
}
}

ActivityStackSupervisor内部有两个不同的ActivityStack对象:mHomeStack、mFocusedStack,用来 管理不同的任务。 ActivityStackSupervisor内部包含了创建ActivityStack对象的方法。 AMS初始化时会创建一个ActivityStackSupervisor对象。

ASS_AS关系.png

参考资源:

《Android系统源代码情景分析(第三版)》–罗升阳