App的启动流程

作者: pj0579 | 来源:发表于2019-09-26 08:25 被阅读0次

    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("<pre-initialized>");
             // 大名鼎鼎的消息机制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的启动流程

        本文链接:https://www.haomeiwen.com/subject/ugzwuctx.html