1.APP启动流程
启动流程:
- ①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
- ②system_server进程接收到请求后,向zygote进程发送创建进程的请求;
- ③Zygote进程fork出新的子进程,即App进程;
- ④App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
- ⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
- ⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
- ⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
- ⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面
1. Android开机流程
-
BootLoader引导:
当按开机键的时候,引导芯片开始从固化在ROM的预设代码开始执行,然后加载引导程序到RAM
BootLoader,又称为引导程序。它是在操作系统运行之前运行的一段程序
BootLoader负责初始化软件运行所需要的最小硬件环境,最后加载内核到内存 -
启动Kernel:
这个入口的函数是start_kernel函数
start_kernel函数执行到最后调用了reset_init函数进行后续的初始化
start_kernel最终启动用户空间的init程序 -
启动Android:
当初始化内核之后,init进程负责解析init.rc配置文件, 就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都是由init进程直接或间接fork出来的
* /system/bin/app_process_Zygote服务启动的进程名
* --start-system-server 表明Zygote启动完成后,需要启动System_Server进程
* socket zygote stream 666在Zygote启动时,创建一个权限为666的socket。此socket用来请求zygote创建新进程
* socket的fd保存在名称为"ANDROID_SOCKET_zygote"的环境变量中
init进程负责创建系统中最关键的几个核心daemon(守护)进程,尤其是zygote和System_Server进程
1. zygote进程 android启动的第一个Dalvik 虚拟机,它将负责启动Java世界的进程
2. zygote虚拟机启动子进程system_server,同时也可以看出zygote中定义了一个Socket,绑定666端口,用于接收ActivityManagerService启动应用程序的请求
3. System_Server进程 <