android 的启动 分为三个阶段
对于Android整个启动过程来说,基本可以划分成三个阶段:Bootloader引导、Linux kernel启动、Android启动。
第一部分:Bootloader启动
常用 U_Boot启动,启动过程中AP需要关心CP的启动。 涉及到涉及到CP的image和唤醒
启动过程中,包含一些上电引导。(手机的刷机,盒子的U盘升级 浙江贝尔鸟巢盒子)
BOX 检测U盘根目录 中的 update.zip
最终 load boot.img
说明:加电后,CPU将先执行bootloader程序,此处有三种选择
a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写
b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写
c)开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)
第二部分:Linux启动
一、zImage是怎样炼成的?
二、linux的c启动阶段
linux内核编译之后产生的最终文件 zImage
经过解压缩和汇编启动两个阶段,将会进入init/Main.c中的start_kernel()函数去继续执行。启动init进程。
init进程是linux起来之后启动的第一个用户进程,android系统也就是在这个进
程的基础上启动的。进程号是1。
第三部分:Android启动
一、init进程
二、init启动的各种服务
三、android启动图示
3. 1. init.rc 文件解析 和 服务启动。
init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,
并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程。
启动过程就是代码init.c中main函数执行过程:system\core\init\init.c 在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听……
下面看两个重要的过程:rc
3.1.1 rc文件解析
.rc文件是Android使用的初始化脚本文件 (System/Core/Init/readme.txt中有描述:
four broad classes of statements which are Actions, Commands, Services, and Options.)
其中Command 就是系统支持的一系列命令,如:export,hostname,mkdir,mount,等等,其中一部分是 linux 命令,
还有一些是 android 添加的,如:class_start <serviceclass>: 启动服务,class_stop <serviceclass>:关闭服务,等等。
其中Options是针对 Service 的选项的。
系统初始化要触发的动作和要启动的服务及其各自属性都在rc脚本文件中定义。 具体看一下启动脚本:\system\core\rootdir\init.rc
在解析rc脚本文件时,将相应的类型放入各自的List中:
\system\core\init\Init_parser.c :init_parse_config_file( )存入到
action_queue、 action_list、 service_list中,解析过程可以看一下parse_config函数,类似状态机形式挺有意思。
这其中包含了服务:adbd、servicemanager、vold、ril-daemon、debuggerd、surfaceflinger、zygote、media……
2 服务启动
文件解析完成之后将service放入到service_list中。
文件解析完成之后将service放入到service_list中。
\system\core\init\builtins.c
Service的启动是在do_class_start函数中完成:
int do_class_start(int nargs, char **args) { service_for_each_class(args[1], service_start_if_not_disabled); return 0; }
遍历所有名称为classname,状态不为SVC_DISABLED的Service启动
init ----启动>ServiceManager(守护进程)
---启动> Zygote (app_main.app) ----> androidRuntime.cpp(启动Runtime) ----JNI call>zygoteInit.java ---main Jni call> SystemServer.java
SystemServer --- main
--- init1 ----call>com_android_server_systemserver.cpp 和 system_init.cpp --->call init2
--- init2 ---->Runtime call static ServiceThread
ServiceThread 包括wms pms ams 等等 系统的服务
其余addservice的过程类似,只是启动的不同服务罢了,后面还启动了很多
服务,如:Lights、Vibrator、Alarm、Sensor、Bluetooth、Input Method、NetStat、NetworkManagement、Connectivity、Mount、Notification、Audio等。在这些服务都启动完了之后。
…
…
… // run()函数的后半部分
// It is now time to start up the app processes...
使用xxx.systemReady()通知各个服务,系统已经就绪。
Home在
((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(.)
函数调用的过程中启动,其中systemReady()的参数是一段callback代码,
这个函数的实现部分在文件:ActivityManagerService.java中。
public void systemReady(final Runnable goingCallback) {
…
if (mSystemReady) {
if (goingCallback != null) goingCallback.run();
return; // 执行回调
}
…
resumeTopActivityLocked(null);
}
private final boolean resumeTopActivityLocked(HistoryRecord prev) {
…
if (next == null) {
// There are no more activities! Let's just start up the
// Launcher...
return startHomeActivityLocked();
}
…
}
private boolean startHomeActivityLocked() {
…
if (aInfo != null) {
…
if (app == null || app.instrumentationClass == null) {
intent.setFlags(intent.getFlags() |
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityLocked(null, intent, null, null, 0, aInfo,
null, null, 0, 0, 0, false, false); // 这里启动home
}
}
…
}