App的启动流程

Android App的启动流程
1.点击app图标,Launcher进程通过BinderSystem_Server进程发送一个startActivity请求
2.System_Server进程收到请求,通过Binder向zygote进程发送一个创建新进程请求
3.zygote进程 fork一个新的app进程
4.app进程通过BinderSystem_Server进程发送一个attachApplication请求
5.System_Server进程通过Binder 向 app 发送一个scheduleLaunchActivity请求
6.app 的applicationThread接受请求(也叫Binder线程),通过handler向主线程发送一个LAUNCH_ACTIVITY请求。
7.开始正常的activity创建过程。
多次用到Binder 进行多进程通信,可以简单的解释一下

1.client通过获得一个server的代理接口,对server进行调用。
2.代理接口中定义的方法与server中定义的方法时一一对应的。
3.client调用某个代理接口中的方法时,代理接口的方法会将client传递的参数打包成Parcel对象。
代理接口将Parcel发送给内核中的binder driver。
4.server会读取binder driver中的请求数据,如果是发送给自己的,解包Parcel对象,处理并将结果返回。
5.整个的调用过程是一个同步过程,在server处理的时候,client会block住。因此client调用过程不应在主线程。

image.png

看上图ApplicationThreadActvityThread发送了一个message
ActivityThread是先于ApplicationThread执行的,ApplicationThreadActivityThread里初始化。
app的真正启动过程是从ActivityThreadmain方法开始的

public static void main(String[] args) {
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");

        // CloseGuard defaults to true and can be quite spammy.  We
        // disable it here, but selectively enable it later (via
        // StrictMode) on debug builds, but using DropBox, not logs.
        CloseGuard.setEnabled(false);

        Environment.initForCurrentUser();

        // Set the reporter for event logging in libcore
        EventLogger.setReporter(new EventLoggingReporter());

        // Make sure TrustedCertificateStore looks in the right place for CA certificates
        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
        TrustedCertificateStore.setDefaultUserDirectory(configDir);

        Process.setArgV0("");
         // 大名鼎鼎的消息机制Looper在app创建的时候就初始化了,ActivityThread并不是一个线程类,而是在线程里执行了ActivityThread.main方法。
        Looper.prepareMainLooper();

        ActivityThread thread = new ActivityThread();
        // application的创建
        thread.attach(false);

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

        if (false) {
            Looper.myLooper().setMessageLogging(new
                    LogPrinter(Log.DEBUG, "ActivityThread"));
        }

        // End of event ActivityThreadMain.
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        // 开启循环模式 防止线程结束
        Looper.loop();

        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

你可能感兴趣的:(App的启动流程)