Android手机系统开机后,由 Power on ->boot rom ->bootloader->kernel 顺序执行,通俗来说就是给器件供电后加载配置驱动完成后,开始启动系统。当然这部分不是我们做软件开发关注的重点。
下面从 init 进程开始:
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进程
注意:在main方法执行了preload()方法中,会去加载我们的class代码,资源,so文件等。class类加载是遵循类加载原则的,即类只加载一遍。
再来看看forkSystemServer()方法,fork创建出system_server进程,并返回pid值。然后让fork出来的子进程,也就是system_server进程,去执行handleServerProcess()方法。最终调用 ZygoteInit.zygoteInit
。
system_server进程 内部会通过反射拿到SystemServer main方法,并将main方法的invoke放在一个Runnable类的run方法中执行,最终将这个Runnable对象通过forkSystemServer()方法返回,所以说,forkSystemServer()的返回值就是个Runnable对象了。拿到这个Runnable对象后,就开始调用 r.run() 方法,也就是相当于执行SystemServer的main方法了。
而runSelectLoop函数主要是监听socket,接受启动新的应用进程。
下来,看看SystemServer 的 main 方法:
在run方法中
-
1、
createSystemContext
创建了系统上下文。 -
2、
startBootstrapServices
启动引导服务。 -
3、
startCoreServices
启动核心服务。 -
4、
startOtherServices
启动其他服务。
其中 startBootstrapServices
里就包含了我们想找的AMS、PowerMS、WMS服务
另外,还有 PMS
服务是在 startOtherServices
被启动
当然还有其他的服务:
分析: 可以看到在startBootStrapServices中,分别启动了ATM服务(ActivityTaskManagerService)和AMS服务(ActivityManagerService)。注意在Android10之前,这块代码是直接就启动AMS服务的。在Android10之后,这里才多启动了一个ATM服务。
SystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getServcice()
这个方法,内部是通过反射来获取到atm对象的。 SystemServiceManaager
这个对象是一个比较重要的对象,它是用来管理SystemService进程的,同时,它还用来启动了其他服务。
我们看ActivityTaskManagerService这个类:new ClientLifecycleManager()
创建了acitivity的生命周期管理类
调用了atm服务的initialize()方法,在这个方法中,通过createStackSuppervisor()方法创建出了栈管理对象(mStackSupervisor)。
然后又通过,setRecentTacks(new RecentTasks(this, mStackSupervisor))来设置当前用户栈,这个用户栈的意思就是APP切到后台后,仍可以存活,保存在这个栈中,等待用户随时调起。到这里,AMS的创建所做的事情就这么多了。
那么,AMS服务是怎么添加到ServiceManager中的呢? 在SystemServer
中,AMS会调用一setSystemProcess()
方法。
可以看到,通过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进程