简介
ActivityManagerService(以下简称:AMS)是android系统的一个系统服务,是应用进程的管理服务端,直接的控制了应用程序的各个行为,保证了系统中不同的应用程序之间能够和谐的合理的进行调度运行。AMS主要的职责就是对Android四大组件(Activity,Service,ContentProvider,Broadcast)进行管理。虽然开发者在开发过程中会经常的使用到AMS提供的一些功能,但是可能很少有机会对它进行一个统一的整体和认知。
该文档的书写目的主要是为了对做AMS进行了一个整体的基础介绍和讲解,希望能够一些开发人员有所帮助。
系统服务启动过程
如下图所示,该图概要描述了系统启动时的整个过程:
1) 系统启动时,会先启动kernel模块
2) kenel模块中会启动init进程,而init进程会解析init.rc文件并启动一系列native服务。
3) Zygote进程预加载和初始化一些核心类库,便于之后的应用进程的代码共享。
4) Zygote启动(fork)系统服务进程system_server
5) System_Server进程中会发布一系列的系统服务,而AMS就是其中之一,并在之后的生命周期中运行在system_server的进程中。
6) AMS启动(fork)出一系列的应用进程。
详细的系统服务启动流程请参考《Android启动系列文章》
AMS框架设计
结构框架设计
AMS是android上层系统最核心的模块之一,其主要的工作是对所有的应用进程及其进程中的四大组件进行管理。(当然这里面也涉及了一些window、电源、权限等内容, 我们这里不再讲述)
对进程的管理包括:进程的创建与销毁、进程的优先级调整。
对组件的管理包括:Activity的调度管理、Service的管理、Broadcast的分发、以及ContentProvider管理。
通信框架设计
从上节我们可以得知,AMS作为上层最核心的模块之一,不论是直接对进程的管理还是对进程中组件的调度管理,它都离不开和应用进程之间的通信。而在Android系统中,最常用的进程间的通信手段就是使用Binder调用的方式,AMS和应用进程之间的通信方式也正是采用的Binder机制。
AMS和应用之间的通信过程中有两个非常重要的类:ActivityManagerService和ActivityThread。其中ActivityThread是应用进程的入口,负责管理进程主线程的执行,根据AMS的调度要求直接的控制着应用进程中各个组件的有序执行。
这里需要注意的是:应用对AMS的通信都是最终通过ActivityManagerProxy直接访问的AMS。而AMS向应用的通信,则需要通过ApplicationThread然后将异步消息通过Handler发送到应用的主线程中执行。
AMS初始化
AMS属于系统核心进程,是从SystemServer进程中启动起来的。
构造函数
在AMS构造函数中做一些最基本的初始化工作,如初始化异步线程作为AMS的“主线程”,建立广播的分发队列等。
public ActivityManagerService(Context systemContext) {
mContext = systemContext; //设置系统上下文context
mFactoryTest = FactoryTest.getMode(); //获取工厂测试模式
mSystemThread = ActivityThread.currentActivityThread(); //获取当前的系统线程
Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());
mHandlerThread = new ServiceThread(TAG,
android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start(); //创建一个线程
mHandler = new MainHandler(mHandlerThread.getLooper()); //使用新创建线程的Looper创建hander
mUiHandler = new UiHandler(); //使用主线程的Looper创建显示UI的handler
/* static; one-time init here */
if (sKillHandler == null) {
sKillThread = new ServiceThread(TAG + ":kill",
android.os.Process.THREAD_PRIORITY_BACKGROUND, true /* allowIo */);
sKillThread.start(); //创建线程
sKillHandler = new KillHandler(sKillThread.getLooper()); //创建hander用来杀进程
}
mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
"foreground", BROADCAST_FG_TIMEOUT, false); //创建前台广播队列,广播处理超时时间为10s
mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
"background", BROADCAST_BG_TIMEOUT, true); //创建后台广播队列,广播超时时间为60s
mBroadcastQueues[0] = mFgBroadcastQueue;
mBroadcastQueues[1] = mBgBroadcastQueue;
mServices = new ActiveServices(this); //创建Service对象
mProviderMap = new ProviderMap(this); //管理Provider
mAppErrors = new AppErrors(mContext, this); //处理应用错误
// TODO: Move creation of battery stats service outside of activity manager service.
File dataDir = Environment.getDataDirectory(); //获取系统data/路径
File systemDir = new File(dataDir, "system"); //获取data/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 = new AppOpsService(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);
}
}
}
});
mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"));
mUserController = new UserController(this);
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"));
mConfiguration.setToDefaults();
mConfiguration.setLocales(LocaleList.getDefault());
mConfigurationSeq = mConfiguration.seq = 1;
mProcessCpuTracker.init();
mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
mStackSupervisor = new ActivityStackSupervisor(this); //Activity stack信息的管理者
mActivityStarter = new ActivityStarter(this, mStackSupervisor); //启动Activity的类
mRecentTasks = new RecentTasks(this, mStackSupervisor); //最近任务
mProcessCpuThread = new Thread("CpuTracker") { //获取cpu信息的线程
@Overrid