Android打开电源到启动相关APP流程
image.pngappMain.cpp方法中会初始化一个AndroidRuntime
然后调用runtime.start("com.android.internal.os.ZygoteInit")
在start方法中会创建虚拟机,注册jni,调用callStaticVoidMethod方法启动ZygoteInit.main方法,预加载一些内容,在此方法中会调用forkSystemServer方法fork一个SystemServer进程,然后创建ZygoteServer (Socket)然后调用socket的runselectLoop方法开始等待AMS的消息。
image.png
SystemServer启动流程
image.png
1、创建SystemServiceManager
2、10.0之前直接启动AMS服务,10.0之后多了一个ActivityTask
ManagerService服务
通过反射创建ActivityTaskManagerService.Lifecycle.class ,在lifecycle的构造方法里创建ActivityTaskManagerService 然后调用lifecycle的onStart方法 ,在start方法里调用publishBinderService方法将ATM添加到ServiceManager里
在创建activityTaskManagerService时创建一个ClienLifeCycleManager 生命周期管理类
接下来通过同样的方式创建AMS
然后调用ATM.initialize方法
在这个方法调用了createStackSupervisor方法创建ActivityStackSuperVisor对象,此对象是我们的栈管理对象。
在调用setRecentTask方法,设置当前任务栈,就是看当前有哪些应用在运行的栈。
Ams调用setSystemProcess方法将AMS保存到systemServiceManager中。
AMS.systemReady方法会去启动luncher桌面应用
WMS:
image.png
Activity启动流程
Activity.startActivity->startActivityForUser>instrumention.execuStartActivity -> ATM->判断进程是否存在:
存在->realStartActivityLocked 首先获取clientLifeCycleManager,获取一个clientTransaction去执行生命周期的onCreate和onResume方法
image.png
不存在->mService .startProcessAsync 用socket通知zygote去fork新的进程。在AMS里调用startProcess方法去调用Process里面的ZygoteProcess的start方法,然后创建localSocket去通知zygote进程创建新的进程,Activity通过Attach application将把他的ApplicationThread给到AMS,然后Ams拿到ApplcationThread后就可以通过他进入到App进程,去处理它的生命周期。
网友评论