Android应用程序启动入口ActivityThread.main流程分析

   之前Android应用程序进程的启动过程文章内有说过,当一个Android应用程序进程启动后,应用程序进程的入口就是ActivityThread类的main函数,ActivityThread的作用管理应用的主进程的执行,并根据AMS的要求,通过IApplicationThread接口负责调度和执行ActivitiesBroadcasts和其他操作,接下来这里会从main方法开始分析应用的启动流程;

   以下源码基于rk3399_industry Android7.1.2

ActivityThread.main

   总的来说这里主要是要向AMS发送一个进程启动完成通知,然后接收到回复在进行之后的步骤。

public final class ActivityThread {
    final ApplicationThread mAppThread = new ApplicationThread();
    public static void main(String[] args) {
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
        ....
        //创建主线程的Looper对象
        Looper.prepareMainLooper();
    
        //创建ActivityThread实例,创建会同时在它内部创建一个ApplicationThread对象mAppThread
        //mAppThread是一个Binder本地对象
        //AMS就是通过该对象来和应用程序进程通信的
        ActivityThread thread = new ActivityThread();
        //调用attch函数向AMS发送一个启动完成的通知
        thread.attach(false);

        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }

        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        //进入消息循环
        Looper.loop();
        ....
    }

    private void attach(boolean system) {
        //此时传入的system为false
        sCurrentActivityThread = this;
        mSystemThread = system;
        if (!system) {
            //开启虚拟机的jit即时编译功能
            ViewRootImpl.addFirstDrawHandler(new Runnable() {
                @Override
                public void run() {
                    ensureJitEnabled();
                }
            });
            android.ddm.DdmHandleAppName.setAppName("<pre-initialized>",
                                                    UserHandle.myUserId());
            RuntimeInit.setApplicationObject(mAppThread.asBinder());
            //获得一个AMS的代理对象ActivityManagerProxy
            final IActivityManager mgr = ActivityManagerNative.getDefault();
            try {
                //向AMS发送一个进程间通信请求
                mgr.attachApplication(mAppThread);
            } catch (RemoteException ex) {
                ....
            }
            // 观察是否快接近heap的上限值
            BinderInternal.addGcWatcher(new Runnable() {
                @Override public void run() {
                    if (!mSomeActivitiesChanged) {
                        return;
                    }
                    Runtime runtime = Runtime.getRuntime();
                    long dalvikMax = runtime.maxMemory();
                    long dalvikUsed = runtime.totalMemory() - runtime.freeMemory();
                    //判断已用内存是否超过最大内存的3/4
                    if (dalvikUsed > ((3*dalvikMax)/4)) {
                        if (DEBUG_MEMORY_TRIM) Slog.d(TAG, "Dalvik max=" + (dalvikMax/1024)
                                + " total=" + (runtime.totalMemory()/1024)
                                + " used=" + (dalvikUsed/1024));
                        mSomeActivitiesChanged = false;
                        try {
                            //当已用内存超过最大内存的3/4,则请求释放内存空间
                            mgr.releaseSomeActivities(mAppThread);
                        } catch (RemoteException e) {
                            throw e.rethrowFromSystemServer();
                        }
                    }
                }
            });
        } else {
            ....
        }

        //添加dropbox日志到libcore
        DropBox.setReporter(new DropBoxReporter());
        ....
    }
}

   接下来我们就会进入到AMS的代理对象ActivityManagerProxyattachApplication函数向AMS发送一个进程间通信请求;

ActivityManagerProxy.attachApplication

frameworks/base/core/java/android/app/ActivityManagerNative.java

public abstract class ActivityManagerNative extends Binder implements IActivityManager{

    ....
    class ActivityManagerProxy implements IActivityManager{
        ....
        public void attachApplication(IApplicationThread app) throws RemoteException{
            //将传入的参数写入data
            Parcel data = Parcel.obtain();
            Parcel reply = Parcel.obtain();
            data.writeInterfaceToken(IActivityManager.descriptor);
            data.writeStrongBinder(app.asBinder());
            //通过Binder代理对象mRemote向AMS发送类型为ATTACH_APPLICATION_TRANSACTION的进程间通信请求
            //通知应用程序进程启动完成
            mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0);
            reply.readException();
            data.recycle();
            reply.recycle();
        }
        
    }
}

