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

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

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

1.启动 init 线程 也就是 \system\core\init\init.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版本

								其文件在 \system\core\rootdir 目录下  init.zygote32.rc

  

(2) /system/bin/app_process 其代表着 frameworks\base\cmds\app_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‘\n", 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  frameworks\base\services\java\com\android\server\SystemServer.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.\n"); 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 系统启动完毕

 

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

上一篇:Android 常用布局


下一篇:【Android开发】通过 style 设置状态栏,导航栏等的颜色