Android应用启动流程

·  阅读 4420
Android应用启动流程

基于Android 8.0
相关源码太多,不利于阅读和记忆,因此本文时序图为主,重要源码为辅。请注意,本文讲的是应用根Activity的启动流程,和普通Activity的启动流程有些不一样。

作为一个应用层开发者,掌握应用启动流程是必须的。

如图当我们点击QQ的图标时,Launcher会调用startActivity()然后经过一系列操作最终启动QQ。从Launcher调用startActivity()到启动QQ这一过程,是今天要分析的。

Android Binder通信步骤:1.注册服务。2.请求服务。3.传输数据。
Binder机制模型:C/S模型。

Activity启动分为两种,根Activity和普通Activity。根Activity启动我将它分为7步。

第一步:Launcher 通过binder机制请求AMS启动Activity

这里面有个“监视”思想值得我们学习,我们组件化开发的时候可以给我们各个组件加一个监视类,来监视组件的交互。Instrumentation主要监视应用程序和系统的交互,这里的系统包含Framework层,也就是说应用程序和系统的交互都需要经过这个类。这一步涉及到两个进程Launcher进程和system_server进程,通过Binder机制通信。Binder机制是C/S模型的,此处 Launcher是C端,AMS是S端。

第二步:配置Activity的信息 AMS接收到请求后通过ActivityStarter解析Intent和Flag,在通过ActivityStack为Activity配置栈信息。并判断是否需要创建应用进程。

第三步:配置应用进程信息并通过Socket请求Zygote创建子进程 通过系统进程管理类Process配置应用进程信息,这一步涉及到连个进程system_server进程和 Zygote进程,通过Socket通信。

第四步:创建应用进程(启动进程) ZygoteServer接收到AMS的Socket请求,通过ZygoteConnection fork应用进程。fork进程后会返回一个pid,通过判断pid进入到应用进程。Zygote进程在初始化的的时候就创建了Socket并Loop等待AMS的请求。

第五步:应用进程初始化(进程准备工作,进程Loop) 初始化Binder线程池(通过ZygoteInit),初始化运行时环境(通过RunntimeInit)。通过ActivityThread创建主线程,创建H类,开始Loop循环。并通过Binder向AMS发送绑定Application的请求。

第六步:绑定Application AMS接收到ActivityThread发送的请求后,把Application和进程进程绑定(这就是每个进程只有一个Application的原因)。最后通过Binder机制请求启动Activity。

第七步:启动Activity ApplicationThread接收到请求后调用ActivityThread#performLaunchActivity来间接调用Activity的onCreate方法。这里有个注意点ActivityThread调用Activity也通过了Instrumention。

Launcher请求AMS

Launcher和AMS从Binder机制模型来说前者是Client后者是Server。这一 过程从Binder通信步骤来说是请求服务(Launcher请求AMS)和传输数据(请求 启动目标Activity)。

Launcher请求AMS的过程,从Binder机制角度来看,包含请求服务 和 传输数据.

涉及类的作用
Instrumentation.java:监视应用程序和 系统(包含framework)的所有交互。跟踪Appllication和Activity的生命周期。用于android 应用测试框架中,被做为基类使用。
ActivityManager.java:该类提供关于activity、service和进程的信息,并与之交互。该类中的许多方法都是用于调试和提供信息的.

//Instrumentation.java  这个类主要用于监控应用程序和系统的交互。
execStartActivity{
    ...
    ActivityManager.getService() //Binder机制角度分析 获取服务:Launcher获取AMS服务。注册服务:AMS已经注册好了
    //AIDL角度分析 得到AMS的代理对象,8.0之前是通过AMN.getDefault得到代理对象
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);//Bind机制角度分析  传输数据。
                        //最终调用的是AMS的startActivity方法。在此将处理逻辑交给AMS,实现跨进程通信
    ...
}
//ActivityManager.java
getService{
    //AIDL的形式,8.0之前用的不是AIDL
    return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
        new Singleton<IActivityManager>() {
            @Override
            protected IActivityManager create() {
                //获得AMS的引用
                final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                final IActivityManager am = IActivityManager.Stub.asInterface(b);
                return am;
            }
        };
复制代码

AMS请求Zygote创建应用进程

这一部分可以分为两步,第一步AMS通过Socket请求Zygote。第二步Zygote接收到请求后创建目标进程(运行此Activity的进程)。

AMS通过Socket请求Zygote

相关类简介:
AMS(ActivityManagerService):管理所有APP的四大组件通信。
ActivityStarter: 控制器,用于解释如何启动活动。该类收集所有逻辑,用于确定Intent和flag应如何转换为活动以及相关的任务和堆栈。
ActivityStackSupervisor.java:AMS的stack管理主要有三个类,栈的大管家ActivityStackSupervisor,ActivityStack和TaskRecord
ActivityStack.java:管理类,用来管理系统所有的Activity,内部维护了Activity的所有状态和Activity相关的列表等数据。
Process.java:管理操作系统进程。
ZygoteProcess.java:维护与Zygote进程的通信状态。

//ActivityStarter.java   Android 7.0新加的类,加载Activity的控制类。并将Activity和Task和Stack相关联。

//ActivityStackSupervisor.java
void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {
    // 当前Activity所需的应用进程
    ProcessRecord app = mService.getProcessRecordLocked(r.processName,
            r.info.applicationInfo.uid, true);
    r.task.stack.setLaunchTime(r);
    // 如果应用进程已经存在
    if (app != null && app.thread != null) {
        try {
            if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
                    || !"android".equals(r.info.packageName)) {
                app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
                        mService.mProcessStats);
            }
            realStartActivityLocked(r, app, andResume, checkConfig);
            return;
        } catch (RemoteException e) {
            Slog.w(TAG, "Exception when starting activity "
                    + r.intent.getComponent().flattenToShortString(), e);
        }
    }
    //创建应用进程
    mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
            "activity", r.intent.getComponent(), false, false, true);
}

