`
寻梦者
  • 浏览: 638177 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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核心分析 之九-------Zygote Service

在本章我们会接触到这两个单词:

Zygote [生物] 受精卵, 接合子, 接合体

Spawn:产卵

通过这两个单词,我们就可以大体知道Zygote是干什么的了,就是叫老母鸡下蛋。通过“Zygote”产出不同的子“Zygote”。从大的架构上讲,Zygote是一个简单的典型C/S结构。其他进程作为一个客服端向Zygote发出”孵化”请求,Zygote接收到命令就“孵化”出一个Activity进程来。

Zygote系统代码组成及其调用结构:

Zygote.java

提供访问Dalvik “zygote”的接口。主要是包装Linux系统的Fork,以建立一个新的VM实例进程。

ZygoteConnection.java

Zygote的套接口连接管理及其参数解析。其他Actvitiy建立进程请求是通过套接口发送命令参数给Zygote。

ZygoteInit.java

Zygote的main函数入口。

Zygote系统代码层次调用

main()

startSystemServer()…

runSelectLoopMode()

Accept socket connection

Conntecion.RunOnce()

Read argument

folkAndSpecialize

folkAndSpecialize使用Native函数Dalvik_dalvik_system_Zygote_forkAndSpecialize

//native 的获取

dalvik/vm/native

//dalvik_system_Zygote.c

const DalvikNativeMethod dvm_dalvik_system_Zygote[] = {

{ "fork", "()I",

Dalvik_dalvik_system_Zygote_fork },

{ "forkAndSpecialize", "(II[II[[I)I",

Dalvik_dalvik_system_Zygote_forkAndSpecialize },

{ "forkSystemServer", "(II[II[[I)I",

Dalvik_dalvik_system_Zygote_forkSystemServer },

{ NULL, NULL, NULL },

};

在这里我们就有了Zygote服务的全貌理解,也在Code中印证了。【应yk_hu0621修正】{由于Android中没有具体应用程序的入口,都是通过启动Actvity来启动相关的Android应用,而这个 Android应用则对应着Linux进程,Activity便Host在这个应用程序上。}

{原文:Activity在本质上是个什么东西,就是一个Linux进程}

从分析中我们可以看到,Android使用了Linux的fork机制。在Linux中Fork是很高效的。

一个Android的应用实际上一个Linux进程,所谓进程具备下面几个要素,

a.要有一段程序供该进程运行,程序是可以被多个进程共享的。

b..进程专用的系统堆栈空间。

c.进程控制块,在linux中具体实现是task_struct

d.有独立的存储空间。

fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容,在复制过程中,子进程复制了父进程的task_struct,系统堆栈空间和页面表,而当子进程改变了父进程的变量时候,会通过copy_on_write的手段为所涉及的页面建立一个新的副本。所以只有子进程有改变变量时,子进程才新建了一个页面复制原来页面的内容,基本资源的复制是必须的,整体看上去就像是父进程的独立存储空间也复制了一遍。

再看看下面Google在讲解Dalvik虚拟机的图片,我们就大体有了Android系统中Actvitiy的实际映射状态有了基本的认识。

分享到:
评论
1 楼 weisi2375 2012-06-15  
  分析的很透彻。

相关推荐

    Android数据库初始化技术研究.pdf

    《Android数据库初始化技术研究》这篇文献深入探讨了在Android应用开发中如何有效地进行数据库初始化,主要涉及了Android的分层架构、数据持久化方法以及针对SQLite数据库的不同初始化方案,并进行了性能对比和分析...

    Android_Surfaceflinger研究-显示系统

    这个过程涉及到`gralloc.msm7x30.so`的调用,确保了`FrameBuffer`的正确初始化和使用。 #### 结论 SurfaceFlinger作为Android显示系统的核心,通过`DisplayHardware`和`FramebufferNativeWindow`等组件的协同工作...

    Android初始化流程简要分析(英文版)

    本篇文章将详细阐述Android系统从按下电源键到用户界面显示的整个初始化阶段,帮助初学者掌握这一复杂的系统启动机制。 ### 一、引导加载器(Bootloader) Android设备的启动首先由Bootloader控制,这是一个低级别...

    linux 内核启动过程以及挂载android 根文件系统的过程

    同时,Android源代码的组织结构清晰地展示了系统各个组成部分之间的关系,这对于理解整个Android系统的构建和运行机制非常重要。了解这些内容不仅有助于开发者更好地调试和优化系统,也为进一步研究Android平台提供...

    Android属性系统分析

    由于Android的开源特性,使得系统属性的研究对于开发者来说非常重要,尤其是对于那些致力于深入学习Android系统行为和进行定制化开发的开发者而言。 1. Android属性系统的作用: Android属性系统的一个重要功能是...

    linux内存初始化

    Linux内存初始化过程首先从内核参数的获取开始。系统启动时,内核需要知道可用的内存大小、控制台设备以及initrd(初始RAM磁盘)的位置。这些信息通常在平台的defaultConfig配置中指定。但在某些情况下,系统实际...

    Android操作系统移植及关键技术研究

    Bootloader是设备启动时运行的第一个程序,负责初始化硬件环境并加载操作系统内核。在Android系统移植中,根据目标硬件的特点定制Bootloader,确保系统能够正确启动,是整个移植流程的基础。 #### 3. **Linux内核...

    安卓Android源码——Pax.zip

    当我们提到“Pax.zip”时,它可能是指Android系统中的一部分源代码或特定组件,因为“Pax”在Android源码中通常与系统的初始化过程和权限管理有关。 Android系统的启动流程非常复杂,涉及到多个阶段,其中Pax是初始...

    安卓Android源码——Tag.rar

    2. **System Server**:Android系统服务器,负责初始化系统服务,管理应用程序生命周期,处理系统级广播等。 3. **Activity Manager**:管理应用程序的启动、暂停、恢复和销毁,实现界面的切换和回退栈管理。 4. **...

    android系统下载源码

    2. 获取AOSP源码仓库:通过`repo`工具初始化和同步源码。`repo`是一个Python脚本,用于管理多个Git仓库的同步。 3. 设置环境:根据设备或模拟器的需求,配置编译环境,如NDK、SDK、JDK等。 4. 同步源码:使用`repo ...

    Android的系统框架

    #### 一、研究与开发Android系统框架的重要意义 研究和开发Android系统的框架具有深远的意义,主要包括以下几点: 1. **深层次的跟踪和调试**:通过理解系统框架,开发者能够对系统行为有更深入的了解,从而进行更...

    安卓Android源码——系统源码获取及编译.zip

    这份名为“安卓Android源码——系统源码获取及编译”的压缩包文件,显然旨在帮助开发者掌握如何获取和编译Android系统的源代码。接下来,我们将详细探讨这个主题。 首先,获取Android源码主要涉及Git版本控制工具的...

    安卓系统源码 (android 14 rar)

    2. **Kernel**:加载必要的驱动,初始化硬件。 3. **Init进程**:第一个用户空间进程,启动System Server和Zygote进程。 4. **System Server**:管理系统服务,如AMS(Activity Manager Service)、WMS等。 5. **...

    基于Android系统的Wi-Fi模块研究.pdf

    * Wi-Fi模块的启动和接入点查找连接的实现方法:Wi-Fi模块的启动过程包括初始化、扫描、连接和身份验证等步骤。在连接过程中,Wi-Fi模块需要查找可用接入点,并与其进行连接。 四、Wi-Fi模块在Android系统中的应用 ...

    Android系统中Wi-Fi网络的研究与实现.pdf

    本文详细介绍了Android系统中Wi-Fi网络的研究与实现方法,包括Wi-Fi模块的组成、关键组件的功能以及Wi-Fi网络的初始化、启动、接入点扫描和IP地址配置的实现。通过对Wi-Fi驱动程序的移植与调试,成功地验证了Wi-Fi...

    Android系统源代码

    从引导加载器(Bootloader)到系统初始化,Android的启动过程涉及多个阶段,如内核启动、init进程、Zygote进程以及System Server启动。理解这个流程对于优化系统启动时间和性能至关重要。 通过深入研究Android 4.0...

    Android底层架构研究

    通过分析AndroidApplication,可以了解应用程序如何初始化、如何响应系统事件以及如何与其他组件交互。 ### **21. Android应用框架之Activity** Activity是Android应用程序中最基本的组件之一,它代表了一个屏幕上...

    基于Cortex-A9架构的Android系统移植研究.pdf

    总结而言,本文详细记录了基于Cortex-A9架构的Android系统移植过程中的关键技术和步骤,对于希望在该领域进行研究和开发的人员来说,是一个宝贵的参考资料。文章不仅深入探讨了系统架构的简析,还具体说明了如何搭建...

    Android 启动过程相关资料

    Android启动过程是一个复杂而有序的系统初始化阶段,涵盖了操作系统内核加载、系统服务启动、用户界面呈现等多个步骤。在这个过程中,Makefile起着至关重要的作用,它是构建Android系统的基石之一。 首先,Android...

    android系统移植资料集锦

    9. **系统启动流程**:理解Zygote进程的启动、SystemServer的初始化以及Dalvik/ART虚拟机的运行机制,有助于解决启动过程中的问题。 10. **系统调试**:利用adb、logcat、ddms等工具进行系统调试,找出移植过程中的...

Global site tag (gtag.js) - Google Analytics