Android启动流程笔记

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. 执行第一个应用程序

Android启动流程笔记_第1张图片
图片标题

开机复位完成后,会执行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启动流程笔记)