为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

Android_开机启动流程

2011-08-29 13页 doc 174KB 44阅读

用户头像

is_364666

暂无简介

举报
Android_开机启动流程Android的开机流程   1.    系统引导bootloader 1)        源码:bootable/bootloader/* 2)        说明:加电后,CPU将先执行bootloader程序,此处有三种选择 a)        开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写 b)        开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统...
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 a)        建立Java Runtime,建立虚拟机 b)        建立Socket接收ActivityManangerService的请求,用于Fork应用程序 c)        启动System Server 5.    系统服务system server 1)        源码:frameworks/base/services/java/com/android/server/SystemServer.java 2)        说明:被zygote启动,通过System Manager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等) 6.    桌面launcher 1)        源码:ActivityManagerService.java为入口,packages/apps/launcher*实现 2)        说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用 ()启launcher 7.    解锁 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.java 2)        说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefault().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。 9.    综上所述,系统层次关于启动最核心的部分是zygote(即app_process)和system server,zygote它负责最基本的虚拟机的建立,以支持各个应用程序的启动,而system server用于管理android后台服务,启动步骤及顺序。 10. 参考 http://blog.csdn.net/basonjiang_sz/category/648399.aspx Android 启动过程详解 Android从Linux系统启动有4个步骤; (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) Home启动 总体启动框架图如:   第一步:initial进程(system/core/init)      init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程. Init.rc Init.marvell.rc Init进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务:  servicemanamger  zygote 。。。 最后Init并不退出,而是担当起property service的功能。 1.1脚本文件 init@System/Core/Init Init.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) 该脚本包含四个类型的声明: Actions Commands Services Options. 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.c service_start execve(…).建立service进程。 第二步 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应用程序。 第三步 System Server startSystemServer@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.java resumeTopActivityLocked() startHomeActivityLocked();//如果是第一个则启动HomeActivity。 startActivityLocked(。。。)CATEGORY_HOME Android Booting: init is the first process after kernel started. The corresponding source code lies in: device/system/init. It does the following tasks step by step: 1.Initialize log system. 2.Parse /init.rc 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 is working 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 in step 2. 9. Execute property action in the two files parsed in step 2. 10. Enter into an indefinite loop to wait for device/property set/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 process exit 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/init.rc. We can take a loot at the file format(device/system/init/readme.txt is a good overall introduction of the script). Basically the script file contains actions and services. Actions Actions 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          ... Services Services are programs which init launches and (optionally) restarts when they exit.  Services take the form of: service [ ]*   
/
本文档为【Android_开机启动流程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索