ActivityManagerService.attachApplication

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

public final class ActivityManagerService extends ActivityManagerNative
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
    ....
    public final void attachApplication(IApplicationThread thread) {
        synchronized (this) {
            //AMS接收到应用程序进程启动完成
            int callingPid = Binder.getCallingPid();
            final long origId = Binder.clearCallingIdentity();
            //执行启动应用的主Activity的操作
            attachApplicationLocked(thread, callingPid);
            Binder.restoreCallingIdentity(origId);
        }
    }
    //保存进程pid的的对象,在应用程序进程创建完毕后会以pid为关键字,将对应的ProcessRecord对象存入进去
    final SparseArray<ProcessRecord> mPidsSelfLocked = new SparseArray<ProcessRecord>();
   private final boolean attachApplicationLocked(IApplicationThread thread,
            int pid) {
        //参数pid为应用程序进程的pid
        ProcessRecord app;
        //获得当前时间戳
        long startTime = SystemClock.uptimeMillis();
        if (pid != MY_PID && pid >= 0) {
            synchronized (mPidsSelfLocked) {
                //获得对应pid所对应的ProcessRecord对象赋值给app
                app = mPidsSelfLocked.get(pid);
            }
        } else {
            app = null;
        }
        ....
        final String processName = app.processName;
        ....
        //对app对象进行初始化
        //这个调用内会将app.thread = thread,即指向传入的ApplicationThread的代理对象
        //这样AMS就可以通过这个thread和新创建的应用程序进程进行通信了
        app.makeActive(thread, mProcessStats);
        app.curAdj = app.setAdj = app.verifiedAdj = ProcessList.INVALID_ADJ;
        app.curSchedGroup = app.setSchedGroup = ProcessList.SCHED_GROUP_DEFAULT;
        app.forcingToForeground = null;
        updateProcessForegroundLocked(app, false, false);
        app.hasShownUi = false;
        app.debugging = false;
        app.cached = false;
        app.killedByAm = false;
        app.killed = false;
        ....
        //这个PROC_START_TIMEOUT_MSG是一个判断是否启动超时的消息,在创建应用程序进程之前发送
        //这里是删除该消息,因为应用程序已经在规定时间内启动起来了
        mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);

        boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info);
        ....
        try {
            ....
            //完成前面的大量准备工作后,重点是这个方法,通知要启动的Application组件
            thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,
                    profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,
                    app.instrumentationUiAutomationConnection, testMode,
                    mBinderTransactionTrackingEnabled, enableTrackAllocation,
                    isRestrictedBackupMode || !normalMode, app.persistent,
                    new Configuration(mConfiguration), app.compat,
                    getCommonServicesLocked(app.isolated),
                                   mCoreSettingsObserver.getCoreSettingsLocked());
            ....
        } catch (Exception e) {
            ....
        }
        ....
        if (normalMode) {
            try {
                //在Application启动完毕后这里启动对应APP的主Activity
                if (mStackSupervisor.attachApplicationLocked(app)) {
                    didSomething = true;
                }
            } catch (Exception e) {
                Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
                badApp = true;
            }
        }
        
        //当Activity启动完成后启动所有运行在此进程的service
        if (!badApp) {
            try {
                didSomething |= mServices.attachApplicationLocked(app, processName);
            } catch (Exception e) {
                ....
                badApp = true;
            }
        }
        ....
    }

thread是一个ApplicationThreadProxyBinder代理对象,所以这里最后会调用到ApplicationThreadProxy.bindApplication函数来向之前的应用程序进程发送一个进程间通信请求。

Application的启动

ApplicationThreadProxy.bindApplication

frameworks/base/core/java/android/app/ApplicationThreadNative.java

