1. 程式人生 > >Android 系統啟動流程簡介

Android 系統啟動流程簡介

1. Init 程序啟動流程
2. Zygote啟動流程

3. SystemServer啟動流程

1.  Init 程序啟動流程

Android啟動流程

  init程序 –>
 Zygote程序 –>
 SystemServer程序 –>

各種應用程序


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了。


Init.rc指令碼解析


2. Zygote啟動流程

Zygote程序啟動過程


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啟動流程


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