Framework之AMS启动流程,简单上手!
一、AMS介绍
- AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要;
- 组件状态管理:包括四大组件的开启,关闭等一系列操作,如startActivity,startActivityAndWait,activityPaused,startService,stopService,removeContentProvider等;
- 组件状态查询:查询组件当前运行等情况。如getCallingActivity,getService等;
- Task相关:包括removeTask,removeSubTask,moveTaskBackwards,moveTaskToFront等;
- AMS是通过ActivityStack及其他数据结构来记录,管理系统中的Activity及其他组件状态的,并提供查询功能的一个系统服务;
AMS中重要的数据结构
ActivityRecord:记录了Activity的所有信息,因此它用来描述一个activity。它是在activity启动时被创建的,具体是在ActivityStarter的startActivity()中被创建的。它存储的信息主要包括以下内容:
- service:AMS的引用
- info:ActivityInfo,Activity中代码和AndroidManifest设置的节点信息,如launchMode
- launcherFromPackage:启动activity的包名
- taskAffinity:activity希望归属的栈
- task:TaskRecord,Activity所在的TaskRecord
- app:ProcessRecord,ActivityRecord所在的应用程序进程
- state:ActivityState,当前activity的状态
- icon:Activity的图标资源和标致符
- theme:Activity的主题资源标识符
TaskRecord:用来描述一个Activity任务栈
- taskId:任务栈的唯一标识符
- affinity:任务栈的倾向性
- Intent:启动这个activity的intent
- mActivites:ArrayList,按照历史顺序排列的Activity记录
- mStack:ActivityStack,当前归属的ActivityStack
- mService:AMS的引用
ActivityStack:用来管理系统所有的Activity,内部维护了Activity的所有状态,特殊状态的Activity以及和Activity相关的列表等数据。
image.png
二、AMS服务的启动过程
1.SystemServer.java的main()
`public static void main(String[] args) {`
new SystemServer().run(); }
2.SystemServer.java的run()
`private void run() {`
...
System.loadLibrary("android_servers");//1
...
mSystemServiceManager = new SystemServiceManager(mSystemContext);//2
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
...
try {
Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartServices");
startBootstrapServices();//3 ---------------->引导服务
startCoreServices();//4 ---------------->核心服务
startOtherServices();//5 ---------------->其他服务
}
3.SystemServer.java的startBootstrapServices()
`private void startBootstrapServices() {`
// Activity manager runs the show.
mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService();
我们知道SystemServiceManager的startService方法最终会返回Lifecycle类型的对象,紧接着又调用了Lifecycle的getService方法,这个方法会返回AMS类型的mService对象
mActivityManagerService.setSystemProcess();
……
mActivityManagerService.installSystemProviders();
……
mActivityManagerService.systemReady(new Runnable() {
@Override public void run() {
Slog.i(TAG, "Making services ready");
mSystemServiceManager.startBootPhase( SystemService.PHASE_ACTIVITY_MANAGER_READY);
try { mActivityManagerService.startObservingNativeCrashes();
4.Lifecycle类的介绍
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();
}
*
@Override
public void onCleanupUser(int userId) {
mService.mBatteryStatsService.onCleanupUser(userId);
}
public ActivityManagerService getService() {
return mService;
}
}*
5.AMS的构造方法
`public ActivityManagerService(Context systemContext) {`
`//获得系统的ActivityThread`
mSystemThread = ActivityThread.currentActivityThread();
`//创建一个HandlerThread用来处理AMS接收的命令`
mHandlerThread = new ServiceThread(TAG, android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start();
mHandler = new MainHandler(mHandlerThread.getLooper());
mUiHandler = new UiHandler();
`//初始化广播的队列`
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相关的容器`
mServices = new ActiveServices(this);
//初始化Provider相关的Map,里面保存了注册的ContentProvider
mProviderMap = new ProviderMap(this);
`//初始化并创建data/system/目录`
File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system");
systemDir.mkdirs();
`//初始化StackSupervisor,该类是Activity启动和调度的核心类`
mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);
mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);
6.AMS的方法systemReady
1:在systemReady的时候初始化了deviceIdleController等对象
2:移除并杀死了那些不该在AMS之前启动的进程
3:执行了参数传入的回调函数
4:启动了Launcer界面和SystemUI
5:启动那些persistent配置为1的进程。
总结:AMS服务启动主要分为几个步骤 小米视频增加组内自动化测试
1. 创建了SystemServer进程的运行环境,包括一个ActivityThread主线程,一个和系统进程相关的Context对象。
2. 调用AMS的构造方法和start方法,对AMS必要的内容进行初始化
3. 将函数AMS注册到ServiceManager中,同时对systemServer进程也创建了一个ProcessRecord对象,并设置Context的appliation为framework-res的application对象
4. 将settingsProvider加载到系统进程systemServer中
5. 调用systemReady方法做一些启动前的就绪工作,并启动了HomeActivity和SystemUI
三、文末
AMS(ActivityManagerService)Android的核心服务之一,对于framework各个核心服务,更多framework学习进阶,获~如果不是专门去做framework开发,先了解其基本的流程机制,再慢慢深究 ~