android系统开机启动流程分析
Android之Activity启动流程详解(基于api28)
Android之Activity启动流程详解(基于api28)前⾔
Activity作为Android四⼤组件之⼀,他的启动绝对没有那么简单。这⾥涉及到了系统服务进程,
启动过程细节很多,这⾥我只展⽰主体流程。activity的启动流程随着版本的更替,代码细节⼀
直在进⾏更改,每次都会有很⼤的修改,如android5.0 android8.0。我这⾥的版本是基于
android api28,也是⽬前我可以查得到的最新源码了。事实上⼤题的流程是相同的,掌握了⼀
个版本,其他的版本通过源码也可以很快地掌握。
因为涉及到不同的进程之间的通信:系统服务进程和本地进程,在最新版本的android使⽤的是AIDL来跨进程通信。所以需要对AIDL有⼀定的了解,会帮助理解整个启动流程。
源码部分的讲解涉及到很多的代码讲解,可能会有⼀点不适,但还是建议看完源
码。源码的关键代码处我都会加上注释,⽅便理解。
代码不会过分关注细节,只注重整体流程。想知道具体细节可以去查看源码。每份
代码所在的路径我都会在代码前⾯标注出来,各位可以去查看相对应的源码。
每部分源码前我都会放流程图,⼀定要配合流程图⾷⽤,不然可能会乱。
整体流程概述
这⼀部分侧重于对整个启动流程的概述,在⼼中有⼤体的概念,这样可以帮助对下⾯具体细节
流程的理解。
普通Activity的创建
普通Activity创建也就是平常我们在代码中采⽤startActivity(Intent intent)⽅法来创建Activity的⽅式。
总体流程如下图:
启动过程设计到两个进程:本地进程和系统服务进程。本地进程也就是我们的应⽤所在进程,
todo高通AndroidUEFI中的LCD分析(1):启动流程分析
todo⾼通AndroidUEFI中的LCD分析(1):启动流程分析背景
之前学习的lk阶段点亮LCD的流程算是⽐较经典,但是⾼通已经推出了很多种基于UEFI⽅案的启动架构。
所以需要对这块⽐较新的技术进⾏学习。
同事遇到了⼀个UEFI阶段LCD显⽰异常,⽽kernel正常的问题;但我解决不了。
分析
在⾼通UEFI架构中,通过Protocol来调⽤对应的功能。因此实际上的函数调⽤并不是显式的,⽽是包裹在Protocol中进⾏。
⾼通UEFI显⽰有关的⽂件有:
BOOT.XF.4.1/boot_images/QcomPkg/Drivers/DisplayDxe/DisplayDxe.c
BOOT.XF.4.1/boot_images/QcomPkg/Application/QcomChargerApp/QcomChargerAppDisplay.c
BOOT.XF.4.1/boot_images/QcomPkg/Application/QcomChargerApp/QcomChargerAppDisplay.h
BOOT.XF.4.1/boot_images/QcomPkg/Drivers/DisplayDxe/DisplayDxe.c
BOOT.XF.4.1/boot_images/QcomPkg/Drivers/DisplayDxe/DisplayDxe.h
BOOT.XF.4.1/boot_images/QcomPkg/Drivers/DisplayDxe/DisplayDxe.inf
BOOT.XF.4.1/boot_images/QcomPkg/Drivers/DisplayDxe/DisplayPwrCtrlProtocol.c
android启动流程
android启动流程
Android启动流程:
Android是一款广泛使用的移动操作系统,其启动流程是一个
相对复杂的过程,涉及到多个模块的加载和启动。下面将详细介绍Android的启动流程。
1、开机自检(Boot)
当手机开机时,首先进行开机自检。在这个阶段,系统会检测硬件设备的状态,包括电池是否齐全、屏幕是否正常等。如果硬件设备通过了自检,系统将会开始启动。
2、引导加载程序(Bootloader)
开机自检完成后,系统会加载引导加载程序(Bootloader)。
引导加载程序是硬件平台的一部分,其主要作用是启动操作系统。在加载引导加载程序的过程中,系统会自动检测手机的存储器设备,确定存储设备中是否有可用的引导文件。
3、Linux内核加载
一旦引导加载程序找到可用的引导文件,系统将会加载Linux
内核。Linux内核是Android系统的核心组件,负责管理内存、文件系统、驱动程序等。
4、文件系统加载
一旦Linux内核加载完成,系统将会加载文件系统。Android
系统使用的是基于Linux的文件系统,在这个过程中,系统会
加载并初始化各个文件系统,包括根文件系统、系统文件系统、
数据文件系统等。
5、初始化进程(Init)
一旦文件系统加载完成,系统将会启动初始化进程(Init)。初始化进程是Android系统的第一个进程,其作用是启动系统的各个进程和服务。
6、启动用户空间(System Server)
在初始化进程启动后,系统会启动用户空间,加载系统的用户界面等组件。
7、启动应用程序
一旦用户空间加载完成,系统将会启动应用程序。应用程序是Android系统的核心功能,包括系统应用程序和用户安装的应用程序。系统应用程序包括电话、短信、浏览器等,而用户安装的应用程序则是用户根据自己的需求下载和安装的。
手机开机的原理
手机开机的原理
手机开机的原理是指手机从关机状态转换为开机状态的过程。开机过程主要包括电源接通、硬件初始化、系统启动等步骤。
首先,当用户按下手机的电源键时,电源系统接通,电源开始为手机提供电能。此时,手机的电源管理芯片开始工作,向各个部件提供合适的电压和电流。
接着,手机的硬件部件进行初始化。这包括各个硬件组件的自检和初始化,如处理器、内存、存储器、显示屏等。处理器会检测硬件状态,初始化寄存器和其他器件,确保各个硬件组件工作正常。
然后,手机系统启动。一般来说,手机的系统存储在闪存中,当电源接通后,处理器会加载系统内核到内存中,并执行。系统内核会进行一系列的初始化操作,包括初始化文件系统、加载驱动程序、启动各个系统服务等。
最后,手机进入待机状态,用户可以开始使用手机进行各种操作。在待机状态下,手机会监测各种输入事件,如用户触摸屏幕、按下按键等,以响应用户的操作。
总体而言,手机开机的原理可以归纳为电源接通、硬件初始化和系统启动三个主要步骤。通过这些步骤,手机能够从关机状态快速切换为开机状态,为用户提供各种功能和服务。
手机开机的工作原理
手机开机的工作原理
手机开机的工作原理是通过一系列操作和调度来启动系统并准备手机的各种功能。以下是手机开机的一般工作原理:
1. 按下手机的电源按钮。当用户按下手机的电源按钮时,电源管理芯片会接收到相应的信号,并开始供电。
2. 电源管理芯片供电。电源管理芯片会为手机的各个组件供电,包括处理器、内存、显示屏等。同时,电源管理芯片还会检测电池电量,并向处理器发送相应的信息。
3. 处理器初始化。在供电之后,处理器会接收到电源管理芯片发送的信号,并开始初始化。处理器首先会进行一系列自检程序,检测硬件设备是否正常,并配置处理器的工作状态。
4. 加载引导程序。处理器初始化完成后,会加载引导程序到内存中。引导程序是手机系统启动的第一阶段,在这个阶段,系统会进行一些基本的设置和准备工作。
5. 加载操作系统。引导程序会读取系统存储器中存储的操作系统,并将操作系统加载到内存中。加载完成后,处理器会跳转到操作系统的入口点,开始运行操作系统。
6. 初始化系统。操作系统开始运行后,会进行一系列初始化工作,包括初始化设备驱动程序、设置系统参数、加载用户界面等。
7. 启动应用程序。系统初始化完成后,会开始启动已安装的应用程序。应用程序会根据用户的设置和需求进行相应的操作和响应。
8. 显示启动界面。在应用程序启动的同时,手机的显示屏会显示启动界面,向用户显示手机正在开机的状态。
9. 开机完成。当系统和应用程序完全启动后,手机开机过程就完成了。此时,用户可以正常使用手机的各种功能。
总之,手机开机的过程是一个复杂的操作和调度过程,涉及到多个硬件组件和软件模块的配合工作。通过这个过程,手机从断电状态恢复到正常工作状态,并准备好接受用户的操作。
RK系统启动流程
RK29机型之Android系统启动流程
分类:瑞芯微RK 2012-02-12 14:50 4439人阅读评论(0) 收藏举报/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@
* /conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。
********************************************************************************************/
第一步:系统引导bootloader,即RK29xxLoaderXXX.bin文件
加电后,CPU将先执行 bootloader程序,然后bootloader首先会读寄存器地址base + APP_DATA1的内容,根据这个地址的值决定是否进入recovery模式或者其它模式。bootloader还会读取MISC分区第一块的内容,决定进入recovery模式还是升级基带Baseband Processor(BP)或做其它事情
而上述寄存器与分区的值是有按键触发或者软件触发的。
a) 开机按reset+返回键,系统进入recovery模式,加载recovery.img,recovery.img
包含内核,基本的文件系统,用于工程模式的烧写
b) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动机器(以下只分析正常启动的情况)
android系统从systemserver开始的launcher启动详细流程
android系统启动流程
——从systemserver开始的launcher
目录
1 概述: (2)
2 systemserver工作内容分析 (4)
2.1 SystemServer类简述 (4)
2.2 ServerThread类简述 (4)
3 ActivityManagerService工作内容分析 (6)
3.1 ActivityManagerService之main (7)
3.1.1创建ActivityManagerService实例 (7)
3.1.2 创建ActivityThread实例,获取全局Context (8)
3.1.3创建ActivityStackSupervisor实例 (10)
3.1.4调用startRunning (10)
3.2 ActivityManagerService之setSystemProcess (11)
3.3. ActivityManagerService之setWindowManager (12)
3.4 ActivityManagerService之systemready (12)
3.4.1 启动所有Persistent属性的APK (13)
3.4.2 启动launcher (14)
4 ActivityStackSupervisor启动launcher (15)
4.1首先回顾一下ActivityStackSupervisor实例的初始化 (15)
4.2 进入ActivityStackSupervisor.resumeTopActivitiesLocked (16)
android启动流程
android启动流程
Android启动流程。
Android系统启动流程是指Android设备在开机时,系统从无
到有的整个启动过程。了解Android启动流程对于开发者和系统维
护者来说都是非常重要的,因此本文将对Android启动流程进行详
细介绍。
1. 加电启动。
当用户按下设备的电源按钮时,电源管理芯片开始为设备供电,同时CPU开始执行启动代码。此时,设备进入了启动阶段。
2. Bootloader启动。
在加电启动后,设备会首先运行Bootloader,Bootloader是设
备的引导程序,负责初始化硬件并加载操作系统。Bootloader会检
查设备的硬件情况,然后加载操作系统内核。
3. 内核启动。
一旦Bootloader加载了操作系统内核,内核开始初始化设备的
硬件,包括CPU、内存、外设等。内核还会挂载根文件系统,并启
动init进程。
4. init进程启动。
init进程是Android系统的第一个用户空间进程,它负责启动
系统的其他进程和服务。init进程会读取init.rc文件,根据文件
中的配置启动系统服务和应用程序。
5. 系统服务启动。
在init进程启动后,系统服务会被依次启动。这些系统服务包
括SurfaceFlinger、Zygote、AMS(Activity Manager Service)、PMS(Package Manager Service)等,它们负责管理系统的各个方面,如界面显示、应用程序管理、包管理等。
6. Launcher启动。
当系统服务启动完成后,Launcher会被启动,用户可以看到设
Android 开机启动流程
Android的开机流程
1. 系统引导bootloader
1) 源码:bootable/bootloader/*
2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择
a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写
b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写
c) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)
2. 内核kernel
1) 源码:kernel/*
2) 说明:kernel由bootloader加载
3. 文件系统及应用init
1) 源码:system/core/init/*
2) 配置文件:system/rootdir/init.rc,
3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能
4. 重要的后台程序zygote
1) 源码:frameworks/base/cmds/app_main.cpp等
2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_process
Android系统服务启动顺序
Android系统服务启动顺序
Android系统服务启动顺序
系统服务启动分为三类
1. startBootstrapServices()
2. startCoreServices()
3. startOtherServices()
startBootstrapServices
1. 启动Installer服务
2. 启动ActivityManagerService,Installer服务赋值给AMS
3. 启动PowerManagerService,AMS initPowerManagement
4. 启动LightsService
5. SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY
6. 启动PackageManagerService
7. 启动SensorService
startCoreServices
1. 启动BatteryService
2. 启动UsageStatsService
3. AMS setUsageStatsManager
startOtherServices
1. 启动SchedulingPolicyService
2. 启动TelecomLoaderService
3. 启动TelephonyRegistry
4. 启动CameraService
5. 启动AccountManagerService
6. 启动ContentService
7. AMS安装系统Provider
8. 启动VibratorService
9. 启动ConsumerIrService
详解Android(安卓)手机系统启动过程
最近打算自己移植MIUI,所以自学了不少东西,分享一下,recovery刷机模式中启动到过程吧,一下所有内容均有我略读相关源码得到和总结得来,不一定完全正确,不对之处还望海涵:当我们只是按下电源键开机时,会进入正常启动模式。Secondary stage bootloader 会从boot 分区开始启动。Boot 分区的格式是固定的,首先是一个头部,然后是Linux 内核,最后是用作根文件系统的ramdisk。
当Linux 内核启动完毕后,就开始执行根文件系统中的init 程序,init 程序会读取启动脚本文件(init.rc 和init.goldfish)。
现在就来说一下,init.rc到底在做些什么,我会在附件上传有关init_rc脚本语法和自己阅读是坐下到笔记,希望对各位有所帮助。
1.on boot-pause
2. exec sbin/chargerlogo #运行sbin/chargerlogo(此运行在内核目录下)
3.
4.on early-init
5. start ueventd #调用sbin/uventd链接所指的可执行程序,其源码位于
system/core/init/ueventd.c,为设备赋予权限
6.
7.on init #源码位于system/core/init/init.c
8.#主要完成一下的工作
9.#清空umask、创建并挂载一些基本的目录(/dev-设备、/proc-系统信息、/sys-系统信
息、/dev/pts-终端控制字,用于执行adb、/dev/socket)
安卓系统启动流程
安卓系统启动流程
第一步:启动电源以及系统启用
当电源按下,引导芯片代码从指定位置(固化在ROM中)开始执行,加载引导程序到RAM,然后执行。
第二步:引导程序
引导程序是在安卓操作系统开始运行前的一个小程序,它是针对针对特定芯片与主板的,设备制造商要么使用很受欢迎的引导程序,比如redboot、uboot、qi bootloader或者自己开发的引导程序。它不是安卓操作系统的一部分。引导程序是OEM厂商和设备制造商限制和加锁的地方。
引导程序分两个阶段运行。第一阶段,检测外部的RAM以及加载对第二阶段的有用的程序;第二阶段,引导程序设置网络、内存等等。这些对于运行内核是有必要的,为了达到特殊的目标,引导程序可以根据配置参数和输入数据设置内核。
传统的加载器包含两个文件
1. init.s初始化堆栈,清零BBS段,调用main.c的_main()函数
2. mian.c初始化硬件(主板、键盘、控制台),创建Linux标签
第三步:内核
内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置,他首先在系统文件中寻找init文件,然后启动boot进程或者系统的第一个进程
第四步:init进程
init是第一个进程,可以说它是root进程或者所有进程的父进程。
init进程有两个责任:1.一是挂载目录,比如/sys、/dev、/proc,二是运行init.rc脚本init进程在/system/core/init找到
init.rc在/system/core/rootdir/init.rc找到
readme.txt在/system/core/init/readme.txt找到
Android系统初始化开始位置及流程分析
Android系统初始化开始位置及流程分析android系统的初始化过程是从那里开始呢?它在加载linux基本内核后,就开始运行一个初始化进程,叫做init进程,那么怎么样知道它是加载init进程的呢?难道上天就注定的吗?呵呵,不是的,原来是从android加载linux内核时,就设置了下面的参数:Kernel command line: noinitrd root=/dev/nfs console=ttySAC0 init=/init nfsroot=192.168.1.103:/nfsboot ip=192.168.1.20:192.168.1.103:192.168.1.1:255.255.255.0::eth0:on在这行命令里,就是告诉linux内核初始化完成后开始运行init进程,由于init进程就是放在系统根目录下面。而这个进程的代码,就是位于源码的目录system/core/init下面,现在就来仔细地分析这个进程到底做了什么事情,以便理解整个系统运行情况。在分析过程中,会学习很多有用知识,甚至linux编程知识。这么有用,还等什么呢?现在就开始,找到目录system/core/init/init.c代码,先从main函数开始,如下:#001 int main(int argc, char **argv)#002 {#003 int device_fd = -1;#004 int property_set_fd = -1;#005 int signal_recv_fd = -1;#006 int keychord_fd = -1;#007 int fd_count;#008 int s[2];#009 int fd;#010 struct sigaction act;#011 char tmp[PROP_VALUE_MAX];#012 struct pollfd ufds[4];#013 char *tmpdev;#014 char* debuggable;#015 #016 #017 act.sa_handler = sigchld_handler;#018 act.sa_flags = SA_NOCLDSTOP;#019 act.sa_mask = 0;#020 act.sa_restorer = NULL;#021 sigaction(SIGCHLD, &act, 0);在上面这段代码里,调用函数sigaction来设置处理子进程发送回来的关闭信号,其中SIGCHLD是设置子进程信号处理,SA_NOCLDSTOP是表示子进程结束时不要向父进程发送SIGCHLD,sigchld_handler是信号SIGCHLD的处理函数。这样做的作用,就是如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。因此需要对SIGCHLD信号做出处理,回收僵尸进程的资源,避免造成不必要的资源浪费。#022 #023 /* clear the umask */#024 umask(0);在上面这段代码里,调用函数umask来设置屏蔽位为0值。这样的意思是什么呢?是告诉系统做了那些工作呢?要了解这个,就得深入查看一下linux函数大全了,因为它的作用就一目了然了,它的解释如下:linux中的 umask 函数主要用于:在创建新文件或目录时 屏蔽掉新文件或目录不应有的访问允许权限。文件的访问允许权限共有9种,分别是:r w x r w x r w x(它们分别代表:用户读 用户写 用户执行 组读 组写 组执行 其它读 其它写 其它执行)。其实这个函数的作用,就是设置允许当前进程创建文件或者目录最大可操作的权限,比如这里设置为0,它的
onbootphase systemready顺序
onbootphase systemready顺序
OnBootPhase和SystemReady是Android系统启动过程中的两个重要阶段。在这两个阶段中,系统会执行一系列的操作,以确保系统能够正常启动并运行。
OnBootPhase是Android系统启动过程中的第一个阶段。在这个阶段中,系统会执行一些基本的初始化操作,例如加载内核、初始化硬件、启动服务等。这些操作都是为了确保系统能够正常启动,并为后续的操作做好准备。
在OnBootPhase阶段中,系统会按照一定的顺序执行各项操作。首先,系统会加载内核,并初始化硬件。然后,系统会启动一些基本服务,例如Zygote进程、System Server进程等。接着,系统会加载一些必要的库文件,并启动一些系统应用程序,例如Launcher、Settings等。最后,系统会启动一些第三方应用程序,例如社交网络应用、游戏等。
SystemReady是Android系统启动过程中的第二个阶段。在这个阶段中,系统会执行一些更加复杂的操作,例如加载应用程序、初始化用户界面等。这些操作都是为了确保系统能够正常运行,并为用户提供更好的体验。
在SystemReady阶段中,系统会按照一定的顺序执行各项操作。首先,系统会加载所有的应用程序,并初始化它们。然后,系统会初始化用户界面,并启动Launcher应用程序。接着,系统会启动一些系统服务,例如通知服务、位置服务等。最后,系统会启动一些第三方应用程序,例如社交网络应用、游戏等。
总的来说,OnBootPhase和SystemReady是Android系统启动过程中的两个重要阶段。在这两个阶段中,系统会执行一系列的操作,以确保系统能够正常启动并运行。在执行这些操作时,系统会按照一定的顺序进行,以确保各项操作能够顺利完成。因此,在开发Android应用程序时,我们需要了解这些阶段和操作,以便更好地优化我们的应用程序,提高用户体验。
Android启动流程分析
Android启动流程分析
1.Android
2.
3.1 (Tiny210 Source) 启动分析
Tiny210 的⼊⼝: /linuxrc,该程序并不开源,从符号表信息推测其加⼊触摸屏校准的功能,最终调⽤Android的/sbin/init。1.1init ⼲的那些事⼉
⼲吗的:保姆(打扫卫⽣),⽗亲(制造⼉⼦)
谁找她:她⼲爹(内核或者switch_root切换)
代码阅读指数:★★★★★
重点阅读函数:
* main ⼊⼝
* parse_new_section 处理init.rc配置⽂件(注意这⾥默认的service不指定class属性,则默认的classname为"default",将被init.rc脚本的中的语句class_start default 逐⼀启动)
* service_start 启动服务
思考:
* init.rc 规则
* Android 系统中常⽤⽤户名和组ID及其应⽤范围
1.2init.rc 规则
init.rc最重要的两个keyword,以On开头的"ACTION",以service开头的"Service"。具体请参考Android源码
system\core\init\readme.txt
1.2.1ACTION
以on打头的“ACTION”,定义启动顺序的流程(early-init,XXXXX这⾥省略后⾯详细说init, early-fs, fs, post-fs, early-boot, boot)。它的触发是被动的,在init.c定义了启动顺序,如前⾯所述,可以理解为信号触发及回调。
Android开机启动流程
Android开机流程
1. 2. 3.
Bootloader 显示第二屏ZTE LOGO 检测是否进入Recovery模式 检测是否进入Fastboot下载模式 Boot(Kernel+Root):Bootloader会将kernel装载到内存中 运行,并传递cmd参数. 1. Kernel启动会做好所有设备的初始化 2. Load Root文件系统到内存,Root文件系统是一个Ramdisk, 即是在内存中运行的,系统重启后,里面的内容将被重置.
博通平台软件版本Image说明
• 框图
博通平台软件版本Image说明
IMAGE详细 一.CP IMAGE: .\tool\nandpreboot_ver2.5.1_le.img: 做security相关检查,从 CPU Rom 加载到CPU内部内存中运行. .\boot1.img: 被preboot image加载,在CPU内部内存运行,做 配置nand参数等工作. .\boot2_android.img: 被boot1 image加载,运行于外部内存. .\sysparm_dep.img: 存储系统相关性参数 .\sysparm_ind.img: 存储系统无关性参数 .\patch_dsp.img: dsp模块代码 .\SpinnerFirmware\HEDGE_NVRAM6B_RF_LE_Z_Racer2.bin: rf参数 .\comms.img: CP CODE.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一,系统引导bootloader
加电,cpu执行bootloader程序,正常启动系统,加载boot.img【其中包含内核。还有ramdisk】
二,内核kernel
bootloader加载kernel,kernel自解压,初始化,载入built-in驱动程序,完成启动。
内核启动后会创建若干内核线程,在后装入并执行程序/sbin/init/,载入init process,切换至用户空间(user-space)
内核zImage解压缩
head.S【这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。其作用就是解压Linux内核,并将PC指针跳到内核(vmlinux)的第一条指令】首先初始化自解压相关环境(内存等),调用decompress_kernel进行解压,解压后调用start_kernel启动内核【start_kernel是任何版本linux内核的通用初始化函数,它会初始化很多东西,输出linux版本信息,设置体系结构相关的环境,页表结构初始化,设置系
统自陷入口,初始化系统IRQ,初始化核心调度器等等】,最后调用rest_init【rest_init
会调用kernel_init启动init进程(缺省是/init)。然后执行schedule开始任务调度。这个init是由android的./system/core/init下的代码编译出来的,由此进入了android的代码】。
三,Init进程启动
【init是kernel启动的第一个进程,init启动以后,整个android系统就起来了】
init进程启动后,根据init.rc 和init.
服务(servicemanager zygote),然后担当property service 的功能
打开.rc文件,解析文件内容。【system/core/init/init.c】将service信息放置到service.list中【system/core/init/init_parser.c】。
建立service进程。【service_start(…) execve(…)】
在init.c中,完成以下工作
1、初始化log系统【解析/init.rc和init.%hardware%.rc文件,在两个
文件解析步骤2时执行“early-init”行动】
2、初始化设备【在/dev下创建所有设备节点,下载firmwares】
3、初始化属性服务器【在两个文件解析步骤2时执行“init”行动】
4、开启属性服务【在两个文件解析步骤2时执行“early-boot”和
“boot”行动;在两个文件解析步骤2时执行“excecute
property”行动】
5、进入一个无限循环【等待device/property set/child进程退出事
件】
四,Servicemanager
【Servicemanager属于Native Service。在执行init.rc时就会启动,与Zygote
一样】
通知binder设备,把自己变成context_manager
【service servicemanager/system/bin/servicemanager,从main(…)开始】
进入循环,不停的去读binder设备,看是否有对service的请求
如果有,调用svcmar_handler函数回调处理请求
【在Servicemanager中的svcmar_handler负责处理android中所有有关service的请求响应】
有增加服务请求时,由Servicemanager负责注册各项服务。【注册后,会将该service加入svcList中,svcList中存了各个注册过的service的name和
handler。当接收到获取service的请求时,Servicemanager会去查找该service,如果存在,则把返回数据写入reply,返回给客户。】
【处理服务注册和监听】
五,Zygote
【Servicemanager和Zygote进程奠定了android的基础,Zygote这个进程起
来才会立起真正的android运行空间,初始化建立的service都是Native
service.rc在脚本文件中Zygote的描述,Zygote是用于初始化虚拟机的进程,
它会监听请求创建虚拟机实例的socket】
建立java runtime【Zygote从main(…)开始
frameworks/base/cmds/app_main.cpp】
创建Dalvik java虚拟机,JNI_Createjava VM()
注册Android Runtime中的JNI接口给虚拟机
呼叫Java类com.android.internal.os.ZygoteInit中的main函数
【AndroidRuntime::start(…)
frameworks/base/core/jni/AndroidRuntime.cpp】
登记Listen端口,用来接受请求【registerZygoteSocket()】
加载preloaded class、resource用来加快启动速度,【preloadClasses()】
启动System Server【startSystemServer()】
进入Zygote服务框架,经过以上步骤Zygote就建立完成,利用socket通信,
接受ActivityManagerService的请求,fork应用程序。
六,System server
【System Server作为Zygote的第1个子进程,是Android Framework的核心,它主要负责Android系统初始化并启动其他服务。其它的Android服务都由
SystemServer启动并运行在该进程空间】
Fork出独立的进程,名称为“system-server”
System service启动原生服务,包括Surface Flinger和Audio Flinger
【system_main.cpp的main函数调用system_init.cpp的system_init函数。然
后调用SystemServer.java的SystemServer:Init2,启动新线程】
原生system service向service manager注册为IPC服务目标。【比如
AudioFlinger.cpp的instantiate函数】
System service开始Android managed services。
Android managed services向service manager注册
System server加载所有的服务后,系统初始化完成
七,Home启动
使用xxx.systemReady()通知各个服务,系统已经就绪。
特别对于ActivityManagerService.systemReady(回馈)
Widget.wallpaper.imm(输入法)等ready通知
启动Launcher