android 系统启动

android 的启动 分为三个阶段

       对于Android整个启动过程来说,基本可以划分成三个阶段:Bootloader引导、Linux kernel启动、Android启动。

  第一部分:Bootloader启动

 常用 U_Boot启动,启动过程中AP需要关心CP的启动。 涉及到涉及到CP的image和唤醒


启动过程中,包含一些上电引导。(手机的刷机,盒子的U盘升级 浙江贝尔鸟巢盒子)

BOX  检测U盘根目录 中的 update.zip

最终 load boot.img

 

说明:加电后,CPU将先执行bootloader程序,此处有三种选择

a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写

b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写

c)开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)


       第二部分:Linux启动

一、zImage是怎样炼成的?

二、linux的c启动阶段


linux内核编译之后产生的最终文件 zImage

经过解压缩和汇编启动两个阶段,将会进入init/Main.c中的start_kernel()函数去继续执行。启动init进程。


init进程是linux起来之后启动的第一个用户进程,android系统也就是在这个进

程的基础上启动的。进程号是1。

 

       第三部分:Android启动

                一、init进程

                二、init启动的各种服务

                三、android启动图示

             

 3. 1. init.rc 文件解析  和    服务启动。

init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,

并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程。

  启动过程就是代码init.c中main函数执行过程:system\core\init\init.c 在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听……

下面看两个重要的过程:rc


3.1.1 rc文件解析

  .rc文件是Android使用的初始化脚本文件 (System/Core/Init/readme.txt中有描述:
four broad classes of statements which are Actions, Commands, Services, and Options.)
  其中Command 就是系统支持的一系列命令,如:export,hostname,mkdir,mount,等等,其中一部分是 linux 命令,
还有一些是 android 添加的,如:class_start <serviceclass>: 启动服务,class_stop <serviceclass>:关闭服务,等等。
  其中Options是针对 Service 的选项的。
系统初始化要触发的动作和要启动的服务及其各自属性都在rc脚本文件中定义。 具体看一下启动脚本:\system\core\rootdir\init.rc
       在解析rc脚本文件时,将相应的类型放入各自的List中:
  \system\core\init\Init_parser.c  :init_parse_config_file( )存入到
  action_queue、   action_list、 service_list中,解析过程可以看一下parse_config函数,类似状态机形式挺有意思。
  这其中包含了服务:adbd、servicemanager、vold、ril-daemon、debuggerd、surfaceflinger、zygote、media……


2 服务启动

       文件解析完成之后将service放入到service_list中。

 

文件解析完成之后将service放入到service_list中。

   \system\core\init\builtins.c

       Service的启动是在do_class_start函数中完成:

int do_class_start(int nargs, char **args)
{
    service_for_each_class(args[1], service_start_if_not_disabled);    return 0;
}

 

遍历所有名称为classname,状态不为SVC_DISABLED的Service启动





init ----启动>ServiceManager(守护进程)

        ---启动> Zygote (app_main.app)  ----> androidRuntime.cpp(启动Runtime) ----JNI call>zygoteInit.java ---main Jni call> SystemServer.java


SystemServer  --- main

                            --- init1 ----call>com_android_server_systemserver.cpp  和 system_init.cpp --->call init2

                            --- init2  ---->Runtime call static  ServiceThread


ServiceThread  包括wms    pms   ams 等等 系统的服务



    其余addservice的过程类似,只是启动的不同服务罢了,后面还启动了很多

服务,如:Lights、Vibrator、Alarm、Sensor、Bluetooth、Input Method、NetStat、NetworkManagement、Connectivity、Mount、Notification、Audio等。在这些服务都启动完了之后。

        …

        …

        … // run()函数的后半部分

        // It is now time to start up the app processes...

        使用xxx.systemReady()通知各个服务,系统已经就绪。


  Home在

((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(.)

函数调用的过程中启动,其中systemReady()的参数是一段callback代码, 

这个函数的实现部分在文件:ActivityManagerService.java中。

public void systemReady(final Runnable goingCallback) {

    …

    if (mSystemReady) {

        if (goingCallback != null) goingCallback.run();

        return; // 执行回调

    }

    …

    resumeTopActivityLocked(null);

}

private final boolean resumeTopActivityLocked(HistoryRecord prev) {

    …

    if (next == null) {

        // There are no more activities!  Let's just start up the

        // Launcher...

        return startHomeActivityLocked();

    }

    …

}

private boolean startHomeActivityLocked() {

    …

    if (aInfo != null) {

        …

        if (app == null || app.instrumentationClass == null) {

                intent.setFlags(intent.getFlags() |

                                Intent.FLAG_ACTIVITY_NEW_TASK);

                startActivityLocked(null, intent, null, null, 0, aInfo,

                        null, null, 0, 0, 0, false, false); // 这里启动home

         }

     }

    …

}








你可能感兴趣的:(android 系统启动)