//ZygoteProcess.java
zygoteSendArgsAndGetResult(){
    ...
    openZygoteSocketIfNeeded(){
        ...
        primaryZygoteState = ZygoteState.connect(mSocket);//与Zygote进程 建立Socket连接
        ...
    }
    ...
}
复制代码

Zygote创建进程

Zygote接收AMS请求后创建目标进程。Zygote进程在做准备工作时已经把Socket的Server端创建好了,并一直等待着AMS的请求。

相关类简介:
ZygoteServer:Zygote进程的Socket Server实现类(接收AMS 的请求)。并派生继承VM初始状态的子进程。
ZygoteConnection.java:真正生成子进程的类。当子进程创建完毕后进入子进程。
RuntimeInit.java:进程 运行时 初始化入口。
ZygoteInit.java:Zygote进程启动类。
ActivityThread.java:负责应用程序进程中主线程的执行,按照Activity Manager的请求调度和执行Activity、Broadcast和其他操作。

//ZygoteServer.java
runSelectLoop(){
    ...
    while(true){//此处一直循环
        ...
        //当有AMS的请求到来时,runOnce方法就会执行。
        boolean  done = peers.get(i).runOnce(this);
        ...
    }
}
//ZygoteConnection.java
runOnce(){
    ...
    Zygote.forkAndSpecialize();//创建目标进程。此方法调用native方法fork进程。
    ...
    //处理目标进程。也就是说由Zygote转入到目标进程(应用进程)
    handleChildProc();
    ...
}
//ZygoteInit.java
zygoteInit(){
    ...
    ZygoteInit.nativeZygoteInit();//目标进程创建Binde线程池
    RuntimeInit.applicationInit();
    ...
}
//RunntimeInit.java
invokeStaticMain(){
    ...
    cl = Class.forName(className, true, classLoader);//通过反射获取ActivityThread类
    ...
    m = cl.getMethod("main", new Class[] { String[].class });//通过反射得到ActivityThread的Main方法
    ...
    throw new Zygote.MethodAndArgsCaller(m, argv);//抛出异常,ZygoteInit捕获到。
}
//ZygoteInit.java
try{}catch(MethodAndArgsCaller caller){
    caller.run();//调用ZygoteInit.MethodAndArgsCaller.run()
}
//ZygoteInit.MethodAndArgsCaller.java
run(){
    mMethod.invoke();//调用ActivityThread的main方法。
}
//ActivityThread.java
public static void main(String[] args) {
    ...
    //创建主线程 Looper
    Looper.prepareMainLooper();
    ActivityThread thread = new ActivityThread();
    thread.attach(false);
    if (sMainThreadHandler == null) {
        //创建主线程H类
        sMainThreadHandler = thread.getHandler();
    }
    //主线程进入轮询状态
    Looper.loop();
    throw new RuntimeException("Main thread loop unexpectedly exited");
}

//至此目标进程创建完毕。
复制代码

ActivityThread启动Activity

接着上一小节分析。

//ActivityThread.java
attach(boolean system) {
    ...
    //Binder机制角度分析 获取服务:应用进程获取AMS服务。
    final IActivityManager mgr = ActivityManager.getService();
    try {
    //Binder机制角度分析 传输数据:Client请求调用AMS#attachApplication。
        mgr.attachApplication(mAppThread);
    } catch (RemoteException ex) {
        throw ex.rethrowFromSystemServer();
    }
    ...
}
//ActivityStackSupervisor.java
realStartActivityLocked(ActivityRecord r, ProcessRecord app,
            boolean andResume, boolean checkConfig) {
    ...
    //Binder机制角度分析 传输数据:Server返回请求调用ActivityThread#scheduleLaunchActivity。
    app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
                    System.identityHashCode(r), r.info,
                    mergedConfiguration.getGlobalConfiguration(),
                    mergedConfiguration.getOverrideConfiguration(), r.compat,
                    r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
                    r.persistentState, results, newIntents, !andResume,
                    mService.isNextTransitionForward(), profilerInfo);
    ...
}

//ActivityThread.java
performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ...
    // attach 到 Window 上
    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);
    ...
    if (theme != 0) {
        activity.setTheme(theme);//设置主题
    }
    activity.mCalled = false;
    if (r.isPersistable()) {
        mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
    } else {
        mInstrumentation.callActivityOnCreate(activity, r.state);
    }
    ...
}
//Activity.java
final void performCreate(Bundle icicle, PersistableBundle persistentState) {
        restoreHasCurrentPermissionRequest(icicle);
    onCreate(icicle, persistentState);//执行Activity
    mActivityTransitionState.readState(icicle);
    performCreateCommon();
}
复制代码
分类:
Android
标签:
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改