* 第一阶段是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服务

更多相关文章

  1. Android(安卓)8.1 zygote创建新应用进程
  2. 】Android横竖屏总结
  3. Android的架构与Android应用程序启动流程
  4. Android(安卓)Camera 方法分析
  5. Android常用知识笔记
  6. Android:WebView与Javascript交互(相互调用参数、传值)
  7. Android(安卓)WIFI 框架分析
  8. 活动的启动模式汇总
  9. Android纠正Activity横竖屏切换的生命周期的错误

随机推荐

  1. 【我的Android进阶之旅】Android(安卓)St
  2. 学习Android一点心得
  3. 图文浅析之Android显示原理
  4. 自适应各种宽度的虚线怎么做?
  5. Android(安卓)O预览版有哪些缺点?Android
  6. Android(安卓)手机如何防范吸费插件
  7. Android音频开发(7):使用 OpenSL ES API(下)
  8. Android(安卓)基于第三方登录(使用Bmob后
  9. 使用Linkify + 正则式区分微博文本链接及
  10. Android中UI卡顿相关知识点