android开机启动流程
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系统完整的启动过程,从系统层次角度可分为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的开机流程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的启动流程。
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的开机流程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以告知已注册的第三方程序在开机时自动启动。
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启动流程进行详细介绍。
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 的启动流程话不多说上图内核⾥⾯第⼀个进程 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的。
安卓系统启动流程
安卓系统启动流程第一步:启动电源以及系统启用当电源按下,引导芯片代码从指定位置(固化在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(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。
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 启动过程详解
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的开机流程。
分享给⼤家供⼤家参考,具体如下:开机过程中⽆线模块的初始化过程;如果sim卡锁开启,或者pin被锁住的时候,会要求输⼊pin或者puk,但是这个解锁动作必须在系统初始化完成以后才能进⾏。
(图形系统都还没有初始化怎么输⼊密码阿?)当系统初始化完成以后会调⽤wm.systemReady()来通知⼤家。
这时候该做什么就做什么。
开机过程中⽆线模块的初始化过程:rild 调⽤参考实现 Reference-ril.c (hardware\ril\reference-ril) 中的函数:const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);static void *mainLoop(void *param)ret = at_open(fd, onUnsolicited);RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);在 initializeCallback 函数中对猫进⾏了初始化。
static void initializeCallback(void *param){ATResponse *p_response = NULL;int err;setRadioState (RADIO_STATE_OFF);at_handshake();/* note: we don't check errors here. Everything important willbe handled in onATTimeout and onATReaderClosed *//* atchannel is tolerant of echo but it must *//* have verbose result codes */at_send_command("ATE0Q0V1", NULL);/* No auto-answer */at_send_command("ATS0=0", NULL);/* Extended errors */at_send_command("AT+CMEE=1", NULL);/* Network registration events */err = at_send_command("AT+CREG=2", &p_response);/* some handsets -- in tethered mode -- don't support CREG=2 */if (err < 0 || p_response->success == 0) {at_send_command("AT+CREG=1", NULL);}at_response_free(p_response);/* GPRS registration events */at_send_command("AT+CGREG=1", NULL);/* Call Waiting notifications */at_send_command("AT+CCWA=1", NULL);/* Alternating voice/data off */at_send_command("AT+CMOD=0", NULL);/* Not muted */at_send_command("AT+CMUT=0", NULL);/* +CSSU unsolicited supp service notifications */at_send_command("AT+CSSN=0,1", NULL);/* no connected line identification */at_send_command("AT+COLP=0", NULL);/* HEX character set */at_send_command("AT+CSCS=\"HEX\"", NULL);/* USSD unsolicited */at_send_command("AT+CUSD=1", NULL);/* Enable +CGEV GPRS event notifications, but don't buffer */at_send_command("AT+CGEREP=1,0", NULL);/* SMS PDU mode */at_send_command("AT+CMGF=0", NULL);#ifdef USE_TI_COMMANDSat_send_command("AT%CPI=3", NULL);/* TI specific -- notifications when SMS is ready (currently ignored) */at_send_command("AT%CSTAT=1", NULL);#endif /* USE_TI_COMMANDS *//* assume radio is off on error */if (isRadioOn() > 0) {setRadioState (RADIO_STATE_SIM_NOT_READY);}}默认状况下假设射频模块是好的,通过 setRadioState (RADIO_STATE_SIM_NOT_READY) 来触发对⽆线模块的初始化。
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进程是所有用户进
安卓手机开机操作方法教程
安卓手机开机操作方法教程
开机操作方法教程:
1. 确保手机电池有电,插入SIM卡和存储卡(如果有)。
2. 按住手机侧面或背面的电源键。
通常,电源键是位于手机顶部、侧面或背面的按钮。
3. 长按电源键,直到手机屏幕上出现品牌或厂商的Logo。
4. 松开电源键,并等待几秒钟,直到手机完全开机。
5. 一旦手机开机,屏幕将显示“滑动解锁”、“输入密码”或其他相关提示。
6. 根据您的手机设置,您可以滑动屏幕或输入密码来解锁手机。
7. 解锁后,您可以开始使用手机了。
您可以滑动屏幕浏览应用程序、拨打电话、发送短信等。
请注意,不同品牌和型号的安卓手机可能会有略微不同的开机操作方法。
此教程适用于大多数安卓手机。
如有需要,请参考您手机的用户手册或官方网站,以了
解详细操作方法。
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系统启动过程有⼀个更加深⼊的了解!再次强调,本⽂的⼤多数功劳应归功于那些原创者们,同时⼀些必要的参考链接我会⼀⼀附上。
注:由于本⼈采⽤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的启动过程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系统开机启动流程分析
一,系统引导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】。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A n d r o i d开机启动流程(总13页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--Android的开机流程1. 系统引导bootloader1) 源码:bootable/bootloader/*2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写b) 开机按Home+Power启动到recovery模式,加载,包含内核,基本的文件系统,用于工程模式的烧写c) 开机按Power,正常启动系统,加载,包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)2. 内核kernel1) 源码:kernel/*2) 说明:kernel由bootloader加载3. 文件系统及应用init1) 源码:system/core/init/*2) 配置文件:system/rootdir/,3) 说明:init是一个由内核启动的用户级进程,它按照中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能4. 重要的后台程序zygote1) 源码:frameworks/base/cmds/等2) 说明:zygote是一个在中被指定启动的服务,该服务对应的命令是/system/bin/app_processa) 建立Java Runtime,建立虚拟机b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序c) 启动System Server5. 系统服务system server1) 源码:frameworks/base/services/java/com/android/server/2) 说明:被zygote启动,通过System Manager管理android 的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)6. 桌面launcher1) 源码:为入口,packages/apps/launcher*实现2) 说明:系统启动成功后SystemServer使用()通知各个服务,系统已经就绪,桌面程序Home就是在()通知的过程中建立的,最终调用 ()启launcher7. 解锁1) 源码:frameworks/policies/base/phone/com/android/internal/policy/impl/*lock *2) 说明:系统启动成功后SystemServer调用()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置8. 开机自启动的第三方应用程序1) 源码:frameworks/base/services/java/com/android/server/am/2) 说明:系统启动成功后SystemServer调用().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播以告知已注册的第三方程序在开机时自动启动。
9. 总结综上所述,系统层次关于启动最核心的部分是zygote(即app_process)和system server,zygote它负责最基本的虚拟机的建立,以支持各个应用程序的启动,而system server用于管理android后台服务,启动步骤及顺序。
10. 参考启动过程详解Android从Linux系统启动有4个步骤;(1) init进程启动(2) Native服务启动(3) System Server,Android服务启动(4) Home启动总体启动框架图如:第一步:initial进程(system/core/init)init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。
init始终是第一个进程.进程一起来就根据和脚本文件建立了几个基本的服务:servicemanamgerzygote。
最后Init并不退出,而是担当起property service的功能。
脚本文件init@System/Core/Init: parse_config_file@parse_config_file解析脚本文件:和硬件平台相关)是Android自己规定的初始化脚本(Android Init Language,System/Core/Init/该脚本包含四个类型的声明:ActionsCommandsServicesOptions.服务启动机制我们来看看Init是这样解析.rc文件开启服务的。
(1)打开.rc文件,解析文件内容@ system/core/init/将service信息放置到service_list中。
@ system/core/init(2)restart_service()@ system/core/init/service_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/开始。
(1) main(…)@frameworks/base/cmds/建立Java Runtime("", startSystemServer);(2)建立虚拟机运行::main函数。
(3)ProcessState::self()->startThreadPool();中建立了Android中所有要用到的服务。
这个init2()建立了一个线程,来New Service和AddService来建立服务第三步 Home启动在后半段,我们可以看到系统在启动完所有的Android服务后,做了这样一些动作:(1)使用()通知各个服务,系统已经就绪。
(2) 特别对于(回调),imm(输入法)等ready通知。
Home就是在()通知的过程中建立的。
下面是()的伪代码resumeTopActivityLocked()startHomeActivityLocked();The corresponding source code lies in: device/system/init. It does the following tasks step by step:log system./ and /init.%hardware%.rc.3. Execute early-init action in the two files parsed in step 2.4. Device specific initialize. For example, make all device node in/dev and download firmwares.5. Initialize property system. Actually the property system isworking as a share memory. Logically it looks like a registry under Windows system.6. Execute init action in the two files parsed in step 2.7. Start property service.8. Execute early-boot and boot actions in the two files parsed instep 2.9. Execute property action in the two files parsed in step 2.10. Enter into an indefinite loop to wait for device/propertyset/child process exit events. For example, if an SD card is plugined, init will receive a device add event, so it can make node for the device. Most of the important process is forked in init, so if any of them crashed, init will receive a SIGCHLD then translate it into a child process exit event, so in the loop init can handle the processexit event and execute the commands defined in *.rc(it will run command onrestart).The .rc file is a script file defined by Android. The default is device/system/rootdir/. We can take a loot at the fileformat(device/system/init/ is a good overall introduction of the script). Basically the script file contains actions and services. ActionsActions are named sequences of commands. Actions have a trigger which is used to determine when the action should occur. When an event occurs which matches an action's trigger, that action is added to the tail of a to-be-executed queue (unless it is already on the queue). Each action in the queue is dequeued in sequence and each command in that action is executed in sequence. Init handles other activities (device creation/destruction, property setting, process restarting) "between" the execution of the commands in activities.Actions take the form of:on <trigger><command><command><command>...ServicesServices are programs which init launches and (optionally) restarts when they exit. Services take the form of:service <name> <pathname> [ <argument> ]*<option><option>...OptionsOptions are modifiers to services. They affect how and when init runs the service.TriggersTriggers are strings which can be used to match certain kinds of events and used to cause an action to occur.The builtin supported commands are defined in device/system/init/. Commands are implementd in device/system/init/.The init program only executes five kinds of triggers: “early-init”, “init”, “early-boot”, “boot”, “property:*”. Take a look atthe following line in default .class_start defaultThis line is a command for the action corresponding to “boot” trigger. It will start all services whose class name equals to “default”. By default, if no class option is defined for a s ervice, the service’s class name is “default”. So this line will start all the services in the order of position in the file by default. (BTW, you can start any service using start commands, if you like.) Any service is run as a forked process of init, take a look at the source code of service_start in device/system/.So according to the default , the following services will be executed step by step:console: star a shell. The source is in device/system/bin/ash.adbd: start adb daemon. The source is in device/tools/adbd. Bydefault is disabled.servicemanager: start binder system. The source is indevice/commands/binder.mountd: mount all fs defined in /system/etc/ if started, receive commands through local socket to mount any fs. The source is indevice/system/bin/mountd.debuggerd: start debug system. The source is indevice/system/bin/debuggerd.rild: start radio interface layer daemon. The source is indevice/commands/rind.zygote: start Android Java Runtime and start system server. It’s the most important service. The source is in device/servers/app.media: start AudioFlinger, MediaPlayerService and CameraService. The source is in device/commands/mediaserver.bootsound: play the default boot sound /system/media/audio/ui/. The source is in device/commands/playmp3.dbus: start dbus daemon, it’s only used by BlueZ. The source is in device/system/Bluetooth/dbus-daemon.hcid: redirect hcid’s stdout and stderr to the Android logging system. The source is in device/system/bin/logwrapper. By default is disabled.hfag: start Bluetooth handsfree audio gateway, it’s only used by BlueZ. The source is in device/system/Bluetooth/bluez-utils. Bydefault is disabled.hsag: start Bluetooth headset audio gateway, it’s only used by BlueZ. The source is in device/system/Bluetooth/bluez-utils. By default is disabled.installd: start install package daemon. The source is indevice/servers/installd.flash_recovery: load /system/. The source is indevice/commands/recovery/mtdutils.Zygote service does the following tasks step by step:1. Create JAVA VM.2. Register android native function for JAVA VM.3. Call the main function in the JAVA class named whose source is device/java/android/com/android/internal/os/.a) Load ZygoteInit classb) Register zygote socketc) Load preload classes(the default file isdevice/java/android/preloaded-classes)d) Load preload resourcese) Call Zygote::forkSystemServer (implemented in device/dalvik/vm/ to fork a new process. In the new process, call the main function in the JAVA class named whose source is indevice/java/services/com/android/server.i.Loadii.Call JNI native init1 function implemented indevice/libs/android_servers/com_android_server_SystemServers. It only calls system_init implemented in device/servers/system/library/.If running on simulator, instantiate AudioFlinger, MediaPlayerService and CameraService here.Call init2 function in JAVA class named whose source is in device/java/services/com/android/server. This functionis very critical for Android because it start all of Android JAVA services.If not running on simulator, call IPCThreadState::self()->joinThreadPool() to enter into service dispatcher.SystemServer::init2 will start a new thread to start all JAVA services as follows:Core Services:1. Starting Power Manager Creating Activity Manager3. Starting Telephony Registry Starting Package Manager Set Activity Manager Service as System Process6. Starting Context Manager7. Starting System Context Providers8. Starting Battery Service Starting Alarm Manager Starting Sensor Service11. Starting Window Manager12. Starting Bluetooth Service Starting MountService Starting Status Bar Service2. Starting Hardware Service3. Starting NetStat Service4. Starting Connectivity Service5. Starting Notification Manager6. Starting DeviceStorageMonitor Service7. Starting Location Manager8. Starting Search Service9. Starting Clipboard Service10. Starting Checkin Service11. Starting Wallpaper Service12. Starting Audio Service13. Starting HeadsetObserver14. Starting AdbSettingsObserverFinally SystemServer::init2 will call to launch the first activity by senting intent.There is another way to start system server, which is through a program named system_server whose source is device/servers/system/.It also calls system_init to start system services. So there is a question: why does Android have two methods to start system services My guess is that directly start system_server may have synchronous problem with zygote because system_server will call JNI to start SystemServer::init2, while at that time zygote may not start JAVA VM yet. So Android uses another method. After zynote is initialized,fork a new process to start system services.Android 启动过程1. Boot系统初始化,具体过程参见(system\core\init\中的main函数,这时候,手机或者模拟器出现的画面是一个console,显示“ANDROID”msg。