Android应用程序启动简述

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容