Android 开机启动流程

合集下载

Android的本地启动流程1

Android的本地启动流程1

本地部分启动流程
在 Android 系统运行的通常情况下,根文件系统 只是一个较小的部分,例如包括 init 、 init.rc 和少数 的几个目录。其他的文件系统通常需要由 init 根据 init.rc 脚本的中内容进行挂接。 默认的文件系统挂接方法:
mount mount mount mount yaffs2 yaffs2 yaffs2 yaffs2 mtd@system /system mtd@system /system ro remount mtd@userdata /data nosuid nodev mtd@cache /cache nosuid nodev
Android 的本地启动流程
韩 超 @ Android 技术
本地部分启动流程
Android 系统的启动流程为: BootLoader 启动(标准) Linux 内核启动(标准) 内核加载根文件系统 init 进程启动 运行 init.rc 脚本 加载 system 和 data 文件系统 启动各种可执行程序
谢谢!
本地部分启动流程
Linux 内核在加载完成根文件系统后,将运行根文 件系统中的一个名称为 init 的可执行程序,作为用户 空间的第一个进程。 在 Android 中,这个 init 就是根目录中的 init 可执 行程序,它被内核启动后,作为系统的用户空间的第 一个进程来运行。 init 可执行程序运行后,系统的用 户空间部分进入了 Android 系统特定环境。 init 程序运行后,程序将会在根目录中找到名称为 init.rc 的文件作为启动脚本。在不同的平台中, init.rc 脚本中的内容可能有自定义的部分。
# cat /proc/cmdline qemu=1 console=ttyS0 android.checkjni=1 android.qemud=ttyS1 ndns=-1

Android系统完整的启动过程

Android系统完整的启动过程

Android系统完整的启动过程,从系统层次角度可分为Linux系统层、Android系统服务层、Zygote进程模型三个阶段;从开机到启动Home Launcher完成具体的任务细节可分为七个步骤,下面就从具体的细节来解读Android系统完整的初始化过程。

一、启动BootLoaderAndroid 系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样。

当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序。

通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。

而Linux系统启动时:1)首先要加载BIOS的硬件信息,并获取第一个启动设备的代号2)读取第一个启动设备的MBR的引导加载程序(lilo、grub等)的启动信息。

3)加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有的硬件设备。

…………在嵌入式系统中,通常不会有像BIOS那样的固件程序,因此整个系统的加载任务都是通过BootLoader完成的。

二、加载系统内核Linux内核映像通常包括两部分代码,分别为实模式代码和保护模式代码。

当BootLoader装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行完成后转入保护模式代码。

实模式和保护模式的概念再次不做过多解释,读者可以自行查阅资料。

三、启动Init进程当系统内核加载完成之后,会首先启动Init守护进程,它是内核启动的第一个用户级进程,它的进程号总是1。

Init进程启动完成之后,还负责启动其他的一些重要守护进程,包括:Usbd进程(USB Daemon):USB连接后台进程,负责管理USB连接。

adbd 进程(Android Debug Bridge Daemon):ADB连接后台进程,负责管理ADB连接。

Android 开机启动流程

Android 开机启动流程