public abstract class ApplicationThreadNative extends Binder
        implements IApplicationThread {
    ....
    class ApplicationThreadProxy implements IApplicationThread {
        ....
        public final void bindApplication(String packageName, ApplicationInfo info,
            List<ProviderInfo> providers, ComponentName testName, ProfilerInfo profilerInfo,
            Bundle testArgs, IInstrumentationWatcher testWatcher,
            IUiAutomationConnection uiAutomationConnection, int debugMode,
            boolean enableBinderTracking, boolean trackAllocation, boolean restrictedBackupMode,
            boolean persistent, Configuration config, CompatibilityInfo compatInfo,
            Map<String, IBinder> services, Bundle coreSettings) throws RemoteException {
            Parcel data = Parcel.obtain();
            data.writeInterfaceToken(IApplicationThread.descriptor);
            data.writeString(packageName);
            info.writeToParcel(data, 0);
            data.writeTypedList(providers);
            if (testName == null) {
                data.writeInt(0);
            } else {
                data.writeInt(1);
                testName.writeToParcel(data, 0);
            }
            if (profilerInfo != null) {
                data.writeInt(1);
                profilerInfo.writeToParcel(data,     Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
            } else {
                data.writeInt(0);
            }
            data.writeBundle(testArgs);
            data.writeStrongInterface(testWatcher);
            data.writeStrongInterface(uiAutomationConnection);
            data.writeInt(debugMode);
            data.writeInt(enableBinderTracking ? 1 : 0);
            data.writeInt(trackAllocation ? 1 : 0);
            data.writeInt(restrictedBackupMode ? 1 : 0);
            data.writeInt(persistent ? 1 : 0);
            config.writeToParcel(data, 0);
            compatInfo.writeToParcel(data, 0);
            data.writeMap(services);
            data.writeBundle(coreSettings);
            mRemote.transact(BIND_APPLICATION_TRANSACTION, data, null,
                    IBinder.FLAG_ONEWAY);
            data.recycle();
        }
        
    }
}

   这部分就是将传入的参数写入Parcel对象data,然后通过Binder代理对象mRemote向前面的应用程序进程发送一个类行为BIND_APPLICATION_TRANSACTION的进程间通信请求。之后就又回到ApplicationThread.bindApplication函数。

ApplicationThread.bindApplication

frameworks/base/core/java/android/app/ActivityThread.java

public final class ActivityThread {
    ....
    private class ApplicationThread extends ApplicationThreadNative {
        ....
         public final void bindApplication(String processName, ApplicationInfo appInfo,
                List<ProviderInfo> providers, ComponentName instrumentationName,
                ProfilerInfo profilerInfo, Bundle instrumentationArgs,
                IInstrumentationWatcher instrumentationWatcher,
                IUiAutomationConnection instrumentationUiConnection, int debugMode,
                boolean enableBinderTracking, boolean trackAllocation,
                boolean isRestrictedBackupMode, boolean persistent, Configuration config,
                CompatibilityInfo compatInfo, Map<String, IBinder> services, Bundle coreSettings) {

            if (services != null) {
                // 在服务管理器中设置服务缓存
                ServiceManager.initServiceCache(services);
            }

            setCoreSettings(coreSettings);
            //将传入的应用参数封装成data
            AppBindData data = new AppBindData();
            data.processName = processName;
            data.appInfo = appInfo;
            data.providers = providers;
            data.instrumentationName = instrumentationName;
            data.instrumentationArgs = instrumentationArgs;
            data.instrumentationWatcher = instrumentationWatcher;
            data.instrumentationUiAutomationConnection = instrumentationUiConnection;
            data.debugMode = debugMode;
            data.enableBinderTracking = enableBinderTracking;
            data.trackAllocation = trackAllocation;
            data.restrictedBackupMode = isRestrictedBackupMode;
            data.persistent = persistent;
            data.config = config;
            data.compatInfo = compatInfo;
            data.initProfilerInfo = profilerInfo;
            //发送了一个BIND_APPLICATION消息,之后来看消息处理
            sendMessage(H.BIND_APPLICATION, data);
        }
        ....
         
    }
    ....
    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方法
                    handleBindApplication(data);
                    break;
            ....
            
        }
    }
    
    //handleBindApplication函数非常的长,这里取重点部分讲解
    private void handleBindApplication(AppBindData data) {
        ....

        mBoundApplication = data;
        ....
        /初始化一个ContextImpl对象appContext
        final ContextImpl appContext = ContextImpl.createAppContext(this, data.info);
        //创建一个Application对象
        Application app = data.info.makeApplication(data.restrictedBackupMode, null);
        mInitialApplication = app;
    
        try{
            //调用callApplicationOnCreate,方法内部其实就是调用app.onCreate方法
            //之后就进入了Application的生命周期的onCreate()方法了
            //mInstrumentation是一个代理层,最终Apllication的创建,Activity的创建,以及生命周期都会经过这个对象去执行
            mInstrumentation.callApplicationOnCreate(app);
            ....
        } catch (Exception e) {
            ....
        }
    }
}

   这部分callApplicationOnCreate比较简单,所以还是关注下如何创建的Application对象,data是一个类型为AppBindData的对象,其info变量的类行为LoadedApkLoadedApk对象可以说是APK文件在内存中的表示,所以我们要来简单看下LoadedApk.makeApplication函数;

