资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。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_process资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。a)建立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.参考资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。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.rcInit进程一起来就根据init.rc和 init.xxx.rc脚本文件建立了几个基本的服务 :servicemanamgerzygote。最后 Init并不退出 ,而是担当起 property service的功能。1.1 脚本文件initSystem/Core/InitInit.c: parse_config_file(Init.rc)parse_config_file(Init.marvel.rc)解析脚本文件: Init.rc和Init.xxxx.rc(硬件平台相关)Init.rc是Android自 己 规 定 的 初 始 化 脚 本(AndroidInitLanguage,System/Core/Init/readme.txt)该脚本包含四个类型的声明:Actions资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。CommandsServicesOptions.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)建立虚 机运行 : com.android.internal.os.ZygoteInit: main函数。( 3) main()com.android.internal.os.ZygoteInit/正真的Zygote 。registerZygoteSocket();/登 Listen端口startSystemServer();
展开阅读全文