基于Android10.0,分析AMS的启动过程
一、概述
ActivityManagerService(简称AMS),是Android系统中核心服务之一,负责管理四大组件和应用进程的工作,如四大组件的启动、切换、调度,应用进程的调度等。AMS类图如下:
ActivityManager通过ActivityManagerNative的getDefault方法得到IActivityManager,通过它可以和AMS进行通信。在之前讲过SystemServer启动过程,本文将从SystemServer启动过程中分析AMS的启动过程。
二、启动分析
SystemServer中主要的三个方法, startBootstrapServices()、startCoreServices()、startOtherServices(),在这三个方法中和AMS相关的如下:
2.1 startBootstrapServices
1 | private void startBootstrapServices() { |
2.2 启动AMS服务
mSystemServiceManager.startService主要功能如下:
- 创建ActivityManagerService.Lifecycle对象
- 调用Lifecycle.onStart()方法
2.2.1 AMS.Lifecycle
1 | public static final class Lifecycle extends SystemService { |
创建内部类Lifecycle,已经创建AMS对象,并调用AMS.start
2.2.2 AMS创建
1 | // Note: This method is invoked on the main thread but may need to attach various |
这个过程创建了五个线程,分别名为ActivityManager、Android.ui、ProcStart、SKill、CpuTracker的线程。
2.2.3 AMS.start
1 | private void start() { |
2.3 AMS.setSystemProcess
1 | public void setSystemProcess() { |
这个过程主要是注册各种服务。
2.3.1 AT.installSystemApplicationInfo
1 | public void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) { |
2.3.2 installSystemApplicationInfo
[-> LoadedApk.java]
1 | /** |
2.4 startCoreServices
1 | private void startCoreServices() { |
2.5 startOtherServices
1 | private void startOtherServices() { |
2.5.1 installSystemProviders
1 | public final void installSystemProviders() { |
三、ASM.systemReady
AMS.systemReady中有一个Runnable参数goingCallback,这个方法在systemReady中的中间执行,因此在这里将这个方法分为三个过程goingCallback前、中、后。
3.1 before goingCallback
1 | public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { |
这个过程中主要的工作如下:
profile info相关的服务执行systemReady;
杀掉procsToKill列表中的进程,并且不允许重启;
此时进程和系统都处于ready状态;
读取UriPermission、注册LowPowerModeObserver。
3.2 goingCallback.run
方法中传递过来的Runnable,开始执行。
1 | // We now tell the activity manager it is okay to run third party |
这个过程主要的工作如下:
进入到SystemServer phase 550阶段;
启动webview,并且创建进程,这是zygote正式创建的第一个进程;
启动systemui服务;
网络相关的服务执行systemReady;
进入到SystemServer phase 600;
一序列服务执行systemRunning。
3.2.1 startSystemUi
1 | static final void startSystemUi(Context context, WindowManagerService windowManager) { |
启动com.android.systemui.SystemUIService服务
3.2 after goingCallback
1 | //统计用户运行时间 |
这个过程主要的工作如下:
回调所有SystemService的onStartUser方法;
启动persistent进程;
启动桌面activity;
发送USER_STARTED、USER_STARTING广播;
恢复栈顶Acitvity;
发送广播 UserSwitch;
设置BinderProxyListener。
3.2.1 SSM.startUser
1 | public void startUser(final int userHandle) { |
3.2.2 startPersistentApps
1 | void startPersistentApps(int matchFlags) { |
3.2.3 startHomeActivityLocked
1 | boolean startHomeActivityLocked(int userId, String reason) { |
四、总结
1.创建了AMS实例对象,创建了名为ActivityManager、Android.ui、ProcStart、SKill、CpuTracker的线程,创建Context、ActivityThread对象。
2.setSystemProcess主要注册meminfo、gfxinfo、dbinfo 、cpuinfo等服务到ServiceManager,并且更新adj。
3.installSystemProviders加载SystemProviders
4.AMS的systemReady主要是执行相关服务的systemReady,启动sytemui服务,webview,HomeAcitvity
4.1 注册Binder服务
AMS.setSystemProcess过程中向ServiceManager注册了如下Binder服务
服务名 | 类名 | 功能 |
---|---|---|
activity | ActivityManagerService | AMS |
procstats | ProcessStatsService | 进程统计 |
meminfo | MemBinder | 内存 |
gfxinfo | GraphicsBinder | 图像信息 |
dbinfo | DbBinder | 数据库 |
cpuinfo | CpuBinder | CPU |
permission | PermissionController | 权限 |
processinfo | ProcessInfoService | 进程服务 |
usagestats | UsageStatsService | 应用的使用情况 |
备注:其中UsageStatsService在systemserver的startCoreServices方法,通过setUsageStatsManager注册。
查看这些服务的信息,可以通过dumpsys<服务名>命令。比如查看进程命令
1 | dumpsys procstats |
4.2 AMS.systemReady
AMS.systemReady大致流程如下
1 | public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { |
这里说下mProcessesReady,在startProcessLocked过程对于非persistent进程必须等待mProcessesReady=true才会真正的创建进程,否则进程放入mProcessesOnHold队列。以下情况则不会判断mProcessesReady:
addAppLocked启动persistent进程;//此时已经mProcessesReady
finishBooting启动on-hold进程;//此时已经mProcessesReady
cleanUpApplicationRecordLocked;//启动需要restart进程,前提是进程已经创建
attachApplicationLocked;//绑定Bind死亡通告失败,前提同样是进程已经创建
可以看出,mProcessesReady在没有ready之前,基本上没有应用进程。
附录
源码路径
1 | frameworks/base/core/java/android/app/IActivityManager.aidl |