ActivityThread相关源码分析

前言

先看ActivityThread相关类图

 

分析核心的类:ActivityThread

各个关键类简介:

      1、ActivityThread(进程内唯一):负责进程下Application、所有Activity

      2、Instrumentation(进程内唯一):作为ActivityThread组合部分,负责统一创建Application,创建Activity,管理某一个Activity生命周期。

      3、ApplicationThread(进程内唯一):作为ActivityThread组合部分,管理整个App的生命周期,例如:通知App进入sleep状态,广播接收,应用退出等一堆App事件的分发。

      4、H(进程内唯一):作为ActivityThread组合部分,继承于Handler,分发App内部Framework层的所有事件,将异步事件转入主线程。

      5、LoadedApk(进程内唯一):常用变量名称:packageInfo。所以顾名思义,该类表示包相关的信息,例如:APK数据文件地址、ApplicationInfo(由此可知,LoadedApk含有Application的所有信息)

      6、ActivityClientRecord:新建Activity时会创建,用来持有Activity、ActivityInfo、LoadedApk等和具体Activity有关的信息

      7、ActivityManagerService:管理Activity、Service等活动栈、记录及与C++层交互

      8、ActivityStarter:主要负责Activity的启动,及联系Activity的Stack和Task相关

启动ActivityThread

1)启动入口

      看源码,我们可以发现,ActivityThread的构造器被两个静态方法使用,一个是ActivityThread的main方法,一个是ActivityThread的systemMain方法。

      先看systemMain方法,其由SystemServer的createSystemContext方法调用,同时该方法又被SystemServer的run方法调用。从Android启动源码那篇博客可以知道,run方法为System进程Java端的初始化过程。所以可以看出该方法是专门为SystemServer创建ActivityThread使用的。

      相对的,那么ActivityThread的main方法为普通App进程的启动方式。

2)下面进入main@ActivityThread

public static void main(String[] args) {
    // 初始化Environment
    Environment.initForCurrentUser();
    // 初始化Event日志
    EventLogger.setReporter(new EventLoggingReporter());
    // 根据用户Id创建指定目录
    final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
    // 将当前线程作为主线程,初始化Looper
    Looper.prepareMainLooper();
    // 创建ActivityThread
    ActivityThread thread = new ActivityThread();
    // 如果是System则直接创建Application,如果非System则将ApplicationThread注册到AM中
    thread.attach(false);
    // 初始化Handler
    if (sMainThreadHandler == null) {
        sMainThreadHandler = thread.getHandler();
    }
    // 无限循环中
    Looper.loop();
    // 异常终止,注意这里的异常通常是执行不到的,上方loop有异常也不会执行到这里。
    throw new RuntimeException("Main thread loop unexpectedly exited");
}

      ActivityThread 构造器仅仅new ResourcesManager();ResourceManager,顾名思义,是我们获取资源的管理类,DisplayMetrics和AssetManager也都是其负责的。

      main方法进入循环前只执行了一个方法:thread.attach(false);而后进入循环,说明了在该方法里面,集合了整个应用进程的生命周期。

3)开启应用App创建,查看thread.attach(false);

private void attach(boolean system) {
    sCurrentActivityThread = this;
    mSystemThread = system;
    if (!system) { // 进入应用创建
        ViewRootImpl.addFirstDrawHandler(new Runnable() {
            @Override
            public void run() {
                ensureJitEnabled();
            }
        });
        android.ddm.DdmHandleAppName.setAppName("<pre-initialized>",
        UserHandle.myUserId());
        RuntimeInit.setApplicationObject(mAppThread.asBinder());
        // 创建应用Application
        final IActivityManager mgr = ActivityManagerNative.getDefault();
        try {   
            mgr.attachApplication(mAppThread);
        } catch (RemoteException ex) {
            throw ex.rethrowFromSystemServer();
        }
        ...
    } else { // 进入SystemServer创建
        ...
        try {
            // 创建Activity生命周期管理类
            mInstrumentation = new Instrumentation();
            // 创建系统级别的上下文
            ContextImpl context = ContextImpl.createAppContext(
                this, getSystemContext().mPackageInfo);
            // 创建Application,并启动onCreate方法
            mInitialApplication = context.mPackageInfo.makeApplication(true, null);
            mInitialApplication.onCreate();
        } catch (Exception e) {
            throw new RuntimeException("Unable to instantiate Application():" + e.toString(), e);
        }
    }
    // 记录着系统关键log信息,主要功能用于Debug调试
    DropBox.setReporter(new DropBoxReporter());
    // 注册到ViewRootImpl中,监听组件配置信息变化监听
    ViewRootImpl.addConfigCallback(new ComponentCallbacks2() {
        ...
    });
}

创建System的Application代码比较明显,但是创建应用Application链路比较长,我们将这里分析下:

attach()中进入应用Application的入口:

final IActivityManager mgr = ActivityManagerNative.getDefault();
try {
    mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
    throw ex.rethrowFromSystemServer();
}

mgr在这里就是ActivityManagerProxy(可以看gDefault这个单例,里面先找到AMS,再利用AMS创建了ActivityManagerProxy),看ActivityManagerProxy里面的attachApplication,这里面执行了:

mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0);

mRemote为创建ActivityManagerProxy时传入的IBinder,也就是AMS。这里执行的就是跨进程了。