Android的开机流程1. 系统引导bootloader1) 源码:bootable/bootloader/*2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.i mg包含内核,基本的文件系统,用于工程模式的烧写c) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)2. 内核kernel1) 源码:kernel/*2) 说明:kernel由bootloader加载3. 文件系统及应用init1) 源码:system/core/init/*2) 配置文件:system/rootdir/init.rc,3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能4. 重要的后台程序zygote1)源码:frameworks/base/cmds/app_main.cpp等2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_processa)建立Java Runtime,建立虚拟机b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序c) 启动System Server5. 系统服务system server1)源码:frameworks/base/services/java/com/android/server/SystemServer.jav a2) 说明:被zygote启动,通过SystemManager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)6. 桌面launcher1)源码:ActivityManagerService.java为入口,packages/apps/launcher*实现2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用()启launcher7. 解锁1) 源码:frameworks/policies/base/phone/com/android/internal/policy/impl/*lock* 2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置8. 开机自启动的第三方应用程序1) 源码:ﻫframeworks/base/services/java/com/android/server/am/ActivityManagerService.java2) 说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefa ult().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。

android启动流程

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系统的核心功能,包括系统应用程序和用户安装的应用程序。

系统应用程序包括电话、短信、浏览器等,而用户安装的应用程序则是用户根据自己的需求下载和安装的。

8、应用程序启动完成一旦应用程序启动完成,系统将进入正常运行状态,用户可以通过界面操作手机。

总结:Android系统的启动流程是一个复杂而严密的过程,经过开机自检、引导加载程序、Linux内核加载、文件系统加载、初始化进程、启动用户空间、启动应用程序等多个步骤,最终实现用户界面的显示和应用程序的运行。

安卓启动流程

安卓启动流程

安卓启动流程Android启动流程是指当我们按下手机开机键之后,系统如何进行初始化和加载应用程序等相关操作,最终完成系统的正常启动并进入主界面的过程。

下面将详细介绍Android启动流程的主要步骤。

1. 加电与引导当我们按下手机的开机键时,电源管理芯片开始提供电力供应并接通整个电路。

同时,电源管理芯片会发送信号给处理器引导启动系统。

2. 启动引导加载程序处理器接收到启动信号后,会加载引导加载程序(Bootloader)。

引导加载程序主要负责初始化硬件设备、加载系统内核等操作。

引导加载程序是嵌入式系统中运行的一段代码,它的作用是为系统加载内核和其他软件。

3. 加载内核引导加载程序会根据设备启动模式(Fastboot、Recovery或正常启动)来选择加载相应的内核。

内核是操作系统的核心,它负责管理和控制系统的硬件资源,提供各种功能的驱动程序,同时也会启动各种系统服务。

4. 初始化设备驱动在内核加载完成后,系统会初始化设备驱动程序。

设备驱动程序负责与硬件设备进行通信和控制,让硬件设备可以正确地与系统交互。

5. 启动init进程在设备驱动程序加载完毕后,系统会启动init进程。

init进程是Android系统中的第一个用户级进程,它的PID(Process ID)为1。

init进程负责启动和管理其他用户级进程,它通过读取init.rc配置文件来确定要启动的进程和服务。

6. 启动系统服务init进程会根据init.rc配置文件的指令,启动各种系统服务,例如Binder服务、Activity Manager服务、Window Manager服务等。

这些系统服务是Android系统的核心组件,负责管理应用程序的生命周期、绘制界面等功能。

7. Zygote进程与应用程序加载在系统服务启动完成后,init进程会启动Zygote进程。

Zygote进程是Android系统中的特殊进程,其作用是为应用程序提供应用程序运行环境(即Dalvik或ART虚拟机环境)。

android开机过程

android开机过程

一、Android开机启动流程简介1、OS-level:由bootloader载入linux kernel后kernel开始初始化, 并载入built-in 的驱动程序。

Kernel完成开机后,载入init process,切换至user-space。

Init进程是第一个在user-space启动的进程。

2、Android-level:由init process读取init.rc,Native 服务启动,并启动重要的外部程序,例如:servicemanager、Zygote以及System Server等。

由 init process 根据硬件类型读取init.xxx.rc。

由init.xxx.rc加载init.xxx.sh。

由 init.xxx.sh 加载特定的硬件驱动。

如hi_tuner.ko、hi_demux.ko等。

3、Zygote-Mode:Zygote 启动完SystemServer 后,进入Zygote Mode,在Socket 等候命令。

随后,使用者将看到一个桌面环境(Home Screen)。

桌面环境由一个名为[Launcher]的应用程序负责提供。

本文档重点研究Android-level中的启动流程。

启动流程如下图所示:二、init process流程分析init进程简介init进程是第一个在user-space启动的进程。

由内核启动参数[init]传递给内核,如果该项没有设置,内核会按/etc/init,/bin/init,/sbin/init,/bin/sh的顺序进行尝试,如果都有的都没找到,内核会抛出 kernel panic:的错误。

init进程包含在跟文件系统中,跟文件系统被直接编译到了内核。

对init 进程的修改,需要重新编译烧写内核。

编译命令:#cd kernel#make uImagCONFIG_INITRAMFS_SOURCE=../out/target/product/Hi3716C/root/ -j 8#cp kernel/arch/arm/boot/uImage out/target/product/Hi3716C/kernel -afv 源代码路径:froyo\system\core\init编译的文件:builtins.cinit.cdevices.cproperty_service.cutil.cparser.clogo.c编译命令:make init生成的文件:/out/target/product/Hi3716C/root/initinit进程启动流程1.安装SIGCHLD信号。

android启动流程

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会被启动,用户可以看到设备的桌面界面。

Launcher是Android系统的桌面管理器,负责显示桌面、启动应用程序等功能。

7. 应用程序启动。

最后,用户可以通过桌面上的图标启动各种应用程序,进入到自己想要使用的应用程序中。

总结。

Android启动流程经历了Bootloader启动、内核启动、init进程启动、系统服务启动、Launcher启动和应用程序启动等步骤。

Android启动流程(一)

Android启动流程(一)

Android启动流程(⼀)Android 的启动流程话不多说上图内核⾥⾯第⼀个进程 idle 进程⼜叫做Swapper进程 PID = 0Kthread 进程相当于内核的⿐祖init 进程启动⽤户空间的⿐祖zygote java 进程⿐祖SystemServer zygote 的⼤⼉⼦SystemServer ⼜会启动很多服务, 90多个,我们很多服务都在SystemServer进程中SystemServer通过AMS 在zygote 出app进程进程启动⽅式 fork线程启动 new Thread在内核中没有进程和线程之分init 进程的启动kernel/common/init/main.c -> kernel_initinit的⼊⼝函数 -》 main.cppinit.rc脚本⽂件按照init.rc 的内容去执⾏first_state_main主要做⼀些挂载/ 创建⼀些⽂件重定向输⼊输出 error初始化内核的⽇志打印启动 selinux_setupSelinuxSetupSetupSelunx linux这块的安全策略 --- Android ---- 权限最⼩权限原则second_stage_mainPropertyInit(); --- 初始化属性域处理⼦进程终⽌信号 --- 僵⼫进程InstallSignalFdHandler(&epoll);InstallInitNotifier(&epoll);StartPropertyService(&property_fd);GetBultinFunctionmap () 匹配命令和函数之间的关系LoadBootScripts() 解析init.rc--> CreateParser : parserparser.AddSectionParser("server" , xxxx);parser.AddSectionParser("on" , xxxx);parser.AddSectionParser("import" , xxxx);parser.ParseConfig("/system/etc/init/hw/init.rc"); // 解析 init.rcparserConfigDir();parseConfigFile();ParseData() 解析init ⽂件进⼊while 循环 ---- 等待auto pending_function = epoll.Wait(epoll_timeout);⼩结:init处理的重要事情:1. 挂载⽂件2. 设置 seLinux -- 安全策略3. 开始属性服务注册到 epoll中4. 解析 init.rc5. 循环处理脚本⽂件 -- 启动 zygote6. 循环等待输⼊输出stdio --Linux ⼀切皆⽂件system.out.println(); 把这句话写到⽂件夹中(dev/nulll 管道⽂件夹)zygote 进程启动孵化器最重要的作⽤有⼀部分在nitive ⼀部分在javazygote 第⼀个进⼊Java的。

安卓系统基本操作方法

安卓系统基本操作方法

安卓系统基本操作方法安卓系统是目前使用最为广泛的智能手机操作系统之一,其操作方法相对简单易学。

以下是安卓系统的基本操作方法。

1. 开关机和解锁手机:- 开机:长按手机的电源键,待手机屏幕亮起后,输入解锁密码或指纹验证,即可进入主屏界面。

- 关机:长按电源键,选择关机选项,确认即可关机。

- 解锁:滑动屏幕上的锁屏图标或输入解锁密码/指纹,即可解锁手机。

有些手机还支持面部识别、虹膜解锁等方式。

2. 主屏界面和应用程序:- 主屏界面:打开手机后,即进入主屏界面。

主屏界面上通常有多个桌面,可以滑动屏幕左右切换,桌面上可添加各种小部件、快捷方式和文件夹。

- 应用程序:应用程序通常在主屏界面底部的导航栏或者桌面上的应用图标中。

点击桌面上的应用图标即可打开应用程序。

3. 手势操作:- 滑动手势:- 上滑:打开通知栏,显示通知消息和快捷开关,可设置Wi-Fi、蓝牙、屏幕亮度等。

- 下滑:打开快捷设置栏,可直接操作部分设置,如飞行模式、静音、自动旋转等。

- 左右滑动:在主屏界面左右滑动,可以切换桌面。

- 按压手势:- 长按:长按应用图标或者桌面元素,可以打开上下文菜单,进行应用程序的管理和操作。

- 多指手势:- 放大缩小:使用两指进行放大或缩小屏幕上的内容,如网页、图片等。

4. 应用管理和切换:- 后台管理:长按主屏界面的菜单键或者点击底部导航栏的多任务按钮(方形图标)可以打开后台管理界面,显示所有已经打开的应用程序。

在这里可以进行切换和关闭应用程序。

- 返回键:点击屏幕下方的返回键,可以返回上一级菜单或者关闭当前应用程序。

5. 设置菜单:- 打开设置菜单:点击主屏界面上的设置图标(有时是齿轮图标),即可进入设置菜单。

- 常用设置选项:在设置菜单中,可以对语言和输入、Wi-Fi、蓝牙、声音、显示等设置进行调整和配置。

6. 通知中心和快速设置:- 通知中心:滑动屏幕顶部的状态栏,可以打开通知中心,显示各种通知消息和快速设置。

高通Andriod开机流程与镜像说明

高通Andriod开机流程与镜像说明

⾼通Andriod开机流程与镜像说明Android镜像说明Android设备刷机时都需要ROM包,ROM包下⾯有很多的.img和其他的相关镜像⽂件,其中这⾥⾯包含了Android很多的分区,Android镜像⽂件是通过源码编译⽣成的,下⾯是ROM包各个镜像的作⽤:镜像⽂件说明boot.img boot分区,包括内核⽂件和虚拟内存盘Ramdisk,负责设备开机,可在recovery模式进⾏擦除,重新安装带有boot分区的新系统system.img system分区,包含Android系统的⽤户界⾯以及设置上的⼀些预装系统应⽤recovery.img recovery分区,替代启动分区,执⾏恢复和维护系统的⼀些操作userdata.img data分区,⽤于保存⽤户的数据,例如联系⼈,短信,设置偏好和应⽤程序存放的地⽅cache.img cache分区,⽤于放置系统频繁访问的数据和应⽤程序组件的分区persist.img persist分区包含了设备的传感器和信号部分的驱动程序,例如wifi,蓝⽛连接都有关系splash.img开机画⾯⽂件NON-HLOS.bin modem image负责处理通讯协议相关的基带镜像prog_emmc_firehose_8953_ddr.mbn QFIL软件烧录系统的时候,需要⽤到此⽂件,应该是关于EMMC、DDR的配置参数相关的sbl1.mbn硬件的初始化,并且保存加载其他模块信息的顺序tz.mbn trustzone是ARM TrustZone® 技术是系统范围的安全⽅法,基于安全需求和引导模式配置XPU,NAND MPU,它和其他模块代码运⾏在相互隔离的区域,主要实现底层很多安全性特性emmc_appsboot.mbn bootloader⽂件,进⼊fastboot模式相关⽂件rpm.mbn电源管理器,是⾼通MSM平台另外加的⼀块芯⽚,虽然与AP芯⽚打包在⼀起,但其是⼀个独⽴的ARM Core。

Android开机启动流程

Android开机启动流程

Android启动流程
• 第四步 Home启动
在ServerThread@SystemServer.java后半段,我们可以看到系统在启 动完所有的Android服务后,做了这样一些动作: (1) 使用xxx.systemReady()通知各个服务,系统已经就绪。 (2) 特别对于ActivityManagerService.systemReady(回调) Widget.wallpaper,imm(输入法)等ready通知。 Home就是在ActivityManagerService.systemReady()通知的过程中建 立的。下面是ActivityManagerService.systemReady()的伪代码: systemReady()@ActivityManagerService.java resumeTopActivityLocked() startHomeActivityLocked();//如果是第一个则启动HomeActivity。 startActivityLocked(。。。)CATEGORY_HOME
Android启动流程
• 第二步 Zygote
Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的 Android运行空间,初始化建立的Service都是Navtive service.在.rc脚本文件中zygote的描述: service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server 所以Zygote从main(…)@frameworks/base/cmds/app_main.cpp开始。 (1) main(…)@frameworks/base/cmds/app_main.cpp 建立Java Runtime runtime.start("com.android.internal.os.ZygoteInit", startSystemServer); (2) runtime.start@AndroidRuntime.cpp 建立虚拟机 运行:com.android.internal.os.ZygoteInit:main函数。 (3)main()@com.android.internal.os.ZygoteInit//真正的Zygote。 registerZygoteSocket();//登记Listen端口 startSystemServer(); 进入Zygote服务框架。 经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求, Fork应用程序。

Android 启动过程详解

Android 启动过程详解

1. Boot系统初始化,具体过程参见(systemcoreinitInit.c)中的main函数,这时候,手机或者模拟器出现的画面是一个console,显示“ANDROID”msg。

2. 初始化成功后,就开始mounting系统,具体参见(systemcoremountdMountd.c) 中的main函数。

3.接下来运行ndroidRuntime,并开始启动java虚拟机dalvikvm。

4. Java虚拟机启动成功后,开始系统初始化。

系统初始的第一步是用JNI方式实现的,对应java代码为(frameworks ase servicesjavacomandroidserverSystemServer.java) init1(Native)函数,对应的JNI C++代码为(frameworks asecorejniserver com_android_server_SystemServer.cpp),而实现的C++代码为(frameworks asecmdssystem_serverlibrary System_init.cpp) 中的system_init()函数。

5. system_init调用SurfaceFlinger,SurfaceFlinger的readyToRun()函数用BootAnimation来实现开机动画,这时候手机或者模拟器显示是一副背景图加一个动态的小机器人。

6. 系统初始化的第二步,将启动ServerThread进程,参见SystemServer.init2()。

ServerThread将启动各种系统服务Activity Manager等等,具体参见ServerThread的run函数,ServerThread同在SystemServer.java中。

7.这之后的事,应该就是进入系统了。

(这部分没有调查过)。

#####################################################对于关注Android底层的朋友来说,其具体的启动过程应该是比较吸引我们的。

android开机启动流程简单分析

android开机启动流程简单分析

android开机启动流程简单分析android启动当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init\init.cpp)代码如下:int main(int argc, char** argv) {.....//创建文件夹,挂载// Get the basic filesystem setup we need put together in the initramdisk// on / and then we'll let the rc file figure out the rest.if (is_first_stage) {mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");mkdir("/dev/pts", 0755);mkdir("/dev/socket", 0755);mount("devpts", "/dev/pts", "devpts", 0, NULL);#define MAKE_STR(x) __STRING(x)mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC));mount("sysfs", "/sys", "sysfs", 0, NULL);}.....//打印日志,设置log的级别klog_init();klog_set_level(KLOG_NOTICE_LEVEL);.....Parser& parser = Parser::GetInstance();parser.AddSectionParser("service",std::make_unique<ServiceParser>());parser.AddSectionParser("on", std::make_unique<ActionParser>());parser.AddSectionParser("import", std::make_unique<ImportParser>());// 加载init.rc配置文件parser.ParseConfig("/init.rc");}加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码:从Android L开始,在/system/core/rootdir 目录中有4 个zygote 相关的启动脚本如下图:在init.rc文件中,有如下代码:import /init.environ.rcimport /b.rcimport /init.${ro.hardware}.rcimport /b.configfs.rcimport /init.${ro.zygote}.rc注意到上面的代码import /init.${ro.zygote}.rc,这里会读取ro.zygote这个属性,导入相应的init.rc文件。

Android系统启动过程从下往上的一个过程

Android系统启动过程从下往上的一个过程
程的鼻祖。
init进程启动MediaServer(多媒体服务)、servicemanager(binder服务管
家)、bootanim(开机动画)等重要服务;
init进程还会孵化出installd(用于App安装)、ueventd、adbd、lmkd(用于
内存管理)等用户守护进程;
init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java
进程,Zygote是所有Java进程的父进程,Zygote进程本身是由init进程孵化
而来的。
4、Framework
Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进
程主要包含:-加载ZygoteInit类,注册ZygoteSocket服务端套接字;-加载
虚拟机;-PreloadClasses;-PreloadResouces。
Zygote进程fork出SystemServ
一个进程,地位非常重要。
SystemServer进程:负责启动和管理整个Javaframework,包含
ActivityManager,PowerManager等服务。
MediaServer进程:负责启动和管理整个C++framework,包含
进程是所有内核进程的鼻祖。
Android基于Linux提供核心系统服务,
例如:安全、内存管理、进程管理、网络堆栈、驱动模型。LinuxKernel
也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的
服务。如果你只是做应用开发,就不需要深入了解LinuxKernel层
3、Native
启动init进程(pid=1),是Linux系统的用户进程,init进程是所有用户进

android开机启动流程说明

android开机启动流程说明

android开机启动流程说明第一步:启动linux1.Bootloader2.Kernel第二步android系统启动:入口为init.rc(system\core\rootdir)1./system/bin/service manager: Binder 守护进程;2.Runtime;3.Zygote :app-process/app-main;4.Start VM;5.Start server6.Start android service:Register to service Manager7.Start Launcher第三步:应用程序启动:运行package Managerl Init进程Android系统在启动时首先会启动Linux系统,引导加载Linux Kernel并启动init进程。

Init进程是一个由内核启动的用户级进程,是Android系统的第一个进程。

该进程的相关代码在platform\system\core\init\init.c。

在main 函数中,有如下代码:open_devnull_stdio();log_init();INFO("reading config file\n");init_parse_config_file("/init.rc");/* pull the kernel commandline and ramdisk properties file in */import_kernel_cmdline(0);get_hardware_name(hardware, &revision);snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);init_parse_config_file(tmp);这里会加载解析init.rc和init.hardware.rc两个初始化脚本。

