当前位置:操作系统 > 安卓/Android >>

android开机启动流程说明

 

第一步:启动linux

 

1.Bootloader

 

2.Kernel

 

第二步android系统启动:入口为init.rc(system\core\rootdir)

 

1./system/bin/service manager: Binder 守护进程;

 

2.Runtime;

 

3.Zygote :app-process/app-main;

 

4.Start VM;

 

5.Start server

 

6.Start android service:Register to service Manager

 

7.Start Launcher

 

第三步:应用程序启动:运行package Manager

 

 

 

l  Init进程

 

Android系统在启动时首先会启动Linux系统,引导加载Linux Kernel并启动init进程。Init进程是一个由内核启动的用户级进程,是Android系统的第一个进程。该进程的相关代码在platform\system\core\init\init.c。在main函数中,有如下代码:

 

open_devnull_stdio();

    log_init();

   

    INFO("reading config file\n");

    init_parse_config_file("/init.rc");

 

    /* pull the kernel commandline and ramdisk properties file in */

    import_kernel_cmdline(0);

 

    get_hardware_name(hardware, &revision);

    snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);

    init_parse_config_file(tmp);

 

    这里会加载解析init.rc和init.hardware.rc两个初始化脚本。*.rc文件定义了在init进程中需要启动哪些进程服务和执行哪些动作。其详细说明参见platform\system\core\init\reademe.txt。init.rc见如下定义:

 

service servicemanager /system/bin/servicemanager

    user system

    critical

    onrestart restart zygote

    onrestart restart media

 

service vold /system/bin/vold

    socket vold stream 0660 root mount

    ioprio be 2

 

service netd /system/bin/netd

    socket netd stream 0660 root system

    socket dnsproxyd stream 0660 root inet

 

service debuggerd /system/bin/debuggerd

 

service ril-daemon /system/bin/rild

    socket rild stream 660 root radio

    socket rild-debug stream 660 radio system

    user root

    group radio cache inet misc audio sdcard_rw

 

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

    socket zygote stream 666

    onrestart write /sys/android_power/request_state wake

    onrestart write /sys/power/state on

    onrestart restart media

    onrestart restart netd

 

service drm /system/bin/drmserver

    user drm

    group system root inet

 

具体解析过程见platform\system\core\init\Init_parser.c。解析所得服务添加到service_list中,动作添加到action_list中。

 

 

 

接下来在main函数中执行动作和启动进程服务:

 

      execute_one_command();

        restart_processes()

 

通常init过程需要创建一些系统文件夹并启动USB守护进程、Android Debug Bridge守护进程、Debug守护进程、ServiceManager进程、Zygote进程等。

 

 

l  ServiceManager进程

 

ServiceManager进程是所有服务的管理器。由init.rc对ServiceManager的描述service servicemanager /system/bin/servicemanager可知servicemanager进程从platform\frameworks\base\cmd\servicemanager\Service_manager.cpp启动。在main函数中有如下代码:

 

int main(int argc, char **argv)

{

    struct binder_state *bs;

    void *svcmgr = BINDER_SERVICE_MANAGER;

 

    bs = binder_open(128*1024);

 

    if (binder_become_context_manager(bs)) {

        LOGE("cannot become context manager (%s)\n", strerror(errno));

        return -1;

    }

 

    svcmgr_handle = svcmgr;

    binder_loop(bs, svcmgr_handler);

    return 0;

}

 

首先调用binder_open()打开Binder设备(/dev/binder),调用binder_become_context_manager()把当前进程设置为ServiceManager。ServiceManager本身就是一个服务。

 

int binder_become_context_manager(struct binder_state *bs)

{

    return ioctl(bs->fd, BINDER_SET_CONTEXT_MGR, 0);

}

 

    最后binder_loop()进入循环状态,并设置svcmgr_handler回调函数等待添加、查询、获取服务等请求。

 

 

l  Zygote进程

 

         Zygote进程用于产生其他进程。由init.rc对zygote的描述service zygot /system/bin/app_process可知zygote进程从platfrom\frameworks\base\cmds\app_process\App_main.cpp启动。在main函数中有如下代码:

 

       if (0 == strcmp("--zygote", arg)) {

            bool startSystemServer = (i < argc) ?

                    strcmp(argv[i], "--start-system-server") == 0 : false;

            setArgv0(argv0, "zygote");

            set_process_name("zygote");

            runtime.start("com.android.internal.os.ZygoteInit",

                startSystemServer);

        } else {

            set_process_name(argv0);

 

            runtime.mClassName = arg;

 

            // Remainder of args get passed to startup class main()

            runtime.mArgC = argc-i;

            runtime.mArgV = argv+i;

 

            LOGV("App process is starting with pid=%d, class=%s.\n",

                 getpid(), runtime.getClassName());

            runtime.start();

        }

 

    首先创建AppRuntime,即AndroidRuntime,建立了一个Dalvik虚拟机。通过这个runtime传递com.android.internal.os.ZygoteInit参数,从而由Dalvik虚拟机运行ZygoteInit.java的main(),开始

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,