Android系统启动过程详解

合集下载

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启动流程分析

Zygote进程启动System Server
Zygote进程从App_main.cpp中main函数开始,调用runtime.start启动system server,最后就进入 runSelectLoopMode等待并处理来自上层的请求。
int main(int argc, const char* const argv[]){ ...... AppRuntime runtime; ...... int i = runtime.addVmArguments(argc, argv); if(i < argc){ runtime.mParentDir = argv[i++]; }
2. 从以下文件中加载默认属性值。 ① /default.prop ② /system/build.prop ③ /system/default.prop ④ /data/local.prop 属性将会按照如上顺序加载,后加载的属性覆盖原先的。
3. Init进程会启动一个属性服务器Property Service,客户端(Property Setter)只能通过 该属性服务器来进行系统属性的设置。 处理设置属性请求(Write property) 当Property Service通过unix domain socket收到用户请求时,init会调用 handle_property_set_fs函数进行处理。
Kernel创建Init进程
Android Kernel启动后,执行start_kernel函数来初始化Kernel正式运行之前各个功能。 Start_kernel函数最后调用了reset_init函数启动了如下三个进程: ① idle 是操作系统的空闲进程,当 cpu 空闲的时候会去运行它 ② kthreadd 是内核守护进程,其 PID 为 2 ③ kernel_init 函数作为进程被启动,但是之后它将读取根文件系统下的init 程序,这个

androidstartup原理

androidstartup原理

androidstartup原理Android是由Google开发的一套开放源代码的操作系统,主要用于移动设备和嵌入式系统。

它被广泛应用于智能手机、平板电脑、智能电视等移动设备中。

Android系统的启动过程是一个复杂的过程,涉及到很多不同的模块和组件。

下面将详细介绍Android系统的启动原理。

Android系统的启动过程主要包括五个阶段:引导加载程序、Linux内核初始化、系统服务初始化、应用程序启动和进程初始化。

首先是引导加载程序阶段。

当设备开机时,引导加载程序会被加载并执行。

引导加载程序主要负责初始化硬件设备,并加载第二阶段的引导加载程序。

在这个阶段,设备会进行一些硬件自检和初始化操作,确保设备能够正常运行。

接着是Linux内核初始化阶段。

在这个阶段,Linux内核会被加载并执行。

Linux内核是Android系统的核心部分,它负责管理系统的各种硬件资源和提供系统服务,同时也是Android系统与硬件之间的桥梁。

在这个阶段,Linux内核会初始化一些重要的子系统,如内存管理、文件系统、网络协议栈等。

然后是系统服务初始化阶段。

在这个阶段,系统服务会被加载并启动。

系统服务是Android系统中的一些核心组件,它们负责提供各种系统功能和服务,如Activity管理、通知管理、电源管理、输入管理等。

在这个阶段,系统服务会被初始化,并通过Binder机制提供接口供应用程序调用。

接下来是应用程序启动阶段。

在这个阶段,一些重要的应用程序会被加载并启动。

Android系统中有一些应用程序是系统级别的,它们在系统启动过程中会被优先加载和启动,如Launcher、Settings等。

在这个阶段,应用程序会被启动,并进入到运行状态。

最后是进程初始化阶段。

在这个阶段,Android系统会创建并初始化一些重要的进程。

Android系统采用了一种轻量级的进程模型,每个应用程序对应一个独立的进程,各个进程之间通过IPC机制进行通信。

安卓启动流程

安卓启动流程

安卓启动流程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启动和应用程序启动等步骤。

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

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脚本文件中定义。

具体看一下启动脚本:\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、deb uggerd、surfaceflinger、zygote、media……2 服务启动文件解析完成之后将service放入到service_list中。

文件解析完成之后将service放入到service_list中。

\system\core\init\builtins.cService的启动是在do_class_start函数中完成:int do_class_start(int nargs, char**args){service_for_each_class(args[1], service_start_if_not_disabled);return0;}遍历所有名称为classname,状态不为SVC_DISABLED的Service启动void service_for_each_class(const char*classname,void(*func)(struct service *svc)){……}static void service_start_if_not_disabled(struct service *svc){if(!(svc->flags & SVC_DISABLED)) {service_start(svc, NULL);}}do_class_start对应的命令:KEYWORD(class_start, COMMAND, 1, do_class_start) init.rc文件中搜索class_start:class_start main 、class_start core、……main、core即为do_class_start参数classnameinit.rc文件中Service class名称都是main:service drm /system/bin/drmserverclass mainservice surfaceflinger /system/bin/surfaceflingerclass main于是就能够通过main名称遍历到所有的Service,将其启动。

do_class_start调用:init.rc中on boot//actionclass_start core//执行command 对应 do_class_s tartclass_start mainInit进程main函数中:system/core/init/init.c中:int main(){//挂在文件//解析配置文件:init.rc……//初始化化action queue……for(;;){execute_one_command();restart_processes();for(i = 0; i < fd_count; i++) {if(ufds[i].revents == POLLIN) {if(ufds[i].fd == get_property_set_fd())handle_property_set_fd();else if(ufds[i].fd == get_keychord_fd())handle_keychord();else if(ufds[i].fd == get_signal_fd())handle_signal();}}}}循环调用service_start,将状态SVC_RESTARTING启动,将启动后的service状态设置为SVC_RUNNING。

pid=fork();execve();在消息循环中:Init进程执行了Android的Command,启动了Androi d的NativeService,监听Service的变化需求,Signal处理。

Init进程是作为属性服务(Property service),维护这些NativeService。

二ServiceManager启动在.rc脚本文件中zygote的描述:service servicemanager /system/bin/servicemanagerclass coreuser systemgroup systemcriticalonrestart restart zygoteonrestart restart mediaonrestart restart surfaceflingeronrestart restart drmServiceManager用来管理系统中所有的binder service,不管是本地的c++实现的还是java语言实现的都需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。

所有的S ervice使用前都必须先在servicemanager中进行注册。

do_find_service( )do_add_service( )svcmgr_handler( )代码位置:frameworks\base\cmds\servicemanager\Service_mana ger.c三Zygote进程的启动Zygote这个进程是非常重要的一个进程,Zygote进程的建立是真正的A ndroid运行空间,初始化建立的Service都是Navtive service.(1)在.rc脚本文件中zygote的描述:service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-serverclass mainsocket zygote stream 666onrestart write /sys/android_power/request_state wakeonrestart write /sys/power/state ononrestart restart mediaonrestart restart netd参数:--zygote --start-system-server代码位置:frameworks/base/cmds/app_process/app_main.cpp 上面的参数在这里就会用上,决定是否要启动和启动那些进程。

int main( ){AppRuntime runtime;if(zygote) {runtime.start("com.android.internal.os.ZygoteInit",startSystemServer ? "start-system-server" : "");}}class AppRuntime : public AndroidRuntime{};(2)接着到了AndroidRuntime类中:frameworks\base\core\jni\AndroidRuntime.cppvoid start(const char* className, const char* options){// start the virtual machine Java在虚拟机中运行的JNIEnv* env;if(startVm(&mJavaVM, &env) != 0) {return;}//向刚刚新建的虚拟机注册JNI本地接口if(startReg(env) < 0) {return;}// jni 调用java 方法,获取对应类的静态main方法jmethodID startMeth = env->GetStaticMethodID(startClass,"main","([Ljava/lang/String;)V");// jni调用java方法,调用到ZygoteInit类的main函数jclass startClass = env->FindClass(className);env->CallStaticVoidMethod(startClass, startMeth, strArray);}到了ZygoteInit.java中的静态main函数中,从C++ ——》JAVA(3)ZygoteInit真正Zygote进程:frameworks\base\core\java\com\android\internal\os\Zyg oteInit.javapublic static void main(String argv[]) {//Registers a server socket for zygote command connectionsregisterZygoteSocket();//Loads and initializes commonly used classes and//used resources that can be shared across processespreload();// Do an initial gc to clean up after startupgc();if(argv[1].equals("start-system-server")) {startSystemServer();}/*** Runs the zygote process's select loop. Accepts new connections as* they happen, and reads commands from connections one spawn-request's* worth at a time.*/runSelectLoopMode(); //loop中/*** Close and clean up zygote sockets. Called on shutdown and on the* child's exit path.*/closeServerSocket();}Zygote就建立好了,利用Socket通讯,接收请求,Fork应用程序进程,进入Zygote进程服务框架中。

相关文档
最新文档