Android系统启动过程-uBoot+Kernel+Android

Android系统启动过程-uBoot+Kernel+Android

Android系统启动过程-uBoot+Kernel+Android摘要:本⽂是参考⼤量⽹上资源在结合⾃⼰查看源代码总结出来的,让⾃⼰同时也让⼤家加深对Android系统启动过程有⼀个更加深⼊的了解!再次强调,本⽂的⼤多数功劳应归功于那些原创者们,同时⼀些必要的参考链接我会⼀⼀附上。

注:由于本⼈采⽤Exynos4412开发板学习,所以本⽂⼤部分资料都是基于此处理器的简介:对于整个Android系统的启动总的来说分为三个阶段: BootLoader引导即uBoot.bin linux内核启动即zImage Android系统启动即ramdisk.img与system.img 以上四个⽂件都是经过⾃⼰编译后⽣成的且通过烧写测试,接下来开始说这三⼤部分的启动过程。

⽬录:⼀、BootLoader的启动 1.汇编部分 2.c部分 ⼆、Kernel的启动 1.zImage解压缩 2.kernel的汇编启动阶段 3.kernel的c启动阶段 三、Android的启动 1.init进程 2.init启动的各种服务 3.android启动图⽰第⼀部分:BootLoader的启动流程 uBoot的第⼀条指令从cpu/arm920t/start.S⽂件开始 1. 设置CPU进⼊SVC模式(系统管理模式),cpsr[4:0]=0xd3。

