目录
3 Zygote进程创建应用程序进程,同时创建应用程序的Binder线程池
4 应用程序发送请求到AMS中,将ApplicationThread绑定AMS
6 ActivityThread的Handler处理启动Activity的请求
一 Android 系统启动流程(开机过程)
1.Bootloader引导
- 当电源按下时,引导芯片代码 从 ROM (4G)开始执行。Bootloader引导程序把操作系统映像文件拷贝到RAM中去,然后跳转到它的入口处去执行,启动Linux内核
- Linux kernel内核启动,会做设置缓存,加载驱动等一些列操作
- 当内核启动完成之后,启动init进程,作为第一个系统进程,init进程从内核态转换成用户态
2.init进程启动
- 文件目录的创建及挂载,属性服务的创建
- fork出ServerManager子进程。 ServerManager主要用于管理我们的系统服务,他内部存在一个server服务列表,这个列表中存储的就是那些已经注册的系统服务
- 解析init.rc配置文件并启动Zygote进程
3 Zygote进程启动
在zygote进程中,它是Java层进程的鼻祖,其中,做了很多事情:
- 初始化AndroidRuntime环境
- 设置为zygote启动模式
- 启动zygoteInit 通过runtime.start(),在start函数中也做了很多事情
- startVm创建虚拟机
- startReg注册JNI方法
- 使用JNI调用ZygoteInit的main()函数,进入Java世界
在main方法中做了一些事情:
(1)预加载信息(加载了一部分framework资源以及常用的java类),加快了后面应用进程的启动速度(可以直接使用前面的预加载信息)
(2)创建Socket进程通信机制
(3)创建systemserver进程,执行systemserver main方法
(4)zygote进入无线循环,等待AMS给它发送通知,fork应用程序进程
4 SystemServer进程启动
在zygote进程创建system_server进程后,在system_server进程中我们启动了binder线程池ams,wms,等
通过反射调用SystemServer.main(),比较重要的几件事
1 加载动态库
2 创建系统上下文
3 创建SystemServerManager(这个是管理这些SystemServer的生命周期的),startServer()
3.1 反射创建服务
3.2 执行服务的onStart方法
3.3 返回该服务的对象
4 启动系统引导服务,并且添加到ServerManager中
4.1 ATM的启动(android 10以后才有)
4.2 AMS的启动
4.3 PMS的启动
4.4 PKMS的启动
5 启动核心服务:电池服务
6 启动其他服务
6.1 WMS服务
6.2 启动桌面
5 .Launcher进程启动
AMS服务中启动一个Launcher应用程序,Launcher启动后会将已经安装的应用程序图标显示在界面上,此时整个Android的开机过程完成。
二 Android系统中,点击桌面图标到应用启动的流程
1 Launcher进程请求AMS(跨进程)
点击图标发生在launcher应用的进程,实际上执行的是Launcher的onClick方法,在onClick中执行Activity.startActivity--->Activity.startActivityForResult--->mInstrumentation.execStartActivity
1.1Instrumentation在android 7.0及以下调用ActivityManagerProxy的startActivity()方法,在android 8.0及以上是调用到IActivityManager的startActivity()方法
1.2 在android7.0及以下是通过ActivityManagerProxy的startActivity()方法远程代理的方式调用到ActivityManagerService中,在android8.0及以上是通过AIDL的方式调用IActivityManager然后调用到AMS中
2 AMS发送创建应用进程请求到zygote进程
2.1 AMS-->ActivityStarter ActivityStarter:是activity的控制类,7.0新增的类,主要将收集到的Intent和flags信息转换成Activity,并将Task和Stack(管理所有的Activity)相关联
2.2 调用到ActivityStarterSupervisor中,判断当前启动的activity所在的进程是否存在
2.3 不存在则调用AMS的startProcessLocked
2.4 通过Socket链接向zygote进程发送创建应用程序进程的请求
3 Zygote进程创建应用程序进程,同时创建应用程序的Binder线程池
3.1 zygote进程在runSelectLoop方法中等待AMS通知
3.2 接收到AMS请求,调用forkAndSpecialize方法fork出应用程序进程
3.3 在nativeZygoteInit方法中为应用程序创建Binder线程池
3.4 通过反射获得ActivityThread类并调用main方法,进入应用程序进程
4 应用程序发送请求到AMS中,将ApplicationThread绑定AMS
4.1 应用程序进程在main方法中,创建ApplicationThread,looper,handler对象,并开启主线程消息循环
4.2 调用ActivityThread.attach方法,通过跨进程调用IActivityManager的attachApplication方法,进入到AMS中,将AMS绑定ApplicationThread对象,控制应用程序进程
5 AMS发送启动Activity的请求
5.1 AMS.attachApplication()--->ActivityStackSupervisor-->IApplicationThread.realStartActivityLocked进入到应用程序进程的binder线程池中
5.2 应用程序进程的ApplicationThread收到AMS请求,通过Handler向主线程发送消息(LAUNCHER_ACTIVITY)
6 ActivityThread的Handler处理启动Activity的请求
6.1 主线程收到消息后,通过反射创建Activity,并回调onCreate生命周期
到此,App便正式启动,开始进入生命周期,UI渲染结束后便可以看到App的主界面
关注公众号:Android老皮
解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版
内容如下:
1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路
敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