Android系统以及app的启动过程

  • 常见概念(安卓手机在启动的时候做的一些事情)
  • Android app 的启动过程


android kernel日志 android kernel详解_Server


android kernel日志 android kernel详解_android kernel日志_02

常见概念(安卓手机在启动的时候做的一些事情)

1 bootloader:是硬件启动的引导程序,主要作用在于为硬件准备好相应的操作环境,为操作系统准备好环境,和windows的Bios差不。
2 kernel 编译内核,kernel层是指Android内核层,到这里才刚刚开始进入Android系统。作用:
(1)启动Kernel的swapper进程,该进程又称为idle进程, 系统初始化过程Kernel由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作。
(2)启动kthreadd进程(pid=2):是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。kthreadd进程是所有内核进程的鼻祖。
3 Native层,这里的Native层,启动init进程,主要包括init孵化来的用户空间的守护进程、HAL层以及开机动画等。启动init进程(pid=1),是Linux系统的用户进程,init进程是所有用户进程的鼻祖。
(1)init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程(即虚拟机进程),Zygote是所有Java进程的父进程。
(2)启动servicemanager(binder服务管家)、bootanim(开机动画)等重要服务,孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程。
( 3 ) 启动android runningTime,Zygote会孵化出一个超级管理进程—System Server. SystemServer会启动所有系统核心服务, 例如Activity Manager Service, 硬件相关的Service等. 到此, 系统准备好启动它的第一个App进程—Home进程了.
4 FrameWorker(C++,C) 层
(1)Zygote进程启动后,加载ZygoteInit类,注册Zygote Socket服务端套接字;加载虚拟机;加载类,加载系统资源。
(2)System Server进程,是由Zygote进程fork而来,System Server是Zygote孵化的第一个进程,System Server负责启动和管理整个Java framework,包含ActivityManager,PowerManager等服务。
(3)Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务
5 Application层
(1)Zygote进程孵化出的第一个App进程是Launcher,即手机桌面APP,没错,手机桌面就是跟我们平时使用的APP一样,它也是一个应用
(2)所有APP进程都是由zygote进程fork出来的
资料参考: 从源码解析-Android系统启动流程概述资料参考:Android runtime机制

Android app 的启动过程

首先让我们来看一下这个图:

android kernel日志 android kernel详解_Android_03


之前说到,native层的init进程会启动Zygote进程.然后Zygote会孵化出一个超级管理进程:system services,这个进程会启动AMS,WMS,PMS等所有系统核心服务.我们知道,桌面就是一个大应用.当点击应用图标时,就相当于是触发了点击事件:调用startActivity(Intent), 通过Binder IPC机制,最终调用到Activity Manager Services,AMS作为一个守护进程存在于FrameWork层中。AMS,主要进行如下几个操作:

1、判断这个intent要跳到哪里去。

2、判断用户有没有足够的权限去调用这个intent指向的Acty。如果有权限,AMS会在新的task中启动目标activity,也就是我们在App manifast里面配置的程序入口。

3、接着去检查这个进程的ProcessRecord是否存在,如果ProcessRecord是null, ActivityManagerService会创建新的进程来实例化目标activity.

4、经过一系列操作,最后调用startProcessLocked方法通过Socket通道传递参数给Zygote进程。

(资料参考:https://www.jianshu.com/p/12de32b31836)

接下来,Zygote进程会通过Zygote.main()方法,产生一个新的进程,并且返回pid,然后调用ActivityThread的main方法,(也就是相当于启动ActivityThread)来实例化ActivityThread对象.并执行attach方法。同时创建主线Looper(Looper.prepareMainLooper()),并开启循环(Looper.loop)。

(中场休息一下)