1 #include <common.h>2 #include <config.h>34/*5 *************************************************************************6 *7 * Jump vector table as in table 3.1 in [1]8 *9 *************************************************************************10*/111213 .globl _start14 _start: b start_code15 ldr pc, _undefined_instruction16 ldr pc, _software_interrupt17 ldr pc, _prefetch_abort18 ldr pc, _data_abort19 ldr pc, _not_used20 ldr pc, _irq21 ldr pc, _fiq2223 _undefined_instruction: .word undefined_instruction24 _software_interrupt: .word software_interrupt25 _prefetch_abort: .word prefetch_abort26 _data_abort: .word data_abort27 _not_used: .word not_used28 _irq: .word irq29 _fiq: .word fiq3031 .balignl 16,0xdeadbeef 接着进⼊Start_code中:设置CPU进⼊SVC模式。

详解Android系统启动过程

详解Android系统启动过程

详解Android系统启动过程⽬录计算机是如何启动的引导阶段加载内核阶段Android的启动过程init进程init.rc ⽂件service_manager 进程surface_flinger 进程media_server 进程Zygote 进程system_server 进程ActivityManagerService 启动完整的启动流程图计算机是如何启动的计算机的硬件包括:CPU,内存,硬盘,显卡,显⽰器,键盘⿏标等输⼊输出设备。