LoadedApk.makeApplication

frameworks/base/core/java/android/app/LoadedApk.java

public final class LoadedApk {
    ....
    public Application makeApplication(boolean forceDefaultAppClass,
            Instrumentation instrumentation) {
        if (mApplication != null) {
            return mApplication;
        }
        Application app = null;
        //获得Application的类名
        String appClass = mApplicationInfo.className;
        if (forceDefaultAppClass || (appClass == null)) {
            appClass = "android.app.Application";
        }

        try {
            java.lang.ClassLoader cl = getClassLoader();
            if (!mPackageName.equals("android")) {
                initializeJavaContextClassLoader();
            }
            //创建上下文ContextImpl
            ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
            //又回到了当前应用程秀进程的Instrumentation对象中
            app = mActivityThread.mInstrumentation.newApplication(
                    cl, appClass, appContext);
            appContext.setOuterContext(app);
        } catch (Exception e) {
            ....
        }
        mActivityThread.mAllApplications.add(app);
        mApplication = app;
        ....
        return app;
    }
    
}

Instrumentation.newApplication

frameworks/base/core/java/android/app/Instrumentation.java

public class Instrumentation {
    ....
    public Application newApplication(ClassLoader cl, String className, Context context)
            throws InstantiationException, IllegalAccessException,
            ClassNotFoundException {
        return newApplication(cl.loadClass(className), context);
    }
    
    static public Application newApplication(Class<?> clazz, Context context)
            throws InstantiationException, IllegalAccessException,
            ClassNotFoundException {
        //通过反射创建一个Application对象
        Application app = (Application)clazz.newInstance();
        //调用其attach方法,将app与context绑定
        app.attach(context);
        return app;
    }
    ....
    
}

Application.attach & ContextWrapper.attachBaseContext

frameworks/base/core/java/android/app/Application.java
frameworks/base/core/java/android/content/ContextWrapper.java

public class Application extends ContextWrapper implements ComponentCallbacks2 {
    ....
    final void attach(Context context) {
        attachBaseContext(context);
        mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
    }
    ....
}
public class ContextWrapper extends Context {
    ....
    protected void attachBaseContext(Context base) {
        if (mBase != null) {
            throw new IllegalStateException("Base context already set");
        }
        mBase = base;
    }   
    ....
}

   这样就将Application和之前创建的上下文绑定起来了。

Activity和Service的启动

   Application启动完成后,回到AMSattachApplication函数内,之后会调用mStackSupervisor.attachApplicationLocked(app)mServices.attachApplicationLocked(app,processName)分别启动ActivityService;

Activity启动:ActivityStackSupervisor.attachApplicationLocked

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

public final class ActivityStackSupervisor implements DisplayListener {
    ....
    boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {   
        //获得进程名赋值给processName
        final String processName = app.processName;
        boolean didSomething = false;
        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
                final ActivityStack stack = stacks.get(stackNdx);
                if (!isFocusedStack(stack)) {
                    continue;
                }
                //获得位于Activity栈顶端的ActivityRecord对象hr,与它对应的Activity组件就是要启动的Activity组件
                ActivityRecord hr = stack.topRunningActivityLocked();
                if (hr != null) {
                    //判断要启动的Activity的用户I(UID)和进程名是否与传入的ProcessRecord对象app的一致
                    if (hr.app == null && app.uid == hr.info.applicationInfo.uid
                            && processName.equals(hr.processName)) {
                        try {
                            //一致,代表Activity是在app中启动的,调用realStartActivityLocked启动Activity
                            if (realStartActivityLocked(hr, app, true, true)) {
                                didSomething = true;
                            }
                        } catch (RemoteException e) {
                            Slog.w(TAG, "Exception in new application when starting activity "
                                  + hr.intent.getComponent().flattenToShortString(), e);
                            throw e;
                        }
                    }
                }
            }
        }
        if (!didSomething) {
            ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
        }
        return didSomething;
    }
    ....
    
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
            boolean andResume, boolean checkConfig) throws RemoteException {
        ....
        //将传入的将要启动的Activity的ActivityRecord对象r的app设置为我们应用程序进程的app对象
        r.app = app;
        ....
        //idx<0代表r不在app的Activity组建列表中
        int idx = app.activities.indexOf(r);
        if (idx < 0) {
            //将Activity添加进app的Activity组建列表activities中
            app.activities.add(r);
        }
        ....
        try {
            ....
            //一些准备工作
            List<ResultInfo> results = null;
            List<ReferrerIntent> newIntents = null;
            if (andResume) {
                results = r.results;
                newIntents = r.newIntents;
            }
            ....
            if (r.isHomeActivity()) {
                // Home进程是任务的根进程.
                mService.mHomeProcess = task.mActivities.get(0).app;
            }
            ....
            //通知前面创建的应用程序进程启动Activity组件(即r所描述的Activity)
            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                    System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
                    new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,
                    task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
                    newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo,r.task.taskId);
            ....
       } catch (RemoteException e) {
           ....
       }
         ....
        return true;
    }
}

   在做了一些赋值和一些准备工作之后,就会开始通知前面创建的应用程序进程启动要创建的Activity,由源码可知appProcessRecord对象,而app.thread对应位ApplicationThreadProxy代理类,之后看对应的代码;

ApplicationThreadProxy.scheduleLaunchActivity

frameworks/base/core/java/android/app/ApplicationThreadNative.java

public abstract class ApplicationThreadNative extends Binder
        implements IApplicationThread {
    ....
    class ApplicationThreadProxy implements IApplicationThread {
        ....
        public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
            ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
            CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
            int procState, Bundle state, PersistableBundle persistentState,
            List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
            boolean notResumed, boolean isForward, ProfilerInfo profilerInfo,int taskId) throws RemoteException {
        Parcel data = Parcel.obtain();
        data.writeInterfaceToken(IApplicationThread.descriptor);
        intent.writeToParcel(data, 0);
        data.writeStrongBinder(token);
        data.writeInt(ident);
        info.writeToParcel(data, 0);
        curConfig.writeToParcel(data, 0);
        if (overrideConfig != null) {
            data.writeInt(1);
            overrideConfig.writeToParcel(data, 0);
        } else {
            data.writeInt(0);
        }
        compatInfo.writeToParcel(data, 0);
        data.writeString(referrer);
        data.writeStrongBinder(voiceInteractor != null ? voiceInteractor.asBinder() : null);
        data.writeInt(procState);
        data.writeBundle(state);
        data.writePersistableBundle(persistentState);
        data.writeTypedList(pendingResults);
        data.writeTypedList(pendingNewIntents);
        data.writeInt(notResumed ? 1 : 0);
        data.writeInt(isForward ? 1 : 0);
        if (profilerInfo != null) {
            data.writeInt(1);
            profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
        } else {
            data.writeInt(0);
        }
        data.writeInt(taskId);
        //调用Binder代理对象mRemote发送一个SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION的进程间通信请求
        mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION, data, null,
                IBinder.FLAG_ONEWAY);
        data.recycle();
    }        
        ....
    }
    ....
}

ApplicationThread.scheduleLaunchActivity

frameworks/base/core/java/android/app/ActivityThread.java

