Android启动流程
来源:互联网 发布:商桥2016软件下载 编辑:程序博客网 时间:2024/06/06 05:04
1、当你按下电源开关后Android设备执行了以下步骤
此处图片中step2中的一个单词拼写错了,Boot Loaeder应该为Boot Loader
第一步:启动电源以及系统启动
当电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序到RAM,然后执行。
第二步:引导程序
引导程序是在Android操作系统开始运行前的一个小程序。引导程序是运行的第一个程序,因此它是针对特定的主板与芯片的。设备制造商要么使用很受欢迎的引导程序比如redboot、uboot、qi bootloader或者开发自己的引导程序,它不是Android操作系统的一部分。引导程序是OEM厂商或者运营商加锁和限制的地方。
引导程序分两个阶段执行:
- 第一个阶段,检测外部的RAM以及加载对第二阶段有用的程序;
- 第二阶段,引导程序设置网络、内存等等。这些对于运行内核是必要的,为了达到特殊的目标,引导程序可以根据配置参数或者输入数据设置内核。
Android引导程序可以在\bootable\bootloader\legacy\usbloader
找到。
传统的加载器包含的个文件,需要在这里说明:
- init.s初始化堆栈,清零BBS段,调用main.c的_main()函数;
- main.c初始化硬件(闹钟、主板、键盘、控制台),创建linux标签。
第三步:内核
Android内核与桌面linux内核启动的方式差不多。内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。
第四步:init进程
init是第一个进程,我们可以说它是root进程或者所有进程的父进程。init进程有两个责任,一是挂载目录,比如/sys、/dev、/proc,二是运行init.rc脚本。
- init进程可以在
/system/core/init
找到。 - init.rc文件可以在
/system/core/rootdir/init.rc
找到。 - readme.txt可以在
/system/core/init/readme.txt
找到。
对于init.rc文件,Android中有特定的格式以及规则。在Android中,我们叫做Android初始化语言。
Android初始化语言由四大类型的声明组成,即Actions(动作)、Commands(命令)、Services(服务)、以及Options(选项)。
Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。
Service(服务):服务是init进程启动的程序、当服务退出时init进程会视情况重启服务。
Options(选项)
选项是对服务的描述。它们影响init进程如何以及何时启动服务。
咱们来看看默认的init.rc文件。这里我只列出了主要的事件以及服务。
Table
Action/Service描述on early-init设置init进程以及它创建的子进程的优先级,设置init进程的安全环境on init设置全局环境,为cpu accounting创建cgroup(资源控制)挂载点on fs挂载mtd分区on post-fs改变系统目录的访问权限on post-fs-data改变/data目录以及它的子目录的访问权限on boot基本网络的初始化,内存管理等等service servicemanager启动系统管理器管理所有的本地服务,比如位置、音频、Shared preference等等…service zygote启动zygote作为应用进程在这个阶段你可以在设备的屏幕上看到“Android”logo了。
第五步:虚拟机
在Java中,我们知道不同的虚拟机实例会为不同的应用分配不同的内存。假如Android应用应该尽可能快地启动,但如果Android系统为每一个应用启动不同的Dalvik虚拟机实例,就会消耗大量的内存以及时间。因此,为了克服这个问题,Android系统创造了”Zygote”。Zygote让Dalvik虚拟机共享代码、低内存占用以及最小的启动时间成为可能。Zygote是一个虚拟器进程,正如我们在前一个步骤所说的在系统引导的时候启动。Zygote预加载以及初始化核心库类。通常,这些核心类一般是只读的,也是Android SDK或者核心框架的一部分。在Java虚拟机中,每一个实例都有它自己的核心库类文件和堆对象的拷贝。
Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的Android运行空间,初始化建立的Service都是Navtive service。
Zygote加载进程
- 加载ZygoteInit类,源代码:
/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
- registerZygoteSocket()为zygote命令连接注册一个服务器套接字。
- preloadClassed “preloaded-classes”是一个简单的包含一系列需要预加载类的文本文件,你可以在<Android Source>/frameworks/base找到“preloaded-classes”文件。
- preloadResources() preloadResources也意味着本地主题、布局以及android.R文件中包含的所有东西都会用这个方法加载。
在这个阶段,你可以看到启动动画。
第六步:系统服务或服务
完成了上面几步之后,运行环境请求Zygote运行系统服务。系统服务同时使用native以及java编写,系统服务可以认为是一个进程。同一个系统服务在Android SDK可以以System Services形式获得。系统服务包含了所有的System Services。
Zygote创建新的进程去启动系统服务。你可以在ZygoteInit类的”startSystemServer”方法中找到源代码。
核心服务:
- 启动电源管理器;
- 创建Activity管理器;
- 启动电话注册;
- 启动包管理器;
- 设置Activity管理服务为系统进程;
- 启动上下文管理器;
- 启动系统Context Providers;
- 启动电池服务;
- 启动定时管理器;
- 启动传感服务;
- 启动窗口管理器;
- 启动蓝牙服务;
- 启动挂载服务。
其他服务:
- 启动状态栏服务;
- 启动硬件服务;
- 启动网络状态服务;
- 启动网络连接服务;
- 启动通知管理器;
- 启动设备存储监视服务;
- 启动定位管理器;
- 启动搜索服务;
- 启动剪切板服务;
- 启动登记服务;
- 启动壁纸服务;
- 启动音频服务;
- 启动耳机监听;
- 启动AdbSettingsObserver(处理adb命令)。
第七步:引导完成
一旦系统服务在内存中跑起来了,Android就完成了引导过程。在这个时候“ACTION_BOOT_COMPLETED”开机启动广播就会发出去。
2、3阶段
以上7步骤,可分为3阶段
- 引导阶段(Bootloader启动):s1、s2
- 内核阶段(Linux启动):s3
- Android阶段(Android启动):s4及以后
http://blog.jobbole.com/67931/
http://blog.csdn.net/zirconsdu/article/details/8574049
http://www.linuxidc.com/Linux/2011-04/33966p8.htm
- Android启动:Linux启动流程
- Android启动:Linux启动流程
- Android启动:Linux启动流程
- android 启动流程(英文)
- android 启动流程(中文)
- 转 android 启动流程
- Android启动流程
- android 启动流程 转载
- android 启动流程
- android 启动流程
- android framework 启动流程
- android framework 启动流程
- android 启动流程
- Android 的启动流程
- android启动的流程
- Android SystemServer 启动流程
- Android 启动流程
- Android 的启动流程
- Android4.0 Launcher 源码分析1——Launcher整体结构
- Android4.0 Launcher 源码分析3——WorkSpace结构(滑动)
- java 蓝桥杯 奇怪的比赛
- Android4.0 Launcher拖拽原理分析
- ffwt进行fft
- Android启动流程
- Android系统架构
- java内存模型
- 多线程编程——java
- 安装Cygwin时,快速的站点选择
- 多线程编程——线程同步与异步
- 【webpack】-- 自动刷新
- 多线程编程——线程同步方法
- 用360加固app后上传需要重新签名