所有的软件都是存放在硬盘中,程序执⾏时,需要将程序从硬盘上读取到内存中,然后加载到CPU中来运⾏。

当按下开机键时,内存中什么都没有,因此需要借助某种⽅式,将操作系统加载到内存中,⽽完成这项任务的就是BIOS。

引导阶段BIOS:BIOS是主板芯⽚上的⼀个程序,计算机通电后,第⼀件事情就是读取BIOS。

BIOS⾸先进⾏硬件检测,检查计算机硬件能否满⾜运⾏的基本条件。

如果硬件出现问题,主板发出不同的蜂鸣声,启动停⽌。

如果没有问题,屏幕会显⽰CPU,内存,硬盘等信息。

硬件⾃检完成后,BIOS将控制权交给下⼀个阶段的启动程序。

这时候BIOS需要知道下⼀个启动程序存放在哪个设备中。

也就是BIOS需要⼀个外部存储设备的排序。

优先交给排在前⾯的设备。

这就是我们在BIOS中设置的启动排序。

当第⼀个存储设备被激活后,设备读取设备的第⼀个扇区,也就是前512字节。

如果这512个字节的最后两个字节是0x55和0xAA,表明设备是可以⽤作系统启动的。

如果不是,那么就会顺序启动下⼀个设备。

