体系发动流程大致分以下五步:

  • Loader(加载引导程序Boot Loader)
  • Kernel(Linux内核层)
  • Native(init进程)
  • Framework(Zygote进程/SystemServer进程)
  • Application(应用层/Launcher进程)

源码阅读地址参阅(Android10):

www.androidos.net.cn/android/10.…

失眠必读系列——Android系统启动流程


Loader

从ROM中加载BootLoader到RAM(这一步由芯片公司履行)
BootLoader:发动Android体系之前的引导程序,检测RAM,初始化硬件参数

Kernel

内核层,发动第一个进程:Swapper进程(pid=0),又称idle进程,用于初始化进程办理、内存办理、加载显示、相机、Binder等驱动

发动kthreadd进程(pid=2),是linux体系的内核进程,是一切内核进程的鼻祖,会创立内核工作线程,内核看护进程等

Kernel设置完成后,开端发动init进程

Native

发动init进程(pid=1),是Linux体系的用户进程,是一切用户进程的鼻祖,fork出一些用户看护进程,发动servicemanager,开机动画等(后续会具体介绍此阶段)

init进程fork出Zygote进程(解析init.rc文件来发动Zygote进程),Zygote是第一个虚拟机进程,创立虚拟机,注册JNI函数等

init进程fork出MediaServer进程,担任发动和办理整个C++ framework,包括AudioFlinger,CameraService等服务

Framework

Zygote进程发动后,加载ZygoteInit.java类,注册ZygoteScoket,加载虚拟机,加载类,加载体系资源,fork SystemServer进程,SystemServer是Zygote进程孵化的第一个进程,担任发动和办理整个Java framework

Application

SystemServer进程会发动Launcher进程,即桌面App


Native层

我们从Native层发动init进程开端 /system/core/init/main.cpp
init进程发动 从system/core/init/main.cpp的main函数开端

int main(int argc, char** argv) {
    ……
    if (argc > 1) {
   ……
    if (!strcmp(argv[1], "selinux_setup")) {
      return SetupSelinux(argv);
    }
    if (!strcmp(argv[1], "second_stage")) {
      return SecondStageMain(argc, argv);
    }
  }
  return FirstStageMain(argc, argv);
}

/system/core/init/first_stage_init.cpp
先履行FirstStageMain
/system/core/init/selinux.cpp
再履行SetupSelinux
/system/core/init/init.cpp
最终履行SecondStageMain
在SecondStageMain中履行了LoadBootScripts,在LoadBootScripts中可以看到,解析了init.rc文件

int SecondStageMain(int argc, char** argv) {
    ……
    LoadBootScripts(am, sm);
    ……
}
static void LoadBootScripts(……) {
    ……
  if (bootscript.empty()) {
    parser.ParseConfig("/init.rc");
    ……
  }
    ……
}

/system/core/rootdir/init.rc

……
import /init.${ro.zygote}.rc
……
//解析时发动了ServiceManager
start servicemanager
……
start zygote
start zygote_secondary
……

/frameworks/native/cmds/servicemanager/servicemanager.rc

service servicemanager /system/bin/servicemanager
......

以服务的方式发动一个名为“servicemanager”的进程,履行路为/system/bin/servicemanager
对应的源文件为service_manager.c 找到这个类中的进口函数 main 函数.(这儿暂时不做介绍,后续会有专门的失眠系列来介绍servicemanager怎么发动)


终于到了比较熟悉的环节,我们以init.zygote64_32.rc为例 /system/core/rootdir/init.zygote64_32.rc

service zygote /system/bin/app_process64 …… —socket-name=zygote
......
service zygote_secondary /system/bin/app_process32 ……
......
  • init进程以服务的方式发动一个名为“zygote”的进程,履行路为/system/bin/app_process64
  • 创立名为zygote的socket,用于后续IPC
  • 创立了名为“zygote_secondary”的进程,用于适配不必的abi架构

/frameworks/base/cmds/app_process64/app_main.cpp app_main.cpp中的main作为Zygote发动的进口

int main(int argc, char* const argv[]){
    ......
    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
    ......
    while (i < argc) {
    const char* arg = argv[i++];
    if (strcmp(arg, "--zygote") == 0) {
      zygote = true;
      niceName = ZYGOTE_NICE_NAME;
    } else if (strcmp(arg, "--start-system-server") == 0) {
      startSystemServer = true;
    } else if (strcmp(arg, "--application") == 0) {
      application = true;
    } else if (strncmp(arg, "--nice-name=", 12) == 0) {
      niceName.setTo(arg + 12);
    } else if (strncmp(arg, "--", 2) != 0) {
      className.setTo(arg);
      break;
    } else {
      --i;
      break;
    }
  }
    ......
    if (zygote) {
    runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
  } else if (className) {
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
  } else {
        ……
  }
}
  • 创立AppRuntime(即AndroidRuntime),调用start办法
  • 由于zygote=true,调用runtime.start,履行ZygoteInit文件

/frameworks/base/core/jni/AndroidRuntime.cpp

