android 启动 AMS、PMS、WMS服务

239 阅读4分钟
Android手机系统开机后,由 Power on ->boot rom ->bootloader->kernel 顺序执行,通俗来说就是给器件供电后加载配置驱动完成后,开始启动系统。当然这部分不是我们做软件开发关注的重点。

下面从 init 进程开始:

image.png

init文件会被编译成可执行文件init,相当于.exe可执行程序,然后会在文件执行后,去启动init.rc脚本init.rc脚本存放着存放一堆任务清单,其中也导入了zygote脚本。
init进程中执行的主要任务大致如下:
1、执行app_main.cpp文件的main方法(init进程中)
2、main方法中初始化AndroidRuntime
3、执行runtime.start()启动Android运行时环境,其中,start()方法内部通过startVM方法创建了虚拟机,通过startReg方法注册JNI
4、然后通过jni方法调用ZygoteInit的main()方法,由此从native层进入到了java层
5、ZygoteInit的main()方法做了以下几件事情:
  • 1、执行了preload()方法,对部分资源进行了预加载

  • 2、创建zygote进程的socket服务(此时binder还未创建)

  • 3、调用forkSystemServer()方法,创建了system_server进程

image.png

注意:在main方法执行了preload()方法中,会去加载我们的class代码,资源,so文件等。class类加载是遵循类加载原则的,即类只加载一遍。

再来看看forkSystemServer()方法,fork创建出system_server进程,并返回pid值。然后让fork出来的子进程,也就是system_server进程,去执行handleServerProcess()方法。最终调用 ZygoteInit.zygoteInitimage.png

system_server进程 内部会通过反射拿到SystemServer main方法,并将main方法的invoke放在一个Runnable类的run方法中执行,最终将这个Runnable对象通过forkSystemServer()方法返回,所以说,forkSystemServer()的返回值就是个Runnable对象了。拿到这个Runnable对象后,就开始调用 r.run() 方法,也就是相当于执行SystemServer的main方法了。

而runSelectLoop函数主要是监听socket,接受启动新的应用进程。

下来,看看SystemServer 的 main 方法:

image.png

image.png 在run方法中

  • 1、 createSystemContext 创建了系统上下文。
  • 2、 startBootstrapServices 启动引导服务。
  • 3、 startCoreServices 启动核心服务。
  • 4、 startOtherServices 启动其他服务。

其中 startBootstrapServices 里就包含了我们想找的AMS、PowerMS、WMS服务

image.png image.png

另外,还有 PMS 服务是在 startOtherServices 被启动 image.png

当然还有其他的服务:

image.png

分析: 可以看到在startBootStrapServices中,分别启动了ATM服务(ActivityTaskManagerService)和AMS服务(ActivityManagerService)。注意在Android10之前,这块代码是直接就启动AMS服务的。在Android10之后,这里才多启动了一个ATM服务。

SystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getServcice()这个方法,内部是通过反射来获取到atm对象的。 SystemServiceManaager这个对象是一个比较重要的对象,它是用来管理SystemService进程的,同时,它还用来启动了其他服务。

我们看ActivityTaskManagerService这个类:new ClientLifecycleManager() 创建了acitivity的生命周期管理类

image.png

image.png

调用了atm服务的initialize()方法,在这个方法中,通过createStackSuppervisor()方法创建出了栈管理对象(mStackSupervisor)。

然后又通过,setRecentTacks(new RecentTasks(this, mStackSupervisor))来设置当前用户栈,这个用户栈的意思就是APP切到后台后,仍可以存活,保存在这个栈中,等待用户随时调起。到这里,AMS的创建所做的事情就这么多了。

那么,AMS服务是怎么添加到ServiceManager中的呢? 在SystemServer 中,AMS会调用一setSystemProcess() 方法。

image.png

可以看到,通过ServiceManager.addService()方法,把当前的ams对象保存进了ServiceManager中。当然,这里除了保存AMS服务到ServiceManager中,还保存了其他的服务,例如,meminfo、dbinfo、permission 等等,其实,他们都是一个个的binder服务。

至此,各大服务都已经启动完成。

我们来总结一下:

init进程中:
1、执行app_main.cpp文件的main方法(init进程中)
2、main方法中初始化AndroidRuntime
3、执行runtime.start()启动Android运行时环境,其中,start()方法内部通过startVM方法创建了虚拟机,通过startReg方法注册JNI
4、然后通过jni方法调用ZygoteInit的main()方法,由此从native层进入到了java层
5、ZygoteInit的main()方法做了以下几件事情:
  • 1、执行了preload()方法,对部分资源进行了预加载
  • 2、创建zygote进程的socket服务(此时binder还未创建)
  • 3、调用forkSystemServer()方法,创建了system_server进程
SystemServer的启动流程:
1、首先,执行SystemServer的main方法,main方法内部又执行了run方法
2、创建出一个SystemServerManager对象
3、执行三个方法:startBootStrapServices、startCoreServices、startOtherServices,分别启动系统引导服务、核心服务、其他服务
4、其中,startBootStrapServices中,启动了ATM服务,和AMS服务。启动ATM服务的过程中,创建出了acitivity的生命周期管理对象;启动AMS的过程中,创建了栈管理对象。ATM服务是通过ServiceManager.addService()方法保存在ServiceManager中的;AMS服务是通过setSystemProcess方法ServiceManager中的。startOtherServices方法中,又启动了WMS服务,以及启动了桌面。