Android启动流程可以说是整个系统运行的基础,了解其启动过程可以更好地编写自己的应用。本文将对Android系统启动流程进行详细的分析,帮助读者更好地理解Android系统启动的整个过程。
一、Bootloader
当Android设备开机时,首先执行的是bootloader,其主要作用是引导Linux内核的启动。Bootloader程序运行时会加载内核镜像和文件系统镜像到内存中,然后跳转到内核的启动地址,将控制权交给内核。
    .text
    .globl _start
    _start:
    /* perform power-on self-tests */
    test   %al, %al
    jne        got_linux
 
    /* program FPGA */
    call      program_fpga
    cmp  %al, %al
    jne     got_linux
 
    /* invoke BIOS */
    call      setup_bios
    cmp  %al, %al
    jne     got_linux
 
    /* boot Linux kernel */
    call      boot_linux
二、Linux内核
在引导程序的帮助下,Linux内核开始启动,其主要作用是建立系统的第一个进程,该进程即是用户空间的init进程。内核启动后会完成以下操作:
● 提取自己的代码和数据到RAM中。
● 初始化硬件设备,设置内存和中断控制器。
● 构建虚拟文件系统。
● 启动第一个用户空间进程init。
    /* Set up memory and interrupts */
    setup_arch(&command_line);
 
    /* Do CPU specific initialisation */
    (void)cpu_init();
 
    /* Initialize scheduler */
    scheduler_init();
 
    /* Call init function of each module */
    initcall_start = &__initcall_start;
    initcall_end = &__initcall_end;
    for (; initcall_start<initcall_end; initcall_start++)
        (*initcall_start)();
 
    /* Start init */
    init();
三、init进程
当init进程启动后,系统的大部分服务和进程都已经准备就绪,因此,init进程会在执行自己的初始化操作之后,开始启动其他系统服务和进程。下面是init进程的主要作用:
● 加载init.rc配置文件,从而启动其他服务和进程。
● 执行各个服务的初始化脚本,使其进入运行状态。
● 启动标准输入输出服务,该服务提供了与设备交互的接口。
    /* Main function */
    int main(int argc, char **argv)
    {
        struct init_action *act;
 
        /* Setup signal handlers */
        setup_signal_handlers();
 
        /* Open log */
        open_log();
 
        /* Parse args */
        parse_args(argc, argv);
 
        /* Register action drivers */
        register_action_drivers();
 
        /* Execute scripts from /init.*.rc */
        execute_scripts();
 
        /* Execute the default action */
        act = find_action("default");
        execute_action(act);
 
        /* Daemonize */
        if (!FLAG_NO_DAEMON)
            daemonize();
 
        return 0;
    }
四、Zygote进程
Zygote进程是Android系统中的重要进程之一,其主要作用是为所有新建的进程提供创建和初始化的模板。Zygote进程启动后会完成以下操作:
● fork出多个子进程,用于处理用户应用程序请求。
● 注册ActivityManager和SystemServer进程。
● 将应用程序的资源文件与进程相关的信息加载到内存中。
    /* Main function */
    int main(int argc, char **argv)
    {
        pid_t pid;
        int retval;
 
        /* Determine caller user ID */
        determine_user_id(argv);
 
        /* Create socket pair */
        create_socketpair();
 
        /* Fork */
        pid = fork();
        if (pid == 0) {
            /* Child process */
            close(child_socket);
            retval = zygote_child(argv);
        } else {
            /* Parent process */
            close(parent_socket);
            retval = zygote_parent(pid);
        }
 
        return retval;
    }
五、ActivityManager进程
ActivityManager进程是用户界面的管理者,负责为用户界面提供支持,并协调各个界面之间的切换和数据共享。其主要作用如下:
● 接收Intent请求,并启动相应的应用程序组件。
● 监听其他进程的状态,以便可以及时更新UI。
● 维护应用程序窗口的状态,管理窗口的打开和关闭。
    /* Main function */
    int main(int argc, char **argv)
    {
        /* Start up */
        start_up();
 
        /* Loop */
        while (1) {
            /* Process requests */
            if (process_request() == 0)
                break;
        }
 
        /* Shut down */
        shut_down();
 
        return 0;
    }
六、SystemServer进程
SystemServer进程是Android系统中的最后一个进程启动,负责构建和启动系统的各个服务组件,其主要作用如下:
● 启动属性服务对象,提供属性对象静态和动态属性的访问。
● 启动ActivityManagerService服务,管理应用程序的生命周期。
● 启动PackageManagerService服务,管理应用程序的安装和卸载。
● 启动WindowManagerService服务,管理窗口和用户界面。
    /* Main function */
    int main(int argc, char **argv)
    {
        /* Start up */
        start_up();
 
        /* Create services */
        create_services();
 
        /* Register listeners */
        register_listeners();
 
        /* Loop */
        while (1) {
            /* Process requests */
            if (process_request() == 0)
                break;
        }
 
        /* Shut down */
        shut_down();
 
        return 0;
    }
总结
通过对Android系统启动流程的分析,我们可以了解到整个Android系统是如何启动的,了解每个进程具体的作用,以及系统各个组件是如何相互协作的。同时,学习Android系统启动流程有助于简化自己的应用程序开发,提高自己的编程水平。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/295324.html
 
 微信扫一扫
微信扫一扫  支付宝扫一扫
支付宝扫一扫 