这前512个字节,就叫做“主引导记录”(缩写MBR)。

它负责磁盘操作系统对硬盘进⾏读写时分区合法型判断、分区引导信息定位。

MBR不属于任何⼀个CIA做系统,它先于操作系统⽽被调⼊内存,并发挥作⽤。

然后才将控制权交给主分区内的操作系统,并⽤主分区信息来管理硬盘。

MBR主要作⽤是告诉计算机到硬盘的哪个位置去找操作系统。

android系统开机启动流程分析

android系统开机启动流程分析

一,系统引导bootloader加电,cpu执行bootloader程序,正常启动系统,加载boot.img【其中包含内核。

还有ramdisk】二,内核kernelbootloader加载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. <machine_name>.rc脚本文件建立几个基本服务(servicemanager zygote),然后担当property service 的功能打开.rc文件,解析文件内容。

【system/core/init/init.c】将service信息放置到service.list中【system/core/init/init_parser.c】。

Android系统启动过程详解(DOC)

Android系统启动过程详解(DOC)

Android系统启动过程详解Android系统启动过程首先Android框架架构图:(来自网上,我觉得这张图看起来很清晰)Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用。

启动的过程如下图所示:(图片来自网上,后面有地址)下面将从Android4.0源码中,和网络达人对此的总结中,对此过程加以学习了解和总结,以下学习过程中代码片段中均有省略不完整,请参照源码。

