1. Init 进程启动流程
2. Zygote启动流程

3. SystemServer启动流程


1.  Init 进程启动流程

Android启动流程

  init进程 –>
 Zygote进程 –>
 SystemServer进程 –>

各种应用进程

Android 系统启动流程简介_第1张图片

Init 进程
init是第一个进程,我们可以说它是root进程或者说有进程的父进程。init进程有两个责任,
一是挂载目录,比如/sys、/dev、/proc,
二是运行init.rc脚本。


init进程可以在/system/core/init找到。
源码位置 Init.cpp: system/core/init/init.cpp
 init系统中位置:/init


init.rc文件可以在/system/core/rootdir/init.rc找到。
readme.txt可以在/system/core/init/readme.txt找到。


Android初始化语言由四大类型的声明组成,即Actions(动作)、Commands(命令)、Services(服务)、以及Options(选项)
Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。
Service(服务):服务是init进程启动的程序、当服务退出时init进程会视情况重启服务
Options(选项)  :选项是对服务的描述。它们影响init进程如何以及何时启动服务。

在这个阶段你可以在设备的屏幕上看到“Android”logo了。

Android 系统启动流程简介_第2张图片

Init.rc脚本解析

Android 系统启动流程简介_第3张图片

2. Zygote启动流程

Zygote进程启动过程

Android 系统启动流程简介_第4张图片

1. 解析启动Service(Zygote) init.rc->
service zygote /system/bin/app_process32 - Xzygote /system/bin 
--zygote --start-system-server --socket-name=zygote
执行命令后到frameworks\/base/\cmds\/app_process/\app_main.cpp   main()
2.  app_main.cpp 里调用AndroidRuntime.start()启动ZygoteInit.cpp  Main().
frameworks/base/core/jni/AndroidRuntime.cpp
3.  AndroidRuntime.start方法调用ZygoteInit.java的Main()方法。
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
frameworks/base/core/jni/AndroidRuntime.cpp

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java-

4. ZygoteInit.java  main() 方法
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
5. Register zygote Socket
ZygoteServer.registerServerSocketFromEnv(“zygote”)
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
6. StartSystemServer
 startSystemSerer
forkSystemServer(abilist,socketName,zygoteServer)
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
7.RunSelectLoop
Caller=zygoteServer.runSelectLoop(abilist)

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

3. SystemServer启动流程

Android 系统启动流程简介_第5张图片

1. ZygoteInit.java  main() 方法, 
pid=Zygote.forkSystemServer()  ->
handleySystemServerProcess() ->
RuntimeInit.zygoteInit() ->


Frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
frameworks/base/core/java/com/android/internal/os/Zygote.java
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
    ---- (Class zygote, method forkSystemServer)

2. RuntimeInit.ZygoteInit()  - >
   RuntimeInit.commonInit();  ZygoteInit.nativeZygotieInit();  RuntimeInit.appicationInit(); ->
  invokeStatickMain(args,startClass,args.startArgs,classLoader); ->
  throw new Zygote.MethodAndArgsCaller(m,argv)  调用到SystemServer Mian方法
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
frameworks/base/services/java/com/android/server/SystemServer.java
3.1 在SystemServer.java    main() 方法里调用到SystemServer().run()  ->  
      设置一些系统属性
       SystemProperties.set("persist.sys.timezone", "GMT"); 
       SystemProperties.set("persist.sys.locale", languageTag);    
       SystemProperties.set("persist.sys.language", "");
        SystemProperties.set("persist.sys.country", "");
        SystemProperties.set("persist.sys.localevar", "");


3.2   run () 里其他初始化及设置主线程,开始服务和LOOPER:
 Build.ensureFingerprintProperty();
// Increase the number of binder threads in system_server
BinderInternal.setMaxThreads(sMaxBinderThreads);
// Prepare the main looper thread (this thread).  设置主线程
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);              Looper.prepareMainLooper();  准备LOOPER.
 // Initialize native services.
    System.loadLibrary("android_servers");
  // Start services. 开启服务
    try {traceBeginAndSlog("StartServices");startBootstrapServices();
            startCoreServices();startOtherServices(); SystemServerInitThreadPool.shutdown(); }
 // Loop forever.   开启Looper.
Looper.loop();
frameworks/base/services/java/com/android/server/SystemServer.java

更多相关文章

  1. js调Android与IOS方法
  2. android studio 添加按钮点击事件的三种方法
  3. Android Studio 打包流程
  4. 在android中运行java main方法
  5. Android跨进程启动Service流程及常见问题
  6. React-Native 调用原生方法,弹出自定义对话框
  7. Android截屏截图的几种方法总结

随机推荐

  1. raspberryPi2 移植Android系统
  2. eclipse 和 android studio 快捷键对比
  3. 利用adb安装和卸载android APK
  4. Android中文API(97)—— ContextMenu
  5. UiModeManager设置夜间模式和行车模式
  6. unity3d 保存(截图、拍照)图片 到Android(
  7. 几个Android常见wraning警告处理方法
  8. 轻松玩转Camera,使用CameraView来拍照,修
  9. Android调用系统内部的下载程序下载文件(
  10. Android图像滤镜框架GPUImage使用(二)