ActivityThread启动源码解析

来源:互联网 发布:java服务器路径怎么写 编辑:程序博客网 时间:2024/06/18 11:34

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ActivityThread.java
1.启动,走attach
ActivityThread thread = new ActivityThread();
thread.attach(false);
2 获取一个代理,则进入AMS查看attachApplication
final IActivityManager mgr = ActivityManager.getService();
mgr.attachApplication(mAppThread);
3 thread.bindApplication 这里thread指的是ActivityThread种的IApplicationThread
4 ApplicationThread 继承IApplicationThread
进入ApplicationThread bindApplication
sendMessage(H.BIND_APPLICATION, data);
mH.sendMessage(msg);
5final H mH = new H();
所以找一下H这个类,就是Handler
这里启动Activity生命周期都是一个套路
ApplicationThread 调用 IApplicationThread定义的接口
这里是bindApplication.生命周期是schedulexxx
给H发msg
回调 ActivityThread handlerxxx
performxxx

case BIND_APPLICATION:
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, “bindApplication”);
AppBindData data = (AppBindData)msg.obj;
handleBindApplication(data);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
break;
Application app = data.info.makeApplication(data.restrictedBackupMode, null);
mInitialApplication = app;
mInstrumentation.callApplicationOnCreate(app);

    data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);

这里知道LoadedApk怎么创建的
Application怎么创建的
public final LoadedApk peekPackageInfo(String packageName, boolean includeCode) {
synchronized (mResourcesManager) {
WeakReference ref;
if (includeCode) {
ref = mPackages.get(packageName);
} else {
ref = mResourcePackages.get(packageName);
}
return ref != null ? ref.get() : null;
}
}

好的,总结一下,这里Application在LoadedApk创建,
LoadedApk存在Map类型的数据结构,以包名也就是一个进程对应一个

public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
if (mApplication != null) {
return mApplication;
}

    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "makeApplication");    Application app = null;    String appClass = mApplicationInfo.className;    if (forceDefaultAppClass || (appClass == null)) {        appClass = "android.app.Application";    }    try {        java.lang.ClassLoader cl = getClassLoader();        if (!mPackageName.equals("android")) {            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,                    "initializeJavaContextClassLoader");            initializeJavaContextClassLoader();            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);        }        ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);        app = mActivityThread.mInstrumentation.newApplication(                cl, appClass, appContext);        appContext.setOuterContext(app);    } catch (Exception e) {        if (!mActivityThread.mInstrumentation.onException(app, e)) {            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);            throw new RuntimeException(                "Unable to instantiate application " + appClass                + ": " + e.toString(), e);        }    }    mActivityThread.mAllApplications.add(app);    mApplication = app;    if (instrumentation != null) {        try {            instrumentation.callApplicationOnCreate(app);        } catch (Exception e) {            if (!instrumentation.onException(app, e)) {                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                throw new RuntimeException(                    "Unable to create application " + app.getClass().getName()                    + ": " + e.toString(), e);            }        }    }    // Rewrite the R 'constants' for all library apks.    SparseArray<String> packageIdentifiers = getAssets().getAssignedPackageIdentifiers();    final int N = packageIdentifiers.size();    for (int i = 0; i < N; i++) {        final int id = packageIdentifiers.keyAt(i);        if (id == 0x01 || id == 0x7f) {            continue;        }        rewriteRValues(getClassLoader(), packageIdentifiers.valueAt(i), id);    }    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);    return app;}

Instrumentation

public Application newApplication(Class

原创粉丝点击