您的位置:首页 > 移动开发 > Android开发

Android启动过程学习总结

2015-07-30 17:55 447 查看
本文是在以前上课笔记的基础上,根据网上大量博文总结,以自己的理解进行梳理而来。

Android整个启动过程来说,基本可以划分成三个阶段:Bootloader引导、Linux kernel启动、Android启动。

第一部分:Bootloader启动

一、BootLoader是在操作系统运行之前运行的一段程序。它可以将系统的软硬件环境带到一个合适状态,为运行操作系统做好准备。终极目标就是把OS拉起来运行。关于Bootloader的理解:/article/2890014.html

二、启动时bootloader根据按键或重启前设置决定进入哪种启动模式:1,正常启动,2,Recovery模式 3,fastboot(快速刷机模式) 。关于启动模式的理解:http://blog.csdn.net/mu0206mu/article/details/7464699

第二部分:Linux启动

一、即加载系统内核,包括加载驱动,启动硬件。

二、正常启动加载的文件为boot.img,Recovery模式加载的文件是recovery.img 它们加载linux内核的过程是一样的。 linux启动理解:/article/2890015.html

第三部分:Android启动

一、init进程做的事情:1,一系列工作包括servicemanager[管理服务]和zygote(SystemServer)[启动服务]
2.最后启动一个PropertyService,提供服务

二、一系列工作包括 bootanim与开机动画相关,与动画相关的服务SurfaceFlinger服务也是由SystemServer启动。理解:/article/8188403.html

三、android启动完成或者说开机动画完成时启动Launcher。 理解:/article/2890016.html

参考网址:

1, Android系统启动流程(3):/article/2890014.html

2 , Android OTA 升级(5) : http://blog.csdn.net/zjujoe/article/category/697584
3, Android系统Recovery工作原理之使用update.zip升级过程分析(9):http://blog.csdn.net/mu0206mu/article/category/1059752

4, 安卓修改开机动画
/article/8188403.html

5, 很有用的知识 Android 系统升级那些事儿:/article/7641382.html

-------------------------------------------------------以下为上课笔记--------------------------------------------------------

1.1.Linux层启动

在开发中我们可以把andorid系统分成两层:Linux层和android层,或者三层,另外一层为DalvikVM层.在开机启动时,系统先启动Linux内核,即加载驱动,启动硬件.
相关知识:1.Dalvik VM是基于寄存器的,每个app一个单独的VM

1.2.android启动init进程

linux内核完成之后启动第一个进程init进程,这个进程为用户级进程,是引导进程(启动模拟器,adbshell用ps命令查看,init进程的pid=1).init所做的事为做一系列初始化工作包括:mkdir
mount sdcard ...rild(通话modem) bootsound bootanim servicemanager zygote其中servicemanager和zygote是最重要的两个.只有这个两个进程起来之后才会建立一个Android空间.init运行完之后,并不会结束,还会启动一个PropertyService,提供服务.
Init进程所在的文件:system/core/init/inti.c

1.3.servicemanager

作用:管理android中的所有服务

1.4.zygote过程

做三件事情:1create runtime 2 create vm 3 create all applications

1.4.1.create runtime

执行framework层中:main_runtime.cpp(所在目录为frameworks\base\cmds\runtime\main_runtime.cpp)在这里启动了SystemServer
代码:#ifndefHAVE_ANDROID_OS
QuickRuntime*runt = new QuickRuntime();
runt->start("com/android/server/SystemServer",
false /*spontaneously fork system server from zygote */);
#endif

1.4.2.SystemServer之init1()

frameworks\base\services\java\com\android\server\SystemServer.java
在SystemServer中,首先,jni调用nativeinit1():
frameworks\base\services\jni\com_android_server_SystemServer.cpp sytem_init(); c---> c(c代码调用c代码)进入cmds
frameworks\base\cmds\system_server\library\system_init.cpp
system_init.cpp中完成了:
1实例化了6个service.
SensorService::instantiate(); 与硬件相关
2实例化运行时AndroidRuntime*runtime
= AndroidRuntime::getRuntime();
3调用SystemServerinit2()
LOGI("Systemserver: starting Android services.\n");
runtime->callStatic("com/android/server/SystemServer","init2");

1.4.3.SystemServer之init2()

实例化Java服务如:WindowmanagerAcitivtymanager等
他其中Acitivtymanager是非常重要的一个服务,其回调方法:((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(newRunnable()
做的事:

1实例化persistentapplication

2 startlauncher.等相关app第一个启动的app为输入法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: