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

Android系統啟動流程

包名 more dev ted androi cap 執行 ons 開始

  • 當系統引導程序啟動Linux內核,內核會記載各種數據結構,和驅動程序,加載完畢之後,Android系統開始啟動並加載第一個用戶級別的進程:init(system/core/init/Init.c)

  • 查看Init.c代碼,看main函數

    int main(int argc, char **argv)
    {
         ...
        //執行Linux指令
        mkdir("/dev", 0755);
        mkdir("/proc", 0755);
        mkdir("/sys", 0755);
    
        ...
        //解析執行init.rc配置文件
        init_parse_config_file("/init.rc");
        ...
    }
    
  • 在init.rc中定義好的指令都會開始執行,其中執行了很多bin指令,啟動系統服務

    //啟動孵化器進程,此進程是Android系統啟動關鍵服務的一個母進程
    service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    socket zygote stream 666
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd
    
  • 在appprocess文件夾下找到appmain.cpp,查看main函數,發現以下代碼

    int main(int argc, const char* const argv[])
    {
        ...
        //啟動一個系統服務:ZygoteInit
        runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
        ...
    }
    
  • 在ZygoteInit.java中,查看main方法

     public static void main(String argv[]) {
        ...
        //加載Android系統需要的類
        preloadClasses();
        ...
        if (argv[1].equals("true")) {
            //調用方法啟動一個系統服務
            startSystemServer();
        }
        ...
    }
    
  • startSystemServer()方法的方法體

    String args[] = {
        "--setuid=1000",
        "--setgid=1000",
        "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003",
        "--capabilities=130104352,130104352",
        "--runtime-init",
        "--nice-name=system_server",
        "com.android.server.SystemServer",
    };
    
    ...
    //分叉啟動上面字符串數組定義的服務
     pid = Zygote.forkSystemServer(
     parsedArgs.uid, parsedArgs.gid,
     parsedArgs.gids, debugFlags, null,
     parsedArgs.permittedCapabilities,
     parsedArgs.effectiveCapabilities);
    
  • SystemServer服務被啟動

    public static void main(String[] args) {
        ...
        //加載動態鏈接庫
         System.loadLibrary("android_servers");
        //執行鏈接庫裏的init1方法
        init1(args);
        ...
    }
    
  • 動態鏈接庫文件和java類包名相同,找到comandroidserver_SystemServer.cpp文件

  • 在comandroidserver_SystemServer.cpp文件中,找到了

    static JNINativeMethod gMethods[] = {
        /* name, signature, funcPtr */
        //給init1方法映射一個指針,調用system_init方法
        { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
    };
    
  • androidserverSystemServer_init1方法體中調用了systeminit,systeminit沒有方法體

  • 在systeminit.cpp文件中找到systeminit方法,方法體中 //執行了SystemServer.java的init2方法 runtime->callStatic("com/android/server/SystemServer", "init2");

  • 回到SystemServer.java,在init2的方法體中

    //啟動一個服務線程
    Thread thr = new ServerThread();
    thr.start();
    
  • 在ServerThread的run方法中

    //準備消息輪詢器
    Looper.prepare();
    ...
    //啟動大量的系統服務並把其逐一添加至ServiceManager
    ServiceManager.addService(Context.WINDOW_SERVICE, wm);
    ...
    //調用systemReady,準備創建第一個activity
     ((ActivityManagerService)ActivityManagerNative.getDefault())
            .systemReady(new Runnable(){
            ...
    });
    
  • 在ActivityManagerService.java中,有systemReady方法,方法體裏找到

    //檢測任務棧中有沒有activity,如果沒有,創建Launcher
    mMainStack.resumeTopActivityLocked(null);
    
  • 在ActivityStack.java中,方法resumeTopActivityLocked

    // Find the first activity that is not finishing.
    ActivityRecord next = topRunningActivityLocked(null);
    ...
    if (next == null) {
        // There are no more activities!  Let‘s just start up the
        // Launcher...
        if (mMainStack) {
            return mService.startHomeActivityLocked();
        }
    }
    ...

技術分享圖片

Android系統啟動流程