一、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, ListpendingResults, 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应用程序具有重要的帮助。