void AndroidRuntime::start(){
    ……
  if (startVm(&mJavaVM, &env, zygote) != 0) {
    return;
  }
  onVmCreated(env);
  if (startReg(env) < 0) {
    ALOGE("Unable to register all android natives\n");
    return;
  }
    ……
}
int AndroidRuntime::startReg(JNIEnv* env){
    ……  
  if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {
    env->PopLocalFrame(NULL);
    return -1;
  }
    ……
  return 0;
}
void AndroidRuntime::onVmCreated(){}
static const RegJNIRec gRegJNI[] = {
  REG_JNI(register_com_android_internal_os_RuntimeInit), REG_JNI(register_com_android_internal_os_ZygoteInit_nativeZygoteInit),
    ……
}
  • startVm发动虚拟机
  • 履行onVmCreated办法,空办法
  • 履行startReg办法
  • 履行register_jni_procs办法,注册JNI函数
  • 后续代码自行查看,反射调用Zygoteinit的main办法

Framework层

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

public static void main(String argv[]) {
    ZygoteServer zygoteServer = null;
    ……
    //预加载资源
    preload(bootTimingsTraceLog);
    ……
    final boolean isPrimaryZygote = zygoteSocketName.equals(Zygote.PRIMARY_SOCKET_NAME);
    zygoteServer = new ZygoteServer(isPrimaryZygote);
    ……
    //fork systemserver进程
    if (startSystemServer) {
            Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
            if (r != null) {
                r.run();
                return;
            }
    }
    ……
    caller = zygoteServer.runSelectLoop(abiList);
    ……
}

frameworks/base/core/java/com/android/internal/os/ZygoteServer.java

ZygoteServer(boolean isPrimaryZygote) {
    ……
    if (isPrimaryZygote) {
    mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.PRIMARY_SOCKET_NAME);
    ……
    }
    ……
}

frameworks/base/core/java/com/android/internal/os/Zygote.java

static LocalServerSocket createManagedSocketFromInitSocket(String socketName) {
    ……
    FileDescriptor fd = new FileDescriptor();
    fd.setInt$(fileDesc);
    return new LocalServerSocket(fd);
    ……
}
  • 预加载资源(反射加载类,加载资源drawable / color资源, 即com.android.internal.R.xxx最初的资源)
  • 创立ZygoteServer对象,注册socket,zygote作为服务端, 不断承受其他进程发来的音讯
  • fork System Server(验证了System Server是Zygote进程孵化的第一个进程)
  • 履行zygoteServer.runSelectLoop(abiList);无限循环等待AMS请求,代码如下: frameworks/base/core/java/com/android/internal/os/ZygoteServer.java
Runnable runSelectLoop(String abiList) {
    while(true){
    ……
    final Runnable command = connection.processOneCommand(this);
    ……
    }
}

frameworks/base/core/java/com/android/internal/os/Zygote.java

Runnable processOneCommand(ZygoteServer zygoteServer) {
    ……
    args = Zygote.readArgumentList(mSocketReader);
    ……
    pid = Zygote.forkAndSpecialize(……);
    ……
}

经过socket,客户端connect,服务端accept,客户端write,服务端read,根据args中的各种参数,履行Zygote.forkAndSpecialize,即Zygote孵化子进程


发动 System Server

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

private static Runnable forkSystemServer(String abiList, String socketName,ZygoteServer zygoteServer) {
    ……
    /* Request to fork the system server process */
    pid = Zygote.forkSystemServer(……)
    ……
    //创立成果,会回来父进程pid=0
    if (pid == 0) {
        ……
        zygoteServer.closeServerSocket();
        return handleSystemServerProcess(parsedArgs);
    }
}

frameworks/base/core/java/com/android/internal/os/Zygote.java

public static int forkSystemServer() {
    ……
    int pid = nativeForkSystemServer();
    ……
}

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

private static Runnable handleSystemServerProcess() {
    //先是创立了classloader cl,一路传下去
    ……
    return ZygoteInit.zygoteInit(……,cl);
}
public static final Runnable zygoteInit(cl) {
    ……
    return RuntimeInit.applicationInit(cl);
}

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

protected static Runnable applicationInit() {
    ……
    return findStaticMain(args.startClass, args.startArgs, classLoader);
}
protected static Runnable findStaticMain(……) {
    //这儿经过传来的cl,加载类,经过类找到办法(自行查看)
    ……
    return new MethodAndArgsCaller(m, argv);
}
static class MethodAndArgsCaller implements Runnable {
    ……
    public void run() {
        //这儿反射履行该办法,即SystemServer的main办法
        mMethod.invoke(null, new Object[] { mArgs });
    }
}

fork SystemServer进程完成后,履行handleSystemServerProcess,一路盯梢下来,回来一个runnable,内部履行办法的调用,即经过反射机制履行SystemServer类的main函数

frameworks/base/services/java/com/android/server/SystemServer.java

public static void main(String[] args) {
    new SystemServer().run();
}
private void run() {
    ……
    startBootstrapServices();
    startCoreServices();
    startOtherServices();
    ……
}

SystemServer.run中履行各种服务的初始化,其间startOtherServices中发动了launcher,即桌面app(这儿暂时不做过多介绍,后续会有专门的失眠系列来介绍SystemServer怎么发动,以及做了什么)


结尾:

失眠必读系列未完待续,有任何错误,谦虚讨教,欢迎纠正…

  • Android 体系发动流程
  • Service Manager 发动流程
  • System Server 发动流程
  • AMS 怎么注册
  • Binder知识点记载
  • Activity 发动流程
  • ……

参阅资料:

www.androidos.net.cn/android/10.…
www.jianshu.com/p/3a728f7f8…
blog.csdn.net/Heisenberg_…