public final class ActivityThread {
    ....
    private class ApplicationThread extends ApplicationThreadNative {
         ....
         public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
                CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
                int procState, Bundle state, PersistableBundle persistentState,
                List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo,int taskId_param) {

            updateProcessState(procState, false);
            //将要启动的Activity封装成ActivityClientRecord对象r
            ActivityClientRecord r = new ActivityClientRecord();

            r.token = token;
            r.ident = ident;
            r.intent = intent;
            r.referrer = referrer;
            r.voiceInteractor = voiceInteractor;
            r.activityInfo = info;
            r.compatInfo = compatInfo;
            r.state = state;
            r.persistentState = persistentState;

            r.pendingResults = pendingResults;
            r.pendingIntents = pendingNewIntents;

            r.startsNotResumed = notResumed;
            r.isForward = isForward;

            r.profilerInfo = profilerInfo;

            r.overrideConfig = overrideConfig;
            r.taskId = taskId_param;
            updatePendingConfiguration(curConfig);
            //发送类型为LAUNCH_ACTIVITY,带着r的消息给创建的应用程序金层呢的消息队列处理
            sendMessage(H.LAUNCH_ACTIVITY, r);
        }
        ....
        
    }
    
    ....
    public void handleMessage(Message msg) {
         switch (msg.what) {
            ....
            case LAUNCH_ACTIVITY: {
                    //将发送来的obj转成ActivityClientRecord对象r
                    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
                    //调用getPackageInfoNoCheck获得一个LoadedApk对象保存在r.的成员函数packageInfo中
                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo, r.compatInfo);
                    //进入函数handleLaunchActivity来启动Activity组件
                    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
                } break;
            ....
         }
    }
    ....
    
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
        ....

        // 确保我们使用最新的配置运行。
        handleConfigurationChanged(null, null);

        // 创建Activity前进行初始化
        WindowManagerGlobal.initialize();
        // performLaunchActivity函数会将Activity启动起来
        Activity a = performLaunchActivity(r, customIntent);

        if (a != null) {
            r.createdConfig = new Configuration(mConfiguration);
            reportSizeConfigurations(r);
            Bundle oldState = r.state;
            //将Activity组件的状态设置为Resumed,代表它是系统当前显示的Activity
            handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);

            if (!r.activity.mFinished && r.startsNotResumed) {
                //如果actvity没有finish,同时并不在resume状态,让Activity进入Pause状态,调用onPause生命方法。下方进入这个方法
                performPauseActivityIfNeeded(r, reason);
                ....
            }
        } else {
           ....
        }   
    }   
    ....
//将Activity启动起来
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        ....
        //获得要启动的Activity组件的包名和类名赋值给component
        ComponentName component = r.intent.getComponent();
        ....

        Activity activity = null;
        try {
            //通过类加载器将component加载到内存中
            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
            //构造出一个对应Activity的实例activity
            activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);
            ....
        } catch (Exception e) {
            ....
        }
        
        try {
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);

            if (activity != null) {
                //创建一个ContextImpl对象,是创建的Activity的上下文环境
                Context appContext = createBaseContextForActivity(r, activity);
                ....
                //传入参数,调用attach进行Activity的初始化
                activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor, window);

                ....
                //通知Activity启动起来,callActivityOnCreate内部会调用Activity的生命周期onCreate()
                mInstrumentation.callActivityOnCreate(activity, r.state);
                //设置一些r的变量
                ....
                }
            }
            ....
            //将r的token对象保存在ActivityThread的成员变量mActivities中
            mActivities.put(r.token, r);
            //r.token是一个Binder代理对象,只想了AMS内部的一个ActivityRecord对象
            //这个ActivityRecord和对象r一样,都是用来描述启动的Activity的,只不过前者用于AMS,后者用于应用程序进程中。

        } catch (SuperNotCalledException e) {
          ....

        } catch (Exception e) {
          ....
        }
        return activity;
    }
    ....
