Android启动过程


    * 第一阶段是Linux的启动: Bootloader,Kernel,Driver等

    * 第二阶段是真正的Android的启动

Android启动生命周期流程

第一步:启动Linux:
     1. Bootloader
     2. Kernel
第二步:Android系统启动:
     入口为Init.rc(system\core\rootdir)
     1. /system/bin/servicemanager:Binder守护进程;
     2. Runtime;
     3. Zygote:app_process/App_main;
     4. Start VM;
     5. System Server;
     6. Start Android Services:Register to ServiceManager;
     7. Start Launcher.

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


流程说明
1. Android的servicemanager文件位于/system/bin/servicemanager中,在系统启动一开始会通过源码为ServiceManager.java的文件实例化一个Daemon Process,用于在后台维护系统的运行;


2. 启动/system/bin下的zygote的时候实际上启动了app_main.cpp,该系统文件CPP位于frameworks\base\cmds\app_process\app_mian.cpp文件中;


3. app_main.cpp调用了AndroidRuntime.cpp,然后AndroidRuntime.cpp通过JNI调用了ZygoteInit.java, ZygoteInit.java又调用了SystemServer.java;


4. SystemServer.java通过JNI调用了com_android_server_systemService.cpp,然后通过运行system_init.cpp反过来调用SystemServer.java中的init2()这个方法,此时在init2()这个方法中调用了runtime->callStatic(“com/android/server/SystemServer”,”init2”)启动ServerThread线程


5. 服务线程ServerThread包含下面的功能:


    * PowerManagerService:电源管理;
    * ActivityManagerService:组件管理;
    * WindowManagerService:窗口管理;
    * PackageManagerService:应用程序是通过该Service启动的
    * ......

Android Process Interface



ServiceManager


1. 做为一个进程在Android加载之前就被启动;


2, init.rc中看到这个配置项:

   service servicemanager

   /system/bin/servicemanager


3, ServiceManager是Binder的服务管理守护进程,是Binder的核心,由其使用Binder驱动进行IPC管理;


4, ServiceManager.java是通过Proxy与这个守护进程进行的通讯;


Zygote


init.rc中的配置:


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

Zygote是所有Android应用程序的孵化器
app_process代码位置:

frameworks/base/cmds/app_process/app_main.cpp


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);
        }


追踪到AndroidRuntime,代码位于:

frameworks/base/core/jni/AndroidRuntime.cpp


AndroidRuntime.cpp


在start()函数中有如下代码:
 
  /* start the virtual machine */
    if (startVm(&mJavaVM, &env) != 0)
        goto bail;
         ……
        env->CallStaticVoidMethod(startClass, startMeth, strArray);


即先启动了虚拟机,然后利用JNI调用了zygoteInit函数;
ZygoteInit.java的路径是:

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


ZygoteInit.java


ZygoteInit.java的main()函数:
 
if (argv[1].equals("true")) {
                startSystemServer();
            } else if (!argv[1].equals("false")) {
                throw new RuntimeException(argv[0] + USAGE_STRING);
            }
            Log.i(TAG, "Accepting command socket connections");
            if (ZYGOTE_FORK_MODE) {
                runForkMode();
            } else {
                runSelectLoopMode();
            }


ZygoteInit.java解读


前一部分是在启动系统服务,后一部分是虽然是一个条件判断,但ZYGOTE_FORK_MODE被赋了false,所以进行else分支的runSelectLoopMode()函数;


在runSelectLoopMode()函数中,实际上是在一死循环中利用zygoteConnection类通过socket的方式进行消息处理,用于fork出新的zygote,从而以最轻量级的方式实现每个进程一个虚拟机的机制;


startSystemServer()


startSystemServer(),代码位于:

frameworks/base/services/java/com/android/server/systemserver.java;


在systemserver.java的 main()函数中调用了init1(args)这个native函数,利用JNI机制,跟踪frameworks/base/services/jni/com_android_server_systemService.cpp;


执行到frameworks/base/cmds/system_server/library/system_init.cpp


system_init()

if (strcmp(propBuf, "1") == 0) {
        // Start the SurfaceFlinger
        SurfaceFlinger::instantiate();
    }
    AndroidRuntime* runtime = AndroidRuntime::getRuntime();
    LOGI("System server: starting Android services./n");
    runtime->callStatic("com/android/server/SystemServer", "init2");


完成了SurfaceFlinger的实例化,然后利用运行时的callStatic()函数调用了SystemServer的init2()函数


init2()


Init2()函数位于:frameworks/base/services/java/com/android/server/SystemServer.java
具体代码:
  
  public static final void init2() {
        Slog.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();
        thr.setName("android.server.ServerThread");
        thr.start();}


ServerThread线程中启动各项Android服务

你可能感兴趣的:(android启动,android底层)