Android 启动过程详解
http://blog.csdn.net/maxleng/archive/2010/04/20/5508372.aspx
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
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/maxleng/archive/2010/04/20/5508372.aspx
分享到:
相关推荐
### Android启动过程详解 #### 一、Android启动过程概述 Android操作系统从启动到用户界面的显示,整个过程涉及多个步骤,主要包括以下四个阶段: 1. **init进程启动**:这是Android启动过程的第一步,主要负责...
### Android编译过程详解 #### 一、概览 Android作为一个全球范围内广泛应用的操作系统平台,其内部机制和构建流程对于开发者来说非常重要。本文将以Android 2.1版本为基础,使用华清远见研发的FS_S5PC100A8开发板...
在深入探讨Android编译过程之前,首先需要理解的是Android系统的开放性使得开发者和制造商能够根据特定硬件需求定制操作系统。例如,小米、LePhone和M9等品牌就利用这一特性为自家设备打造独特的用户体验。要对...
在Android项目开发详解中,我们将深入探讨Android应用的开发流程,技术细节以及最佳实践。Android作为全球最受欢迎的移动操作系统之一,其开发环境、工具集、API以及设计模式都是开发者需要掌握的关键知识点。 首先...
这个"Android项目开发详解源代码"很可能是配合某个视频教程或书籍提供的实践材料,旨在帮助学习者深入理解Android应用的构建过程。下面,我们将深入探讨Android项目开发中的核心知识点,以及这些源代码可能涉及的...
"Android应用开发详解"的主题深入探讨了这个过程,提供了从基础到高级的全方位指导。此资源包括了2-18章的完整代码,这对于初学者和有经验的开发者来说都是宝贵的实践材料。 1. **Android SDK**: 开发Android应用的...
总之,《Android应用开发详解》不仅涵盖了Android开发的基本概念和技术,还提供了实用的代码示例和实战技巧,对于希望进入Android开发领域的学习者来说,是一份不可多得的资源。光盘中的额外材料则为实践学习提供了...
总之,“Android应用开发详解(包括源码)”将带你走过从基础到高级的整个开发过程,通过实际的代码示例,你将能更直观地理解和掌握Android应用开发的核心技术。无论是初学者还是有经验的开发者,这份资源都能提供...
这份资源包含一个PDF文档,可能涵盖了从基础到高级的Android开发主题,以及与之配套的全部源代码,这使得学习过程更具实践性。 PDF文档可能会包含以下章节: 1. **Android概述**:介绍Android操作系统的历史、架构...
1. **Intent的类型** - **显式Intent**:直接指定要启动的目标组件,如Activity或Service的完整类名。这种Intent具有明确的目的地,系统不会进行任何筛选,直接启动指定的组件。 ```java Intent intent = new ...
嵌入式Linux启动过程是操作系统在硬件平台上初始...Android开发板的文档(如"android开发板.doc"和"android开发.PDF")则可能涵盖与特定平台相关的启动信息和开发实践,这些资源对于深入学习和解决实际问题十分有价值。
《Android底层开发技术实战详解:内核移植与驱动》是一本深入探讨Android系统底层开发的专著,旨在帮助读者理解并掌握Android系统的核心技术。本书着重讲解了Linux内核的基本原理,以及如何将Linux内核移植到Android...
在学习源码的过程中,我们还需要关注Android框架层的变化,例如Android Jetpack组件库的使用,包括Lifecycle、ViewModel、Room等,这些都是现代Android开发的必备工具。 最后,调试技巧也是源码学习的一部分,学会...
5. **Bootloader和Recovery**:Android设备启动过程中,Bootloader首先运行,它负责加载操作系统到内存。Recovery模式则用于系统维护,如升级固件、恢复出厂设置。掌握Bootloader解锁和Recovery修改技巧是进行深度...
总的来说,Android应用开发详解2将带领我们深入Android世界,通过实际案例学习,逐步成长为一名熟练的Android开发者。这个过程中,我们需要不断探索、实践和优化,才能创作出满足用户需求的高质量应用。
学习如何编写单元测试,使用Android Studio的调试工具,以及使用模拟器或真实设备进行测试,是开发过程中的重要环节。 通过"Android开发应用详解教程",初学者可以系统地学习以上知识点,逐步成长为一名熟练的...