//将Activity组件的状态设置为Resumed,代表它是系统当前显示的Activity
final void handleResumeActivity(IBinder token,
            boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
        //获得启动的Activity的ActivityClientRecord对象,并赋值给r
        ActivityClientRecord r = mActivities.get(token);
        
        //最后会调用到mInstrumentation.callActivityOnResume,之后Activity的onResume生命周期就会被调用了
        r = performResumeActivity(token, clearHide, reason);
        if (r != null) {
            final Activity a = r.activity;
            ....

           if (r.window == null && !a.mFinished && willBeVisible) {
                r.window = r.activity.getWindow();
                View decor = r.window.getDecorView();
                decor.setVisibility(View.INVISIBLE);
                ViewManager wm = a.getWindowManager();
                WindowManager.LayoutParams l = r.window.getAttributes();
                a.mDecor = decor;
                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
                l.softInputMode |= forwardBit;
                if (r.mPreserveWindow) {
                    a.mWindowAdded = true;
                    r.mPreserveWindow = false;
                    ViewRootImpl impl = decor.getViewRootImpl();
                    if (impl != null) {
                        impl.notifyChildRebuilt();
                    }
                }
                if (a.mVisibleFromClient && !a.mWindowAdded) {
                    a.mWindowAdded = true;
                    wm.addView(decor, l);
                }

            } else if (!willBeVisible) {
               ....
            }
               ....
            }

            // 通知AMS activity已经进入resume状态
            if (reallyResume) {
                try {
                    ActivityManagerNative.getDefault().activityResumed(token);
                } catch (RemoteException ex) {
                   ....
                }
            }

        } else {
          ....
        }
    }
    ....
private void performPauseActivityIfNeeded(ActivityClientRecord r, String reason) {
        if (r.paused) {
            // 已经处于pause状态
            return;
        }

        try {
            r.activity.mCalled = false;
            //调用Activity的onPause方法,函数内是调用Activity.performPause方法,最后会调用onPause生命周期
            mInstrumentation.callActivityOnPause(r.activity);
                    r.activity.getComponentName().getClassName(), reason);
            ....
        } catch (SuperNotCalledException e) {
            ....
        } catch (Exception e) {
            ....
        }
        r.paused = true;
    }
    ....
}

   代码中为何需要获得一个LoadedApk对象,原因在于每一个Android应用程序都是打包在一个apk文件中,apk文件中包含了一个Android应用程序的所有资源,所以才需要在启动Activity时加载,为了可以访问到内部的资源文件。在ActivityThread类中就通过LoadedApk独享来描述加载的apk文件。

   当我们加载完apk之后,便会进行初始化配置,创建要启动的Activity的实例,以此调用其attachonCreateonReume方法和生命周期,中间夹杂着一些上下文创建,参数配置等操作没有细说。

Service启动:ActiveServices.attachApplicationLocked

frameworks/base/services/core/java/com/android/server/am/ActiveServices.java

public final class ActiveServices {
    ....
        boolean attachApplicationLocked(ProcessRecord proc, String processName)
            throws RemoteException {
        boolean didSomething = false;
        // 收集等待在此进程启动的所有服务。
        if (mPendingServices.size() > 0) {
            ServiceRecord sr = null;
            try {
                for (int i=0; i<mPendingServices.size(); i++) {
                    sr = mPendingServices.get(i);
                    //检查在mPendingServices中的Service组件是否需要在新创建的应用程序中启动
                    if (proc != sr.isolatedProc && (proc.uid != sr.appInfo.uid
                            || !processName.equals(sr.processName))) {
                        continue;
                    }
                    //若需要启动Service,则先从mPendingServices把该成员删除
                    mPendingServices.remove(i);
                    i--;
                    
                    proc.addPackage(sr.appInfo.packageName, sr.appInfo.versionCode,
                            mAm.mProcessStats);
                    //将要启动的Service启动起来
                    realStartServiceLocked(sr, proc, sr.createdFromFg);
                    ....
                }
            } catch (RemoteException e) {
               ....
            }
        }
        ....
        return didSomething;
    }
    ....
// 启动Service
private final void realStartServiceLocked(ServiceRecord r,
            ProcessRecord app, boolean execInFg) throws RemoteException {
        ....
        //将ServiceRecord对象r的app设置为传入的app,这样就将r和app绑定起来。
        //代表r所描述的Service是在app所描述的应用程序进程中启动的
        r.app = app;
        r.restartTime = r.lastActivity = SystemClock.uptimeMillis();
        
        //将要创建的Service信息添加进app的services列表中
        final boolean newService = app.services.add(r);
        ....
        
        boolean created = false;
        try {
            ....
            //app.threa是类型为ApplicationThreadProxy对象,是一个Binder代理对象,指向应用程序进程ApplicationThread
            //这里调用scheduleCreateService请求应用程序进程创建该service
            app.thread.scheduleCreateService(r, r.serviceInfo,
                    mAm.compatibilityInfoForPackageLocked(r.serviceInfo.applicationInfo),
                    app.repProcState);
            r.postNotification();
            created = true;
        } catch (DeadObjectException e) {
           ....
        } finally {
            ....
        }
        ....
    }
}

