这里仅仅简单的梳理源码,大家可以 通过下面流程 来查看源码
建议大家 先看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 系统启动完毕