Android系統(tǒng)啟動(dòng)流程源碼分析

用Source Insight來追蹤Android系統(tǒng)啟動(dòng)流程的源碼,并將我認(rèn)為重要的源碼進(jìn)行分析

1、當(dāng)系統(tǒng)引導(dǎo)程序啟動(dòng)Linux內(nèi)核,內(nèi)核會(huì)記載各種數(shù)據(jù)結(jié)構(gòu)和驅(qū)動(dòng)程序,加載完畢之后,Android系統(tǒng)開始啟動(dòng)并加載第一個(gè)用戶級(jí)別的進(jìn)程:Init.c(system\core\init)

//Init.c中的main()方法
int main(int argc, char **argv)
{
    //解析執(zhí)行init.rc配置文件
    init_parse_config_file("/init.rc");
}

2、執(zhí)行配置文件init.rc(system\core\rootdir)中定義好的指令,進(jìn)行環(huán)境初始化;執(zhí)行了很多bin指令,來啟動(dòng)系統(tǒng)服務(wù)

//啟動(dòng)孵化器進(jìn)程,執(zhí)行app_process(一個(gè)編譯好的可執(zhí)行文件)
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

3、在app_process文件下找到app_main.cpp,查看main()方法

int main(int argc, const char* const argv[])
{
    //啟動(dòng)一個(gè)系統(tǒng)服務(wù):ZygoteInit
  runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
}

4、在ZygoteInit.java中,查看main()方法

public static void main(String argv[]) {
    //預(yù)加載Android系統(tǒng)所需要的類
    preloadClasses();
    if (argv[1].equals("true")) {
        //調(diào)用方法開啟系統(tǒng)服務(wù)
        startSystemServer();
     }
}

preloadClasses(),加載Android運(yùn)行時(shí)環(huán)境

/**
* The name of a resource file that contains classes to preload.
*/
//“preloaded-classes”這個(gè)文件里面是Android中所有需要加載的全包名
private static final String PRELOADED_CLASSES = "preloaded-classes";

private static void preloadClasses() {
    //用類加載器,根據(jù)文件名,加載資源作為一個(gè)輸入流
    InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(PRELOADED_CLASSES);
    BufferedReader br = new BufferedReader(new InputStreamReader(is), 256);
    String line;
    //一行一行的讀取全包名
    while ((line = br.readLine()) != null) {
    //根據(jù)全包名加載類
      Class.forName(line);
    }  

}

startSystemServer(),這個(gè)方法開啟系統(tǒng)服務(wù)

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",
     //開啟SystemServer服務(wù)
     "com.android.server.SystemServer",
};

5、啟動(dòng)SystemServer服務(wù)

//C庫(kù)中的init1()方法
native public static void init1(String[] args);

public static void main(String[] args) {
    //加載C庫(kù)
    System.loadLibrary("android_servers");
    //執(zhí)行C庫(kù)里的init1方法
    init1(args);
}

在om_android_server_SystemServer.cpp文件,找到init1()方法

static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */
    //給init1方法映射一個(gè)指針,最后調(diào)用了system_init()方法,而system_init()沒有方法體
    { "init1", "([Ljava/lang/String;)V", (void*)   
    android_server_SystemServer_init1 },
};

static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
    system_init();
}

extern "C" int system_init();

在system_init.cpp文件中找到system_init()方法

extern "C" status_t system_init()
{
    //這個(gè)方法里主要是開啟硬件管理服務(wù)
    SensorService::instantiate();
    AudioFlinger::instantiate();
    MediaPlayerService::instantiate();
    CameraService::instantiate();

    //執(zhí)行SystemServer類中的init2()方法
    runtime->callStatic("com/android/server/SystemServer", "init2");
}

回到SystemServer類中的init2()方法

public static final void init2() {
    //創(chuàng)建系統(tǒng)服務(wù)線程
    Thread thr = new ServerThread();
    thr.setName("android.server.ServerThread");
    thr.start();
}

6、在ServerThread類中的run()方法中,開啟系統(tǒng)的其他服務(wù)

//準(zhǔn)備消息輪詢器
Looper.prepare();

//啟動(dòng)大量的系統(tǒng)服務(wù)并把其逐一添加至ServiceManager
ServiceManager.addService(Context.WINDOW_SERVICE, wm);

//調(diào)用ActivityManagerService類中的systemReady()方法,準(zhǔn)備創(chuàng)建第一個(gè)activity
((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(new Runnable() {});

7、在ActivityManagerService.java中,找到systemReady()方法

public ActivityStack mMainStack;

public void systemReady(final Runnable goingCallback) {
    //啟動(dòng)laucher
    mMainStack.resumeTopActivityLocked(null);
}

在ActivityStack.java中找到resumeTopActivityLocked()方法

final boolean resumeTopActivityLocked(ActivityRecord prev) {
    ActivityRecord next = topRunningActivityLocked(null);

    //判斷棧頂是否有activity,沒有的話直接啟動(dòng)laucher
    if (next == null) {
    // There are no more activities!  Let's just start up the Launcher...
        if (mMainStack) {
            return mService.startHomeActivityLocked();
        }
    }
}

至此,Laucher已經(jīng)被啟動(dòng),Android系統(tǒng)啟動(dòng)完成;

聲明:本文只做學(xué)習(xí)交流,歡迎大家提出各類問題,讓我們共同進(jìn)步?。?!

最后附上時(shí)序圖一張


Android系統(tǒng)的啟動(dòng)時(shí)序圖.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容