App启动原理

12 阅读2分钟

startActivity启动过程分析 - Gityuan博客 | 袁辉辉的技术博客

Android Activity启动流程(Android 13)_android13 app启动过程-CSDN博客

  • Android 6.0源碼 image.png

ActivityThread和ApplicationThrad通过Handler通信 handleLaunchActivity>>new Activity>>activity.attach()>>Instrumention.callAcitivityOnCreate>>Activity.onCreate

image.png

  • Android 13.0源碼 image.png
1.当我们点击app桌面图标的时候,桌面Launcher应用会调用

startActivity----> startActivityForActivityResult-----> Insrumention(execStartActivity)---> ActivityManagerProxy(startActivity)---> Binder通信---->通知ActivityManagerService.

2.ActivityManagerService在收到AMP启动Activity的请求后,会做以下事情:
  • 检查Activity的合法性,是否在AndroidManifest.xml清单文件中注册。

  • 如果合法,会暂存Activity的信息,通过ActivityStack获取栈顶的Activity,并通知Launcher应用,pause 该Activity 。

  • 检查Activity所在的进程是否存在。

2.1.检查Activity所在的进程是否存在

(1)进程不存在(冷启动)

会调用Process.start() ,通过Socket通信的方式,通知zygote进程,fork一个新进程, 载入ActivityThread ,会调用main()方法初始化,在main()方法内部会调用 thread.attach(false, startSeq)--->actachApplication()--->AMS会通过Binder IPC机制给App进程发送一个BindApplication的消息--->App进程收到这个消息后,会通过Handler发送一个Bind_APPLICATION的消息给到ActivityThread--->handleBindApplication...

(2)进程存在(热启动)

AMS会通过Binder IPC机制给App进程发送一个scheduleLaunchActivity的消息...

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.prepareMainLooper();

        // Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command line.
        // It will be in the format "seq=114"
        long startSeq = 0;
        if (args != null) {
            for (int i = args.length - 1; i >= 0; --i) {
                if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
                    startSeq = Long.parseLong(
                            args[i].substring(PROC_START_SEQ_IDENT.length()));
                }
            }
        }
        ActivityThread thread = new ActivityThread();
        thread.attach(false, startSeq);

        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");
    }

2.2.然后AMS服务端这边,会通过Binder Ipc机制给App进程发送一个bindApplication的消息,App进程收到bindApplication的消息后,会通过Handler发送一个BIND_APPLICATION的消息给到ActivityThread线程,调用

handleBindApplication方法,在这个方法中,会通过Instrumination.newApplication创建应用,并调用Instrumination.callApplicaionOnCreate回调applicaion的onCreate方法.

2.3.然后AMS服务端这边,会通过Binder Ipc机制给App进程发送一个schduleLaunchActivity的消息,App进程收到schduleLaunchActivity的消息后,会通过Handler发送一个LAUNCH_ACTIVITY的消息给到ActivityThread线程,调用handleLaunchActivity-->pefromLaunchActivity方法,在这个方法中,会通过Instrumination.newActivity创建应用,并调用Instrumination.callActivityOnCreate回调applicaion的onCreate方法.

---->bindApplication--->handleLaunchActivity--->performLaunchActivity---->Instrumentation.newActivity---->Instrumention.callActivityOnCreate---->Activity.performCreate--->Activity.onCreate()

schduleLaunchActivity--->handleLaunchActivity--->performLaunchActivity---->Instrumentation.newActivity---->Instrumention.callActivityOnCreate---->Activity.performCreate--->Activity.onCreate()

schduleResumeActivity--->handleResumeActivity->performResumeActivity-Activity.performResume>>>Instrumentation.callActivityOnResume>>>Activity.onResume()

2.4.接下来就会走View的绘制 View的绘制原理 - 简书 (jianshu.com)