zoukankan      html  css  js  c++  java
  • Android 启动流程简介

    Android 启动流程:
     
    1. linux OS
        Bootloader -> Linux kernel
    2. Android/Init Runtime
        Init Process -> Services -> Zygote/VM -> System Server
    3. Framework HomeScreen
        Server Manager -> Home Luncher
    如下图:
    Android 启动流程:
        1). 源码 bootable/bootloader
        2). 上电后,CPU将先执行bootloader 程序,此时有三种情况:
              a. fastboot 模式即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写
              b. recovery 模式,加载recovery.img, 它包含有内核及基本的文件系统,用于工程模式烧写
              c. 正常启动,加载boot.img, 它包含内核及基本的文件系统,用于正常启动手机。
         bootloader(汇编语言)进行底层初始化,并加载内核代码,最终跳转到内核的boot程序。
        简单地说,BootLoader是在操作系统运行之前运行的一段程序,它可以将系统的软硬件环境带到一个合适状态,为运行操作系统做好准备。这样描述是比较抽象的,但是它的任务确实不多,终极目标就是把OS拉起来运行。
    2.  内核Kernel
        1)kernel核心初始化(内存初始化,打开中断,初始化进程表等等);
        2)驱动初始化;
        3)启动内核后台(daemons)线程
        4)安装根(root)文件系统
        5) 启动第一个用户级进程init
         kernel 就由bootloader 加载的,源码:kernel
    3.   Init 
        1) 源码:system/core/init/* 
        2) 配置文件:system/rootdir/init.rc
        init进程的程序在system/core/init/init.c里,它是android系统特定的初始化程序, 是一个由内核启动的用户级进程,最终它会以后台进程(daemon)的形式一直存在。该进程主要有如下功能:
        3)创建/安装设备文件/进程文件/系统文件节点;
        4)解析启动/init.rc和/init.<machine_name>.rc;
        5)显示Logo画面;
        6)打开Device Socket,Property Socket, child进程通信Socket;
        7)执行脚本中指定的命令或动作,启动指定服务;如最基本的servicemanamger 及Zygote
        8)进入死循环:检查是否有action需要执行;是否需要restart某服务;监听特定事件(child进程退出,Device相关事件,Property事件,新服务启动)
    4. Native 服务启动  --servicemanager
    Servicemanager属于NativeService。在执行init.rc时就会启动,与Zygote一样。在init.rc脚本中Servicemanager的描述:serviceservicemanager/system/bin/servicemanager
    源码:frameworks/native/cmds/servicemanager/service_manager.c
     
    根据system/core/rootdir/init.rc, init进程通过open_keychord()从service_list(之前从.rc中解析出来的)中把所有service信息写入特定文件,handle_keychord()逐个读出然后调用service_start()创建(先fork()然后在子进程中调用execve()来执行相应的服务程序)指定的service进程。这里创建的service都属于native服务,运行在Linux空间,通过socket向上层提供特定的服务。例如:
    console: shell console服务.
    servicemanager: Binder服务管理器,管理所有Android系统服务
    vold: volume Daemon,支持存储外设的热插拔
    adbd: Android Debug Bridge Daemon,提供adb相关功能
    mountd: 设备安装Daemon,负责设备安装及状态通知
    debuggerd: Debug Daemon,处理调试进程的请求
    rild: 无线接口层(radio interface layer)Daemon.
    zygote: 启动Android Dalvik Runtime并负责进程孵化服务.
    mediaserver: 启动AudioFlinger, MediaPlayerService and CameraService.负责多媒体播放相关的功能,包括音视频解码、显示输出等。
    installd: 包安装Daemon,提供包安装/删除/dex处理等底层功能
    5. Zygote
    重要的后台程序zygote
       1) 源码:frameworks/base/cmds/app_process/app_main.cpp等 
       2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_process 
            a)  建立Java Runtime,建立虚拟机 
            b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序 
            c) 启动System Server 
    6. 系统服务system server 
    1)        源码:frameworks/base/services/java/com/android/server/SystemServer.java 
    2)        说明:被zygote启动,通过System Manager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等) 
    System Server作为Zygote的第1个子进程,是Android Framework的核心,它主要负责Android系统初始化并启动其他服务。其它的Android服务都由SystemServer启动并运行在该进程空间
    7.  桌面  launcher 
    1)        源码:ActivityManagerService.java为入口,packages/apps/launcher*实现 
    2)        说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用 ()启launcher
     
     
    Android 端启动过程详解
    1. init 进程启动
       a. system/core/rootdir/init.rc
       b. system/core/init/init.c  ,init_parser.c
       c. init 通过init.c 里的main ->init_parse_config_file("/init.rc")->parse_config->parse_new_section->parse_service-> 最终将所有service 加入到service_list
     
     
     
     
     
     
     
     
    Ref:

     

  • 相关阅读:
    两个排序数组的第k小——Java实现
    单向链表反转——递归与非递归实现
    白话HMM系列3——维特比算法求解隐藏序列
    白话Shell命令1——top查看Linux进程
    白话HMM系列2——Baum Welch算法的进阶
    Hadoop原理深度剖析系列1——Hadoop的基本知识
    白话HMM系列1——从一个缩略语还原的例子说起
    软件工程第二次作业
    Hello World!
    查看帐号授权信息
  • 原文地址:https://www.cnblogs.com/shed/p/3726878.html
Copyright © 2011-2022 走看看