• Android系统启动流程7.1.2与2.3对照版


    这里仅仅简单的梳理源码,大家可以 通过下面流程 来查看源码 

    建议大家  先看2.3.7 版本源码  因为在2.3.7源码中 没有做太多的封装操作 而且便于理解,再来看 7.1.2 就好理解多了

    1.启动 init 线程 也就是 systemcoreinitinit.c

    2.找到入口函数main

    3.找到 init_parse_config_file("/init.rc") 这行,系统进程
    init.rc 是一个 系统进程服务文件,init 进程会读取这个文件来启动系统所需的进程

    4. 因为Android 每个源码版本都有改变 在此列出2.3 和 7.1.2 版本做出对照来看
    如果要方便阅读源码 建议 先看2.3版本 这个版本源码没有做太多的隐藏 很直观可以看到过程

    (1)找到 service zygote /system/bin/app_process 这是Android 主要进程
    /system/bin 是系统编译后的路径

        2.3                                   		    			7.1.2
        直接查找即可                        		 		找到 import /init.${ro.zygote}.rc
    					
    								import /init.${ro.zygote}.rc  根据系统的需要 导入其对应的Zygote版本
    
    								其文件在 systemcore
    ootdir 目录下  init.zygote32.rc
    

      

    (2) /system/bin/app_process 其代表着 frameworksasecmdsapp_process
    找到 app_main.cpp 文件 中的main方法   

    (3) 找到  runtime.start("com.android.internal.os.ZygoteInit"

                 2.3                                                              7.1.2
    bool startSystemServer = (i < argc) ? 		                strcmp(arg, "--start-system-server")
    strcmp(argv[i], "--start-system-server") == 0 : false;	        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    runtime.start("com.android.internal.os.ZygoteInit",
                    startSystemServer);

      

    AppRuntime runtime; 在这里 AppRuntime 其实是继承与 AndroidRuntime 
    所以它调用的 start方法也是 调用AndroidRuntime 的方法

    start方法 中 启动了 AndroidRuntime,JavaVM(startVm(&mJavaVM, &env, 此处省略对比
      /*
      * Start VM. This thread becomes the main thread of the VM, and will
      * not return until the VM exits.
      */

         startMeth = env->GetStaticMethodID(startClass, "main","([Ljava/lang/String;)V");
      if (startMeth == NULL) {
        ALOGE("JavaVM unable to find main() in '%s' ", className);
        /* keep going */
      } else {
        env->CallStaticVoidMethod(startClass, startMeth, strArray);

    #if 0

      if (env->ExceptionCheck())
                 threadExitUncaughtException(env);
    #endif
           }

    startClass 就是上面传入进来的 com.android.internal.os.ZygoteInit
    从这里开始 已经进入了 JAVA 层面了 com.android.internal.os.ZygoteInit.java

      

    (4) 找到 com.android.internal.os.ZygoteInit.java 中的main方法

    方法内做了一些初始化的操作
    registerZygoteSocket(socketName); 开始 fork 进程
    preloadClasses();
    preloadResources();

    startSystemServer();(这里开始 Socket 这里 fork出来的进程 都是有 socket)

    (5)进入 startSystemServer 方法 找到 

    /* Hardcoded command line to start the system server */硬编码命令行以启动系统服务器
    
    String args[] = {
       "--setuid=1000",
       "--setgid=1000",
       "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007,3009,3010",
       "--capabilities=" + capabilities + "," + capabilities,
       "--nice-name=system_server",
       "--runtime-args",
       "com.android.server.SystemServer",
    };
    
    parsedArgs = new ZygoteConnection.Arguments(args);
        /* Request to fork the system server process */
            pid = Zygote.forkSystemServer(     //从这开始 就真正的启动系统服务了
                 parsedArgs.uid, parsedArgs.gid,
                 parsedArgs.gids,
                 parsedArgs.debugFlags,
                 null,
                 parsedArgs.permittedCapabilities,
                 parsedArgs.effectiveCapabilities);
    

    (6) 找到 com.android.server.SystemServer  frameworksaseservicesjavacomandroidserverSystemServer.java 中的 main方法

    系统服务分为  Native java两种服务 
    2.3 版本 通过调用init1(),init.2()启动系统服务 init1 启动 Native服务 init2 启动 java 服务 init1 对应的是 /frameworks/base/services/jni/com_android_server_SystemServer.cpp 中的 android_server_SystemServer_init1() 方法 system_init();调用的 是 /frameworks/base/cmds/system_server/library/system_init.cpp 中的方法 方法中启动了 SurfaceFlinger,MediaPlayerService,CameraService 等 系统服务 AndroidRuntime* runtime = AndroidRuntime::getRuntime(); LOGI("System server: starting Android services. "); runtime->callStatic("com/android/server/SystemServer", "init2"); 通过 AndroidRuntime > callStatic 方法 又调回 SystemServer.java 中的 init2 方法

      

    7.1.2  版本中
     把 init1 取消了  直接通过 System.loadLibrary("android_servers"); 启动Native系统服务 
     
    再调用 startBootstrapServices(); startCoreServices(); startOtherServices(); 启动完整个系统服务
    到此 Android 系统启动完毕

  • 相关阅读:
    oracle数据库的连接
    HIVE参数
    HIVE架构
    Linux文件系统
    Java 初学者笔记 接口与模板设计模式
    sql初学者笔记 语法基础
    JS初学者笔记 变量||语法||操作符
    CSS ul配合visibility 实现隐藏显示菜单栏
    JAVA 包装类 初学者
    盒模练习及margin叠加
  • 原文地址:https://www.cnblogs.com/LKit/p/10460621.html
Copyright © 2020-2023  润新知