Application創(chuàng)建流程分析

幾個(gè)重要的類:

  1. ActivityThread:
    App啟動(dòng)的真正入口。當(dāng)Zygote進(jìn)程孵化出一個(gè)新的應(yīng)用進(jìn)程后,后執(zhí)行ActivityThread的main方法。

  2. Instrumentation:
    它用來監(jiān)控應(yīng)用程序和系統(tǒng)的交互。真正做事的是ActivityManagerNative.getDefault()。

  3. ActivityManagerService(AMS)、ActivityManagerNative、 ActivityManagerProxy、ActivityManager:
    1. ActivityManagerNative是一個(gè)抽象類繼承Binder,實(shí)現(xiàn)IActivityManger接口
    public abstract class ActivityManagerNative extends Binder implements IActivityManager
    gDefault.get()返回的就是IActivityManager,如果實(shí)在客戶端調(diào)用就是返回的ActivityManagerProxy對(duì)象。

    2. ActivityManagerProxy是ActivityManagerNative同文件的類,不是內(nèi)部類,兩個(gè)類都在同一個(gè)文件中, 
       實(shí)現(xiàn)IActivityManager接口
    
    3. ActivityManagerService繼承了ActivityManagerNative類
       ActivityMangerProxy遠(yuǎn)程調(diào)用方法后,先到ActivityManagerService類中的onTransact方法,該方法中調(diào)用
       super.onTransact調(diào)用父類ActivityManagerNative的onTransact方法,最終都會(huì)調(diào)用ActivityManagerService中的方法
       
    4. ActivityManager作為中介來訪問IActivityManager提供的功能。
       ActivityManager是通過ActivityManagerNative.getDefault()來獲取到IActivityManager這個(gè)接口的。
       因?yàn)锳ctivityManager是運(yùn)行在用戶進(jìn)程的,因而getDefault()獲取的是ActivityManagerProxy.
    
  4. ApplicationThread,ApplicationThreadNative,IApplicationThread:
    ApplicationThread是ActivityThread的內(nèi)部類,繼承ApplicationThreadNative;
    ApplicationThreadNative抽象類繼承Binder實(shí)現(xiàn)IApplicationThread;
    用于和AMS進(jìn)行通信。ApplicationThread通過binder與Ams通信,并將Ams的調(diào)用,
    通過H類(也就是Hnalder)將消息發(fā)送到消息隊(duì)列,然后進(jìn)行相應(yīng)的操作。

ActivityThread的main方法:

    Looper.prepareMainLooper();
    ActivityThread thread = new ActivityThread();
    thread.attach(false);
    Looper.loop();

ActivityThread的attach方法: 只寫主要的代碼

   final IActivityManager mgr = ActivityManagerNative.getDefault();
   //這個(gè)mgr的對(duì)象是ActivityThreadProxy,最終調(diào)用的是AMS中的方法
   try {
       //mAppThread是ApplicationThread的對(duì)象
       mgr.attachApplication(mAppThread);
   } catch (RemoteException ex) {
       throw ex.rethrowFromSystemServer();
   }

ActivityMangerService的attachApplication:

   attachApplication():
        attachApplicationLocked(thread, callingPid);
              //通過binder,跨進(jìn)程調(diào)用ApplicationThread的bindApplication()方法, 下面代碼邏輯重回ActivityThread.java
              thread.bindApplication();
              mStackSupervisor.attachApplicationLocked(app)
                      realStartActivityLocked();//啟動(dòng)Activity

ApplicationThread的bindApplication:

   bindApplication():
          sendMessage(H.BIND_APPLICATION, data);
                //通過mH把BIND_APPLICATION消息發(fā)給H處理
                //使用H的目的是,把代碼執(zhí)行的邏輯從binder線程池里的線程切換到main線程里去執(zhí)行.
                mH.sendMessage(msg);

ActivityThread中的H

private class H extends Handler {
    ...
    public static final int BIND_APPLICATION        = 110;
    ...
    public void handleMessage(Message msg) {
        switch (msg.what) {
            ...
                case BIND_APPLICATION:
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
                    AppBindData data = (AppBindData)msg.obj;
                    handleBindApplication(data);//調(diào)用ActivityThread的handleBindApplication()方法處理
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                    break;
            ...
        }
    }
}

ActivityThread中的handleBindApplication

    // 以下兩個(gè)方法都是設(shè)置進(jìn)程名稱
    Process.setArgV0(data.processName);
    //可以通過反射DdmHandleAppName類中的getAppName方法獲取進(jìn)程名稱
    android.ddm.DdmHandleAppName.setAppName(data.processName,UserHandle.myUserId());

    data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
    //創(chuàng)建app運(yùn)行時(shí)的上下文對(duì)象,并對(duì)其進(jìn)行初始化.
    final ContextImpl appContext = new ContextImpl();
    appContext.init(data.info, null, this);
    //這里的data.info是LoadedApk類的對(duì)象
    //在這里創(chuàng)建了上層開發(fā)者的代碼中所涉及的Applicaiton類的對(duì)象
    Application app = data.info.makeApplication(data.restrictedBackupMode, null);
    ...

    //如果有ContentProvider的話, 先加載ContentProvider,后調(diào)用Application的onCreate()方法
    List<ProviderInfo> providers = data.providers;
    if (providers != null) {
        installContentProviders(app, providers);
    }
    //調(diào)Application的生命周期函數(shù) onCreate()
    mInstrumentation.callApplicationOnCreate(app);

// LoadedApk.java
public final class LoadedApk {
    ...
    public Application makeApplication(boolean forceDefaultAppClass,
            Instrumentation instrumentation) {
        Application app = null;
        app = mActivityThread.mInstrumentation.newApplication(
                cl, appClass, appContext);
        return app;
    }
    ...
}
  
// Instrumentation.java
public class Instrumentation {
    ...
    public void callApplicationOnCreate(Application app) {
        app.onCreate();
    }
    ...
}
最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • AndroidSmall框架是android中一個(gè)非常優(yōu)秀的插件化框架,有時(shí)我們不僅要學(xué)會(huì)使用它,也要去理解它的原...
    柴犬大人閱讀 1,395評(píng)論 0 6
  • 首先我們可以去這樣理解:(綜合ActivityManagerService和ApplicationThread分析...
    super_shanks閱讀 1,749評(píng)論 0 7
  • 簡介: 在android系統(tǒng)中,Home界面也就是Launcher的界面,Launcher它本身也是一個(gè)應(yīng)用程序,...
    Memebox閱讀 2,668評(píng)論 4 19
  • 那年,我二十歲,是被人稱為最關(guān)鍵的十年的開頭。 二十歲到三十歲,許多的人生大事都在這一階段完成,考研、找男朋友、工...
    曉筱_閱讀 400評(píng)論 0 1
  • 這個(gè)故事需要從六年前開始。 高中軍訓(xùn)結(jié)束正式開學(xué),班里多了幾個(gè)新面孔,她是其中一個(gè)。 偶然的一眼,真可愛。 一兩個(gè)...
    玄縞閱讀 213評(píng)論 0 0

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