系統(tǒng)啟動漫拭,SystemServer

SystemServer創(chuàng)建:

流程:
->ZygoteInit.java: startSystemServer
->Zygote.java:forkSystemServer
->通過JNI調(diào)用native函數(shù),nativeForkSystemServer  

上面的步驟就起來了SystemServer進程改览,后面跟 zygote進程分道揚鑣下翎;

SystemServer創(chuàng)建成功后,通過handleSystemServerProcess來進行處理

ZygoteInit.java
if (pid == 0) {
    zygoteServer.closeServerSocket();
    handleSystemServerProcess(parsedArgs);  //通過handleSystemServer來處理
}

private static void handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs){
      //調(diào)用到ZygoteInit的 zygoteInit.
      ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
}

public static final void zygoteInit(int targetSdkVersion, String[] argv,
            ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {
        RuntimeInit.commonInit();    //  (1)  做一些常規(guī)的初始化,這里不做細化
        ZygoteInit.nativeZygoteInit(); // (2)  調(diào)用native函數(shù)
        RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);//(3)在這里會調(diào)用到sytemserver的main函數(shù)入口
}

這邊著重看下(1)nativeZygoteInit函數(shù)宝当,這個函數(shù)實現(xiàn)在 AndroidRuntime.cpp中:

static void com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
{
    gCurRuntime->onZygoteInit();
}
gCurRuntime的定義:static AndroidRuntime* gCurRuntime = NULL;
onZygoteInit實現(xiàn)在 AndroidRuntime的子類AppRuntime中视事, Appruntime定義在app_main.c中
virtual void onZygoteInit()
{
        sp<ProcessState> proc = ProcessState::self();
        ALOGV("App process: starting thread pool.\n");
        proc->startThreadPool();  //啟動線程,用于 Binder通信
}

接下來看下(2) Runtimeinit.applicationInit這個函數(shù)

protected static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
            throws Zygote.MethodAndArgsCaller {
    //這邊執(zhí)行到systemServer的main函數(shù)
    invokeStaticMain(args.startClass, args.startArgs, classLoader);
}

看下invokeStaticMain函數(shù)~

private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
    throws Zygote.MethodAndArgsCaller {
        //這里居然拋出一個異常庆揩,全局搜索下俐东,看那邊catch這個異常
        throw new Zygote.MethodAndArgsCaller(m, argv);
}

全局搜索,發(fā)現(xiàn)在ZygoteInit->main里面catch了“Zygote.MethodAndArgsCaller”:

public static void main(String argv[]) {
      catch (Zygote.MethodAndArgsCaller caller) {
            caller.run();//居然又回調(diào)到Zygote.MethodAndArgsCaller的run,醉了
        } 
}

上述為什么要用異常捕獲订晌,而不是直接調(diào)用虏辫?
繼續(xù)跟蹤:

Zygote.MethodAndArgsCaller
MethodAndArgsCaller是Zygote類的內(nèi)部類:
public static class MethodAndArgsCaller extends Exception{
    public void run() {
            try {
                mMethod.invoke(null, new Object[] { mArgs }); //反射調(diào)用,取到 SystemServer.main
            }
    }
}

截止到上面锈拨, 還只是創(chuàng)建SystemServer,真正開始SystemServer是從調(diào)用 main函數(shù)開始:
-> 調(diào)用SystemServer的main函數(shù)

    public static void main(String[] args) {
        new SystemServer().run();
    }

->SystemServer().run()

這里主要是啟動一些服務~
private void run() {
    //加載 android_servers庫
    System.loadLibrary("android_servers");
    //創(chuàng)建上下文關系
    createSystemContext();
    // Create the system service manager.  ->創(chuàng)建service manager
    mSystemServiceManager = new SystemServiceManager(mSystemContext);
    mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

    //開啟services
    startBootstrapServices();    
    startCoreServices();
    startOtherServices();
}

依次來看下開啟的幾個服務
startBootstrapServices

private void startBootstrapServices() {
    //啟動ActivityManagerService
    mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
    //啟動PowerManagerService
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
    //啟動PackageMangerService
    mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
    //啟動SensorService
    startSensorService();
}

startCoreServices();

private void startCoreServices() {
        // Tracks the battery level.  Requires LightService.
        mSystemServiceManager.startService(BatteryService.class);

        // Tracks application usage stats.
        mSystemServiceManager.startService(UsageStatsService.class);
        mActivityManagerService.setUsageStatsManager(
                LocalServices.getService(UsageStatsManagerInternal.class));

        // Tracks whether the updatable WebView is in a ready state and watches for update installs.
        mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
}

startOtherServices->省略掉砌庄,反正就是開啟services

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奕枢,隨后出現(xiàn)的幾起案子娄昆,更是在濱河造成了極大的恐慌,老刑警劉巖验辞,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喊衫,居然都是意外死亡跌造,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門族购,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壳贪,“玉大人,你說我怎么就攤上這事寝杖∥ナ” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵瑟幕,是天一觀的道長磕蒲。 經(jīng)常有香客問我留潦,道長,這世上最難降的妖魔是什么辣往? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任兔院,我火速辦了婚禮,結(jié)果婚禮上站削,老公的妹妹穿的比我還像新娘坊萝。我一直安慰自己,他們只是感情好许起,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布十偶。 她就那樣靜靜地躺著,像睡著了一般园细。 火紅的嫁衣襯著肌膚如雪惦积。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天珊肃,我揣著相機與錄音荣刑,去河邊找鬼。 笑死伦乔,一個胖子當著我的面吹牛厉亏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烈和,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼爱只,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了招刹?” 一聲冷哼從身側(cè)響起恬试,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疯暑,沒想到半個月后训柴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡妇拯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年幻馁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片越锈。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡仗嗦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出甘凭,到底是詐尸還是另有隱情稀拐,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布丹弱,位于F島的核電站德撬,受9級特大地震影響铲咨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砰逻,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一鸣驱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝠咆,春花似錦踊东、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至菊霜,卻和暖如春坚冀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鉴逞。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工记某, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人构捡。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓液南,卻偏偏與公主長得像,于是被迫代替她去往敵國和親勾徽。 傳聞我的和親對象是個殘疾皇子滑凉,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容