Android启动过程分为以下几个步骤:
1. Boot ROM: 上电后启动芯片固话代码。
2. BootLoader:固话代码会根据启动模式启动bootloader,(一般为启动引脚的电平的不同,从不同的介质中启动,启动介质可以分为nor flash,nand flash, emmc等,BootLoader一般为uboot)
3. kernel:
1). 会初始化硬件
2). 根据uboot传过来的参数初始化系统
3). 加载一些必要的驱动
4). 启动两个进程init:(PID=1) kthreadd(PID=2)
4.Android:
1).挂在分区,创建目录 (init进程)
2).动态加载驱动 (int进程)
3).启动本地服务 (init进程)
4).设置系统属性 (在我看来就跟环境变量,全局变量啥的没区别)
5).启动servicemanager服务 (这个是重要的一个本地服务。用来进行服务间的binder通讯的,当该服务重启了,所有服务都会重启)
6).启动Zygote进程 (该进程由init启动,主要作用为:1.启动虚拟机(可以使用Java了),2.注册JNI(可以调用本地函数了),3.加载类资源、系统资源(使得新的应用能够更快启动),4.启动System server,5.接收从System server发过来的申请,创建新的应用程序)
7).启动System server (1.加载JAVA服务(本地服务在init进程中已经加载了),2.接收申请并发送给zygote,用来创建应用)
8).守护系统 (根据init.rc,确保某些重要的服务不会被关闭,如果关闭则重启)
其中i.mx6的uboot和kernel暂时不分析,以后再说,我们这里只说Android
首先,我们先查看一下系统的进程。
通过查看PPID,我们可以发现,大部分进程都是由init,kthreadd,zygote生成的。
init: 其init进程也是整个Android的第一个进程,从kernel启动,使系统正式从内核空间转到用户空间了。PID为1
kthreadd:为也是kernel启动的进程。PID为2
zygote: PID为133
/init生成了:
/sbin/ueventd
/sbin/watchdogd
/system/bin/logd
/sbin/healthd
/system/bin/lmkd
/system/bin/servicemanager (通过binder进行通讯的服务)
/system/bin/vold
/system/bin/surfaceflinger (显示管理服务)
/system/bin/sh
/system/bin/netd (网络管理服务)
/system/bin/debuggerd
/system/bin/drmserver
/system/bin/mediaserver (多媒体服务)
/system/bin/installd (应用安装服务)
/system/bin/keystore
/system/bin/rild
zygote (zygote:第一个Java程序)
/system/bin/sdcard
/sbin/adbd (adb服务)
这里的zygote为init生成的
kthreadd:看到了一个binder进程
zygote生成了:(全是JAVA进程)
system_server
com.android.systemui
android.process.media
com.android.inputmethod.latin
com.android.phone
com.android.launcher
com.android.deskclock
com.estrongs.android.pop
com.android.keychain
com.microchip.calibration
com.android.providers.calendar
com.android.managedprovisioning
com.android.onetimeinitializer
com.android.settings
com.android.calendar
后面接着的
i.mx6 Android5.1.1 系统属性
i.mx6 Android5.1.1 初始化流程之init进程
i.mx6 Android5.1.1 初始化流程之init.rc解析
i.mx6 Android5.1.1 初始化流程之zygote