一Init进程的启动init进程,它是一个由内核启动的用户级进程。

内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。

init始终是第一个进程。

启动过程就是代码init.c中main函数执行过程:system\core\init\init. c在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听……下面看两个重要的过程:rc文件解析和服务启动。

1 rc文件解析.rc文件是Android使用的初始化脚本文件(System/Core/Init/readm e.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脚本文件中定义。

安卓系统启动流程

安卓系统启动流程

第一步:启动电源以及系统启用当电源按下,引导芯片代码从指定位置(固化在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找到对于init.rc文件,安卓中有特定的格式和规则,在安卓中,我们叫做安卓初始化语言。

安卓初始化语言由四大类型的声明组成,即Action(动作)、Commands(命令)、Services(服务)、Options(选项)。

Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android的开机流程1. 系统引导bootloader1) 源码: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. 内核kernel1) 源码:kernel/*2) 说明:kernel由bootloader加载3. 文件系统及应用init1) 源码:system/core/init/*2) 配置文件:system/rootdir/init.rc,3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能4. 重要的后台程序zygote1) 源码:frameworks/base/cmds/app_main.cpp等2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_processa) 建立Java Runtime,建立虚拟机b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序c) 启动System Server5. 系统服务system server1) 源码:frameworks/base/services/java/com/android/server/SystemServer.java2) 说明:被zygote启动,通过System Manager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)6. 桌面launcher1) 源码:ActivityManagerService.java为入口,packages/apps/launcher*实现2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用()启launcher7. 解锁1) 源码:frameworks/policies/base/phone/com/android/internal/policy/impl/*lock*2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置8. 开机自启动的第三方应用程序1) 源码:frameworks/base/services/java/com/android/server/am/ActivityManagerService.java2) 说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefault().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。

9. 总结综上所述,系统层次关于启动最核心的部分是zygote(即app_process)和system server,zygote 它负责最基本的虚拟机的建立,以支持各个应用程序的启动,而system server用于管理android后台服务,启动步骤及顺序。

10. 参考/basonjiang_sz/category/648399.aspxAndroid 启动过程详解Android从Linux系统启动有4个步骤;(1) init进程启动(2) Native服务启动(3) System Server,Android服务启动(4) Home启动总体启动框架图如:第一步:initial进程(system/core/init)init进程,它是一个由内核启动的用户级进程。

内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。

init始终是第一个进程.Init.rcInit.marvell.rcInit进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务:servicemanamgerzygote。

最后Init并不退出,而是担当起property service的功能。

1.1脚本文件init@System/Core/InitInit.c:parse_config_file(Init.rc)@parse_config_file(Init.marvel.rc)解析脚本文件:Init.rc和Init.xxxx.rc(硬件平台相关)Init.rc是Android自己规定的初始化脚本(Android Init Language, System/Core/Init/readme.txt) 该脚本包含四个类型的声明:ActionsCommandsServicesOptions.1.2 服务启动机制我们来看看Init是这样解析.rc文件开启服务的。

(1)打开.rc文件,解析文件内容@ system/core/init/init.c将service信息放置到service_list中。

@ system/core/init parser.c(2)restart_service()@ system/core/init/init.cservice_startexecve(…).建立service进程。

第二步ZygoteServicemanager和zygote进程就奠定了Android的基础。

Zygote这个进程起来才会建立起真正的Android运行空间,初始化建立的Service都是Navtive service.在.rc脚本文件中zygote 的描述:service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server所以Zygote从main(…)@frameworks/base/cmds/app_main.cpp开始。

(1) main(…)@frameworks/base/cmds/app_main.cpp建立Java Runtimeruntime.start("com.android.internal.os.ZygoteInit", startSystemServer);(2) runtime.start@AndroidRuntime.cpp建立虚拟机运行:com.android.internal.os.ZygoteInit:main函数。

(3)main()@com.android.internal.os.ZygoteInit//正真的Zygote。

registerZygoteSocket();//登记Listen端口startSystemServer();进入Zygote服务框架。

经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求,Fork应用程序。

第三步System ServerstartSystemServer@com.android.internal.os.ZygoteInit在Zygote上fork了一个进程: com.android.server.SystemServer.于是SystemServer@(SystemServer.java)就建立了。

Android的所有服务循环框架都是建立SystemServer@(SystemServer.java)上。

在SystemServer.java中看不到循环结构,只是可以看到建立了init2的实现函数,建立了一大堆服务,并AddService到service Manager。

main() @ com/android/server/SystemServer{init1();}Init1()是在Native空间实现的(com_andoird_server_systemServer.cpp)。

我们一看这个函数就知道了,init1->system_init() @System_init.cpp在system_init()我们看到了循环闭合管理框架。

{Call "com/android/server/SystemServer", "init2"…..ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();}init2()@SystemServer.java中建立了Android中所有要用到的服务。

这个init2()建立了一个线程,来New Service和AddService来建立服务第三步Home启动在ServerThread@SystemServer.java后半段,我们可以看到系统在启动完所有的Android服务后,做了这样一些动作:(1)使用xxx.systemReady()通知各个服务,系统已经就绪。

(2) 特别对于ActivityManagerService.systemReady(回调)Widget.wallpaper,imm(输入法)等ready通知。

Home就是在ActivityManagerService.systemReady()通知的过程中建立的。

下面是ActivityManagerService.systemReady()的伪代码:systemReady()@ActivityManagerService.javaresumeTopActivityLocked()startHomeActivityLocked();//如果是第一个则启动HomeActivity。

相关文档
最新文档