1.启动电源以及系统启动
按下电源,加载引导程序BootLoader到RAM
2.引导程序BootLoader
BootLoader拉起系统OS
3.Linux内核启动
内核启动,设置缓存等,寻找init.rc文件,并启动init进程
4.init进程(Android第一个进程)
1.创建和挂载启动所需的文件目录
2.初始化和启动属性服务
3.设置子进程信号处理函数,防止子进程出现僵尸进程,资源有限僵尸进程会导致无法创建进程
4.解析init.rc配置文件并启动ServiceManager进程后启动Zygote进程
init.rc配置文件是由Android初始化语言Android Init Language
5.Zygote进程启动流程
创建java虚拟机并注册JNI方法(因为ZygoteInit的main方法是由Java语言编写的,当前的运行逻辑在Native中,就需要用JNI调用Java,使Zygote从Native层到Java层)
通过JNI调用ZygoteInit的main方法后红Native层进入到Java层
创建Socket,等待AMS请求创建新的应用程序进程(不选用Binder的原因,多线程情况不能使用fork会导致死锁)
预加载系统类prelaod()(Dialog Intent等)通过反射
forkSystemServer进程
6.SystemServer
1.创建PathClassLoader
2.启动Binder线程池,为了使SystemServer中的服务可以与其他进程通信
3.通过抛出异常的形式调用SystemServer.main方法(抛出异常的处理会清理所所有的设置过程需要的堆栈帧)
4.SystemServer.main中创建系统的Context、启动一些服务包括AMS、PMS、WMS等
5.调用AMS启动Launcher显示系统桌面
7.应用程序启动流程
Launcher进程向AMS请求创建根Activity(Binder)
AMS会判断根Activity所需的应用程序进程是否存在并启动
如果不存在就会请求Zygote进程创建应用程序进程(Socket)
应用程序进程启动后,AMS会请求创建应用程序并启动跟Activity(Binder)
1.应用程序进程启动流程
AMS请求Zygote创建应用程序进程,调用Activity.main。创建主线程Looper、创建主线程H类继承自Handler,用于处理主线程的消息循环。
2.应用程序启动流程
AMS通过Binder与ApplicationThread通信。ApplicationThread是ActivityThread的内部类。向H类发送类型为LAUNCH_ACTIVITY的消息,会调用performLaunchActivity创建context、Instrumentation.newActivity创建Activity、创建Application(内部调用Application的onCreate)、创建PhoneWindow关联Activity,最后调用Instrumentation.callActivityOnCreate启动Activity
网友评论