系统服务之AMS

AMS主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作


ActivityManagerService 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,AMS的注册启动可以参考Binder之系统服务注册一文

Activity跳转逻辑

举例:AActivity#onPause -> BActivity#onCreate -> BActivity#onStart -> BActivity#onResume -> AActivity#onStop

mStackSupervisor.resumeFocusedStackTopActivityLocked
startPausingLocked
将当前未Pause的Activity进行Pause

暂停完又会回到
mStackSupervisor.resumeFocusedStackTopActivityLocked
进行mStackSupervisor.startSpecificActivityLocked

这个方法还有一个重要的事情就是将已被Pause的Activity加入到mStackSupervisor.mStoppingActivities的列表中,这是一个ArrayList

新的Activity启动(没有进程就mService.startProcessLockedforkfork新进程)
有进程就realStartActivityLocked-handleLaunchActivity-performLaunchActivity

在performLaunchActivity中执行了(这里逻辑针对8.0,9.0开始使用事务模式)

  1. ClassLoader创建Activity实例
  2. activity.attach(创建phonewindow,windowmanager)
  3. Activity#onCreate和Activity#onStart
  4. 回到handleLaunchActivity,执行handleResumeActivity,执行performResumeActivity ,执行Activity#onResume
  5. 回到handleResumeActivity,执行Looper.myQueue().addIdleHandler(new Idler());这个方法是为了stop之前被pause的activity,从mStoppingActivities里面拿(和上面对应)

Activity启动过程中创建新Task的条件

  1. standard、singleTop模式
    Intent.FLAG_ACTIVITY_NEW_TASK 和taskAffinity必须同时设置
  2. sinlgeTask模式 只需设置taskAffinity
    Intent.FLAG_ACTIVITY_NEW_TASK 可有可无
  3. singeInstance模式
    Intent.FLAG_ACTIVITY_NEW_TASK 和taskAffinity均可有可无

AMS进程管理

1.进程LRU列表动态更新:动态调整进程在mLruProcesses列表的位置
2.进程优先级动态调整:实际是调整进程oom_adj的值。

进程LRU列表动态更新

LRU进程列表:

final ArrayList<ProcessRecord> mLruProcesses = new ArrayList<ProcessRecord>();

LRU列表被分为3段:
1.hasActivity:带Activity的进程
2.hasService:带Service的进程
3.other:其他进程。

LRU列表中存储的是一个个ProcessRecord,AMS中使用ProcessRecord来代表一个进程、内部存储了一个进程所有的信息。

AMS中的updateLruProcessLocked实现了对进程LRU列表动态更新

进程优先级动态调整

AMS中的updateOomAdjLocked方法实现了进程优先级的动态更新

进程优先级(OOM_ADJ)

OOM_ADJ定义在ProcessList.java文件,大概划分为20个级。进程回收机制就是根据这个adj值来进行的 前台进程adj值最低,代表进程优先级最高,空进程adj值越高,最容易被kill,对于相等优先级的进程:使用的内存越多越容易被杀死

进程state级别(ProcState)

ProcState定义在ActivityManager.java文件,大概划分为22类。用来表示当前进程的一组状态

进程组schedGroup

用来表示当前进程所在的进程调度组序列。

LMK机制

LMK 全称 Low Memory Killer
在Android中,即使当用户退出应用程序后,应用进程也还会存在内存中,方便下次可以快速进入应用而不需要重新创建进程。 这样带来的直接影响就是由于进程数量越来越多,系统内存会越来越少,这个时候就需要杀死一部分进程来缓解内存压力。 至于哪些进程会被杀死,这个时候就需要用到Low Memory Killer机制来进行判定。

AMS通过四大组件的运行状态更新这些组件相关联的进程的oom_adj(包括adj,proc_state,schedule_group等值), AMS计算好每个进程的oom_adj,通过socket向lmkd服务发送请求,让lmkd去更新进程的优先级,lmkd收到请求后,会通过/proc文件系统去更新内核中的进程优先级。这样AMS就可以间接通过LMK实现对进程的动态管理。



AMS作用,什么时候初始化

主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作

ActivityThread和ApplicationThread,以及关系和区别

ActivityThread可以理解为android主线程(不是线程),app进程的入口,执行loop使当前线程进入消息循环
ApplicationThread是ActivityThread的内部类,是一个Binder对象,可以理解为app端的代理,ams可以通过它和app通信,到了app端的ApplicationThread,内部通过handler进行发送消息到主线程的消息循环

Instrumentation是什么,和ActivityThread是什么关系

监控系统和应用之间的交互,一个进程对应一个Instrumentation
ActivityThread通过Instrumentation执行activity的生命周期
activity通过Instrumentation(转到AMS)跳转activity

AMS和zygote进程通信是如何实现的

ams 请求zygote fork新的进程,底层通过socket

通过ZygoteProcess 的内部类ZygoteState,执行ZygoteState的connect方法,这里作为客户端,Zygote进程作为服务端
客户端connect,服务端accept,客户端write,服务端read,根据ags中的各种参数,Zygote孵化新的进程Zygote.forkAndSpecialize
最后找到 ActivityThread 类的 main() 方法并执行,子进程就这样启动了

无限循环等待AMS请求,代码如下:
frameworks/base/core/java/com/android/internal/os/ZygoteServer.java
Runnable runSelectLoop(String abiList) {
while(true){
……
final Runnable command = connection.processOneCommand(this);
……
}
}
frameworks/base/core/java/com/android/internal/os/Zygote.java
Runnable processOneCommand(ZygoteServer zygoteServer) {
……
args = Zygote.readArgumentList(mSocketReader);
……
pid = Zygote.forkAndSpecialize(……);
……
}

ActivityRecord、TaskRecord和ActivityStack

ActivityRecord代表一个activity,应用中启动的Activity,在AMS中都有一个ActivityRecord实例来与之对应

TaskRecord任务栈,栈顶的ActivityRecord表示当前可见的界面。一个App是可能有多个TaskRecord存在。

ActivityStack负责所有Activity栈的管理。ActivityStackSupervisor内部管理了mHomeStack、mFocusedStack和mLastFocusedStack三个Activity栈。
其中,mHomeStack管理的是Launcher相关的Activity栈;
mFocusedStack管理的是当前显示在前台Activity的Activity栈;
mLastFocusedStack管理的是上一次显示在前台Activity的Activity栈。

ActivityManager

ActivityManager虽然名为Activity管理器,其实际功能比类名描述的广泛,定义的方法涵盖了内存、进程、任务、设备等相关功能。因此,将ActivityManager理解为AppManager,更符合这个类。