您的位置:

Android应用程序启动:背后的过程

一、Android应用程序启动的概述

在Android系统中,当我们点击应用程序图标时,启动该应用程序的过程是一个相当复杂的过程,涉及到了诸多系统组件的协同工作。Android系统启动应用程序的过程可以分为四个阶段:Zygote启动、System Server启动、Activity Manager启动和应用程序启动。下面我们将详细介绍这四个阶段的工作内容。

二、Zygote启动

Zygote是Android系统中的一个特殊进程,专门用于创建新进程。启动Zygote进程是Android启动应用程序的第一步。当我们点击应用程序图标时,系统会先启动Zygote进程。Zygote进程首先会预加载一些常用的Android framework类,以加快界面显示的速度。当Zygote进程完成初始化工作后,会等待Activity Manager发送请求创建新进程的命令。

三、System Server启动

System Server是Android系统中的一个服务进程,包含了许多服务组件,如Activity Manager、Package Manager、Window Manager等。在启动应用程序之前,必须先启动System Server进程。System Server进程主要负责系统核心服务的启动和管理。

当Zygote进程收到Activity Manager请求创建新进程的命令时,会fork一个新进程。然后Zygote把自己的状态复制到新进程中,新进程中就可以直接使用Zygote已经加载好的framework类。同时,新进程还会调用system_server进程提供的服务,如PackageManagerService、SystemService等。这时,System Server进程就会为新进程分配进程ID,并启动新进程。新进程启动后,Zygote进程会销毁原有的进程。

四、Activity Manager启动

Activity Manager是Android系统中的一个管理Activity的系统服务。当新进程启动后,Activity Manager进程会通知新进程启动主Activity。新进程会启动主Activity以及与主Activity关联的系统服务,如Service、BroadcastReceiver等。主Activity启动后,会依次启动Application、Activity LifeCycle、View、ViewGroup、ActivityThread等对象。当所有对象都启动完成后,应用程序就可以完全显示出来。

五、应用程序启动

应用程序启动就是在ActivityThread对象的handleLaunchActivity方法中实现的。当Activity Manager通知启动主Activity时,ActivityThread对象就会调用handleLaunchActivity方法,创建新的Activity,并启动新的进程。

下面是应用程序启动的代码示例:

public class ActivityThread {
    public static void main(String[] args) {
        Looper.prepareMainLooper();
        ActivityThread thread = new ActivityThread();
        thread.attach(false);
        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }
        Looper.loop();
    }
 
    public void attach(boolean system) {
        sThreadLocal.set(this);
        if (!system) {
            ApplicationInfo info = getApplicationInfo();
            VMRuntime.registerAppInfo(info);
        }
        Instrumentation instrumentation = IMPL.newInstrumentation();
        ContextImpl context = ContextImpl.createAppContext(this, getInitialApplication());
        mInitialApplication = null;
        ActivityThreadHandler handler = new ActivityThreadHandler(context.getMainLooper());
        handler.sendMessage(handler.obtainMessage(MSG_ATTACH_AGENT, instrumentation));
 
        if (!system) {
            RuntimeInit.setApplicationObject(context.getProcessName(), context.getApplicationObject());
        }
        try {
            ActivityManagerNative.getDefault().attachApplication(new ApplicationThread());
        } catch (RemoteException ex) {
            throw ex.rethrowFromSystemServer();
        }
    }
 
    final class ApplicationThread extends ApplicationThreadNative {
        @Override
        public void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                                           ActivityInfo info, Configuration curConfig,
                                           CompatibilityInfo compatInfo, String referrer,
                                           IVoiceInteractor voiceInteractor, Bundle state,
                                           PersistableBundle persistentState, List pendingResults,
                                           List
    pendingNewIntents, boolean notResumed,
                                           boolean isForward, ProfilerInfo profilerInfo) {
            ...
            ActivityClientRecord r = new ActivityClientRecord();
            r.token = token;
            r.ident = ident;
            r.intent = intent;
            r.referrer = referrer;
            r.voiceInteractor = voiceInteractor;
            r.activityInfo = info;
            r.compatInfo = compatInfo;
            r.state = state;
            r.persistentState = persistentState;
            r.pendingResults = pendingResults;
            r.pendingNewIntents = pendingNewIntents;
            r.startsNotResumed = notResumed;
            r.isForward = isForward;
            r.profilerInfo = profilerInfo;
 
            ActivityClientRecord existing = mActivities.get(token);
            if (existing != null) {
                ...
            } else {
                mActivities.put(token, r);
                ...
                prePerformCreate(r);
                mInstrumentation.callActivityOnCreate(r.activity, r.state);
                ...
                performResumeActivity(r.token, true, "onCreate");
            }
            ...
        }
    }
}

   
  

六、总结

在Android系统中,应用程序的启动是一个复杂的过程,涉及到了诸多的系统组件的协同工作。了解Android应用程序启动的过程,对于我们开发高效的Android应用程序具有重要的帮助。

Android应用程序启动:背后的过程

2023-05-14
Android启动流程解析:完整地分解Android系统启动

2023-05-14
Android Splash: 详解安卓启动页

2023-05-18
下载Android Studio,开启Android应用程序

2023-05-14
提高Android应用程序性能的关键

2023-05-14
Android重启应用

2023-05-18
Android Init.rc: 启动过程中的初始化工作

2023-05-14
Android App启动流程详解

2023-05-18
提升用户体验:Android开机自动启动指定应用程序

2023-05-14
Android Activity启动流程

2023-05-24
Android应用快速启动的关键-Zygote进程解析

Android应用在启动过程中,Zygote进程起到了至关重要的作用。Zygote进程是一个特殊的进程,它会在系统启动时被创建,并始终保持运行状态,负责孵化新的进程。在使用应用时,Zygote进程可以

2023-12-08
Android启动白屏问题详解

2023-05-18
Android应用程序开发要点

2023-05-14
Android API文档:Android应用程序接口简介

2023-05-14
使用Android SDK和Mac构建高效的移动应用程序

2023-05-14
Android Activity启动流程解析

在Android应用开发过程中,Activity是重要的组件之一。本文将为大家详细解析Android Activity启动流程,帮助读者深入理解Activity的启动过程。 一、Activity启动方

2023-12-08
Android启动速度提升的秘诀

2023-05-14
构建强大的移动应用程序:Android工具和开发资源

2023-05-14
如何正确使用flag_activity_clear_top来

2023-05-22
重新启动adbd为root的应用程序

2023-05-17