Android启动流程笔记

作者: 霡霂976447044 | 来源:发表于2017-03-15 20:42 被阅读112次

    Linux启动过程

    1. 加载 BIOS 的硬件资讯与进行自我测试,并依据配置取得第一个可启动的装置;
    2. 读取并运行第一个启动装置内 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序);
    3. 依据 boot loader 的配置加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序;
    4. 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 资讯
    5. init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行的作业环境 (如网络、时区等)
    6. init 运行 run-level 的各个服务之启动 (script 方式);
    7. init 运行 /etc/rc.d/rc.local 文件;
    8. init 运行终端机模拟程序 mingetty 来启动 login 程序,最后就等待使用者登陆啦;

    android启动基本流程

    1. 开机执行bootloader程序

    2. 操作系统内核初始化

    3. 执行第一个应用程序

    图片标题

    开机复位完成后,会执行rom的小块程序,这个程序就是bootloader

    bootloader会选择从哪个物理接口装载用户程序,如usb,sd卡等,android装载
    的是fastboot,fastboot用来初始化设备,提供开发调试,内核烧写等
    当fastboot被bootload装载运行后,如果没有检测到特殊按键,就开始装载linux内核

    linux内核装载后,就开始内核初始化过程

    源代码查阅流程

    1. 加载内核完成后,Android系统会启动第一个进程 init进程(system/core/init/init.c)
    int main(int argc, char **argv)
    {
         ...
        //执行Linux指令
        mkdir("/dev", 0755);
        mkdir("/proc", 0755);
        mkdir("/sys", 0755);
        ...
        //解析执行init.rc配置文件
        init_parse_config_file("/init.rc");
        ...
    }
    

    init进程>挂载目录>运行init.rc脚本

    2, 在init.rc中,启动了进程孵化器zygote,执行了app_main.cpp

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

    app_process 是一个目录,里面有一个cpp文件app_main.cpp,执行了该文件

    3, 在app_main.cpp里

    int main(int argc, const char* const argv[])
    {
        ...
        //启动一个系统服务:ZygoteInit
        runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
        ...
    }
    

    启动了一个系统服务ZygoteInit

    4, 在ZygoteInit.java,main方法

     public static void main(String argv[]) {
        ...
        //加载Android系统需要的类
        preloadClasses();
        ...
        if (argv[1].equals("true")) {
            //调用方法启动一个系统服务
            startSystemServer();
        }
        ...
    }
    

    peloadClasses加载了系统的类,然后调用了startSystemServer()方法

    5, startSystemServer方法启动了SystemServer服务,在SystemServer.java的main方法里

    public static void main(String[] args) {
        ...
        //加载动态链接库
         System.loadLibrary("android_servers");
        //执行链接库里的init1方法
        init1(args){
            init2();//调用了init2方法
        }
        ...
        init2(){
            //启动一个服务线程
            Thread thr = new ServerThread();
            thr.start();
        }
    
    }
    

    6, SystemServer开启了一个线程,该线程的run方法

    run() {
        //准备消息轮询器
        Looper.prepare();
        ...
        //启动大量的系统服务并把其逐一添加至ServiceManager
        ServiceManager.addService(Context.WINDOW_SERVICE, wm);
        ...
        //调用systemReady,准备创建第一个activity
         ((ActivityManagerService)ActivityManagerNative.getDefault())
                .systemReady(new Runnable(){
                ...
        });   
    }
    
    

    7, 查看ActivityManagerService的ystemReady方法

    //检测任务栈中有没有activity,如果没有,创建Launcher
    mMainStack.resumeTopActivityLocked(null);
    

    8, mMainStack是ActivityStack,查看它的resumeTopActivityLocked方法

    // Find the first activity that is not finishing.
    ActivityRecord next = topRunningActivityLocked(null);
    ...
    if (next == null) {
        // There are no more activities!  Let's just start up the
        // Launcher...
        // 启动桌面
        if (mMainStack) {
            return mService.startHomeActivityLocked();
        }
    }
    

    最后就启动了桌面,下一学习,Android 滑动分析

    相关文章

      网友评论

        本文标题:Android启动流程笔记

        本文链接:https://www.haomeiwen.com/subject/sbjrnttx.html