通过ATTACH_APPLICATION_TRANSACTION可以确定,处理的代码在AMS的父类ActivityManagerNative中onTransact,

case ATTACH_APPLICATION_TRANSACTION: {
    data.enforceInterface(IActivityManager.descriptor);
    IApplicationThread app = ApplicationThreadNative.asInterface(
        data.readStrongBinder());
    if (app != null) {
        attachApplication(app);
    }
    reply.writeNoException();
    return true;
}

4)下一步执行attachApplication(app);这里执行的代码不再是ActivityManagerProxy,而是在AMS中:

@Override
public final void attachApplication(IApplicationThread thread) {
    synchronized (this) {
        int callingPid = Binder.getCallingPid();
        final long origId = Binder.clearCallingIdentity();
        attachApplicationLocked(thread, callingPid);
        Binder.restoreCallingIdentity(origId);
    }
}

private final boolean attachApplicationLocked(IApplicationThread thread,int pid) {
    ...
    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 {
            // 加载Launch Activity
            if (mStackSupervisor.attachApplicationLocked(app)) {
                didSomething = true;
            }
        } catch (Exception e) {
            Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
            badApp = true;
        }
    }
    ...
    return true;
}

看源码,可以发现,创建Application,下一步应该是在这个传入的IApplicationThread的bindApplication方法中执行,从之前的代码中我们可以看到,ActivityThread传入了

mgr.attachApplication(mAppThread);

mAppThread为ApplicationThread,所以,AMS中执行的thread为ApplicationThread的Binder,最终代码我们看ApplicationThread的bindApplication方法。

创建Application

1)查看ApplicationThread的bindApplication方法

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) {
    ...
    sendMessage(H.BIND_APPLICATION, data);
}

ApplicationThread为ActivityThread的内部类,这里刚好有这么一个方法,同时参数都对应的上,说明我们之前确实没有找错对象。可以看到该方法最终又找到了H这个Handler,进而在主线程中执行了ActivityThread的handleBindApplication();

2)看handleBindApplication:

private void handleBindApplication(AppBindData data) {
    ...
    try {
        ...
        Application app = data.info.makeApplication(data.restrictedBackupMode, null);
        mInitialApplication = app;
        ...
        try {
            // 该方法为空,应该是预留方法
            mInstrumentation.onCreate(data.instrumentationArgs);
        } catch (Exception e) {
            ...
        }
        try {
            // 开启Application的onCreate方法
            mInstrumentation.callApplicationOnCreate(app);
        } catch (Exception e) {
            ...
        }
        ...
    } finally {
        StrictMode.setThreadPolicy(savedPolicy);
    }
}

到了这里我们的Application已经启动了。

启动Launch Activity

下面分析Activity启动,这里要回到ActivityThread启动的第4步,执行:

1)第一步:m.attachApplicationLocked(app);

boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
    ...
    for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
        ...
        try {
            if (realStartActivityLocked(hr, app, true, true)) {
                didSomething = true;
            }
        } catch (RemoteException e) {
            ...
            throw e;
        }
        ...
    }
    ...
    return didSomething;
}

2)第二步:StackSupervisor的realStartActivityLocked方法

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
boolean andResume, boolean checkConfig) throws RemoteException {
    ...
    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);
    ...
}

通之前的Application一样,这里的thread为ApplicationThread

3)第三步:ApplicationThread的scheduleLaunchActivity

@Override
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) {
    ...
    sendMessage(H.LAUNCH_ACTIVITY, r);
}

4)第四步:ActivityThread的handleLaunchActivity

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
    ...
    // 初始化窗体
    WindowManagerGlobal.initialize();
    // 启动Launch Acitivity
    Activity a = performLaunchActivity(r, customIntent);
    if(a != null){
        ...
        // 将Activity状态置为Resume状态
        handleResumeActivity(r.token, false, r.isForward,
        !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);
        ...
    }
    ...
}

5)第五步:ActivityThread的performLaunchActivity

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ...
    Activity activity = null;
    try {
        java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
        // 创建Actiivty实体类
        activity = mInstrumentation.newActivity(
        cl, component.getClassName(), r.intent);
        ...
    } catch (Exception e) {
        ...
    }
    try {
        // 如果packageinfo中没有Application,则创建新的Application,并onCreate(),否则直接返回
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);
        if (activity != null) {
            // 绑定上下文,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, window);
            // Activity onCreate方法
            if (r.isPersistable()) {
                mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
            } else {
                mInstrumentation.callActivityOnCreate(activity, r.state);
            }
            // 执行 onStart()方法
            if (!r.activity.mFinished) {
                activity.performStart();
                r.stopped = false;
            }
            // 执行状态恢复生命周期
            if (!r.activity.mFinished) {
                if (r.isPersistable()) {
                    if (r.state != null || r.persistentState != null) {
                        mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
r.persistentState);
                    }
                } else if (r.state != null) {
                    mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
            }
        }
        ...
    }
    r.paused = true;
    mActivities.put(r.token, r);
    } catch (SuperNotCalledException e) {
        ...
    }
    return activity;
}

代码执行完performLaunchActivity,Launch Activity已经进入了onStart。而后回到第四步,进入handleResumeActivity,使Activity进入Resume状态。

至此,我们的Launch Activity已经完成启动,ActivityThread在这之中扮演的角色也比较清晰了。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值