ApplicationThreadProxy.scheduleCreateService

frameworks/base/core/java/android/app/ApplicationThreadNative.java

public abstract class ApplicationThreadNative extends Binder
        implements IApplicationThread {
    ....
    class ApplicationThreadProxy implements IApplicationThread {
        ....
        public final void scheduleCreateService(IBinder token, ServiceInfo info,
            CompatibilityInfo compatInfo, int processState) throws RemoteException {
        Parcel data = Parcel.obtain();
        data.writeInterfaceToken(IApplicationThread.descriptor);
        data.writeStrongBinder(token);
        info.writeToParcel(data, 0);
        compatInfo.writeToParcel(data, 0);
        data.writeInt(processState);
        try {
            //发送一个类型为SCHEDULE_CREATE_SERVICE_TRANSACTION的进程间通信请求
            mRemote.transact(SCHEDULE_CREATE_SERVICE_TRANSACTION, data, null,
                    IBinder.FLAG_ONEWAY);
        } catch (TransactionTooLargeException e) {
            ....
        }
        data.recycle();
    }
        ....
    }
    ....
}

ApplicationThread.scheduleCreateService

frameworks/base/core/java/android/app/ActivityThread.java

public final class ActivityThread {
    ....
    public final void scheduleCreateService(IBinder token,
                ServiceInfo info, CompatibilityInfo compatInfo, int processState) {
            updateProcessState(processState, false);
            //将要启动的Service的信息封装成一个CreateServiceData对象s
            CreateServiceData s = new CreateServiceData();
            s.token = token;
            s.info = info;
            s.compatInfo = compatInfo;
            //发送了一个CREATE_SERVICE消息,之后来看消息处理
            sendMessage(H.CREATE_SERVICE, s);
        }
    ....
        ....
    public void handleMessage(Message msg) {
         switch (msg.what) {
            ....
           case CREATE_SERVICE:
                    handleCreateService((CreateServiceData)msg.obj);
                    break;
            ....
         }
    }
    ....
    private void handleCreateService(CreateServiceData data) {
        ....
        //获得将要启动的Service组件所在应用程序的LoadedApk对象
        LoadedApk packageInfo = getPackageInfoNoCheck(
                data.info.applicationInfo, data.compatInfo);
        Service service = null;
        try {
            //获得一个类加载器
            java.lang.ClassLoader cl = packageInfo.getClassLoader();
            //将要启动的Service加载到内存中,并创建其对应的一个实例service
            service = (Service) cl.loadClass(data.info.name).newInstance();
        } catch (Exception e) {
            ....
        }

        try {
            ....
            //创建Service的一个上下文环境对象实例
            ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
            context.setOuterContext(service);
            //创建/获得一个应用程序对象app
            Application app = packageInfo.makeApplication(false, mInstrumentation);
            //通过上面传入和创建的参数初始化service
            service.attach(context, this, data.info.name, data.token, app,
                    ActivityManagerNative.getDefault());
            //初始化完成后调用Service的生命周期onCreate
            service.onCreate();
            //以CreateServiceData的token关键字,将service保存在ActivityThread类的成员变量mServices中
            //与之前启动Activity类似,这里的token也是一个Binder代理对象
            //指向了AMS内部的一个ServiceRecord对象,用来描述启动的Service
            mServices.put(data.token, service);
            ....
        } catch (Exception e) {
           ....
        }
    }
    ....
}

   至此要启动的ServiceonCreate就被调用了,启动完成

这里简单写了一个流程图如下:
activitythread_analysis.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容