* 第一阶段是Linux的启动: Bootloader,Kernel,Driver等
* 第二阶段是真正的Android的启动Android启动生命周期流程
第一步:启动Linux:第三步:应用程序启动:运行PackageManager
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包含下面的功能:
Android Process Interface
ServiceManager
1. 做为一个进程在Android加载之前就被启动;
service servicemanager
/system/bin/servicemanager
3, ServiceManager是Binder的服务管理守护进程,是Binder的核心,由其使用Binder驱动进行IPC管理;
4, ServiceManager.java是通过Proxy与这个守护进程进行的通讯;
Zygote
init.rc中的配置:
frameworks/base/cmds/app_process/app_main.cpp
app_main.cpp
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); }
frameworks/base/core/jni/AndroidRuntime.cpp
AndroidRuntime.cpp
/* start the virtual machine */ if (startVm(&mJavaVM, &env) != 0) goto bail; …… env->CallStaticVoidMethod(startClass, startMeth, strArray);
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
ZygoteInit.java
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()
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");
init2()
public static final void init2() { Slog.i(TAG, "Entered the Android system server!"); Thread thr = new ServerThread(); thr.setName("android.server.ServerThread"); thr.start();}