Android深入四大组件(一)应用程序启动过程(后篇)

  • Android框架层
  • Android深入四大组件 categories:
  • Android框架层

本文首发于微信公众号「刘望舒」

1.ActivityManageService到ApplicationThread的调用流程

AMS的startActivity方法中return了startActivityAsUser方法:

<!--more-->

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

1 @Override 2 public final int startActivityAsUser(IApplicationThread caller, String callingPackage, 3 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, 4 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) { 5 enforceNotIsolatedCaller("startActivity"); 6 userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), 7 userId, false, ALLOW_FULL_ONLY, "startActivity", null); 8 return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent, 9 resolvedType, null, null, resultTo, resultWho, requestCode, startFlags, 10 profilerInfo, null, null, bOptions, false, userId, null, null);

startActivityAsUser方法中又return了mActivityStarter的startActivityMayWait方法,代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java

1 final int startActivityMayWait(IApplicationThread caller, int callingUid, 2 String callingPackage, Intent intent, String resolvedType, 3 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 4 IBinder resultTo, String resultWho, int requestCode, int startFlags, 5 ProfilerInfo profilerInfo, IActivityManager.WaitResult outResult, Configuration config, 6 Bundle bOptions, boolean ignoreTargetSecurity, int userId, 7 IActivityContainer iContainer, TaskRecord inTask) { 8 ... 9 int res = startActivityLocked(caller, intent, ephemeralIntent, resolvedType, 10 aInfo, rInfo, voiceSession, voiceInteractor, 11 resultTo, resultWho, requestCode, callingPid, 12 callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, 13 options, ignoreTargetSecurity, componentSpecified, outRecord, container, 14 inTask); 15 16 ... 17 return res; 18 } 19 }

又调用了startActivityLocked方法,代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java

1 final int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent, 2 String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo, 3 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 4 IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, 5 String callingPackage, int realCallingPid, int realCallingUid, int startFlags, 6 ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, 7 ActivityRecord[] outActivity, ActivityStackSupervisor.ActivityContainer container, 8 TaskRecord inTask) { 9 ... 10 11 doPendingActivityLaunchesLocked(false); 12 13 ... 14 return err; 15 }

startActivityLocked函数代码非常多,我们只需要关注doPendingActivityLaunchesLocked方法,代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java

1 final void doPendingActivityLaunchesLocked(boolean doResume) { 2 while (!mPendingActivityLaunches.isEmpty()) { 3 final PendingActivityLaunch pal = mPendingActivityLaunches.remove(0); 4 final boolean resume = doResume && mPendingActivityLaunches.isEmpty(); 5 try { 6 final int result = startActivityUnchecked( 7 pal.r, pal.sourceRecord, null, null, pal.startFlags, resume, null, null); 8 postStartActivityUncheckedProcessing( 9 pal.r, result, mSupervisor.mFocusedStack.mStackId, mSourceRecord, 10 mTargetStack); 11 } catch (Exception e) { 12 Slog.e(TAG, "Exception during pending activity launch pal=" + pal, e); 13 pal.sendErrorResult(e.getMessage()); 14 } 15 } 16 }

接着又调用startActivityUnchecked方法: frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java

1 private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, 2 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 3 int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask) { 4 ... 5 mSupervisor.resumeFocusedStackTopActivityLocked(); 6 ... 7 return START_SUCCESS; 8 }

startActivityUnchecked方法中调用了ActivityStackSupervisor类型的mSupervisor的resumeFocusedStackTopActivityLocked方法,如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

1 boolean resumeFocusedStackTopActivityLocked( 2 ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) { 3 if (targetStack != null && isFocusedStack(targetStack)) { 4 return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions); 5 } 6 final ActivityRecord r = mFocusedStack.topRunningActivityLocked(); 7 if (r == null || r.state != RESUMED) { 8 mFocusedStack.resumeTopActivityUncheckedLocked(null, null);//1 9 } 10 return false; 11 }

在注释1处又调用了ActivityStack类型mFocusedStack的resumeTopActivityUncheckedLocked方法: frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

1 boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) { 2... 3 try { 4 ... 5 result = resumeTopActivityInnerLocked(prev, options); 6 } finally { 7 mStackSupervisor.inResumeTopActivity = false; 8 } 9 return result; 10 }

紧接着查看ActivityStack的resumeTopActivityInnerLocked方法: frameworks/base/services/core/java/com/android/server/am/ActivityStack.java

1 private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) { 2 ... 3 mStackSupervisor.startSpecificActivityLocked(next, true, true); 4 } 5 if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); 6 return true;

resumeTopActivityInnerLocked方法代码非常多,我们只需要关注调用了ActivityStackSupervisor类型mStackSupervisor的startSpecificActivityLocked方法,代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

1 void startSpecificActivityLocked(ActivityRecord r, 2 boolean andResume, boolean checkConfig) { 3 ProcessRecord app = mService.getProcessRecordLocked(r.processName, 4 r.info.applicationInfo.uid, true); 5 r.task.stack.setLaunchTime(r); 6 if (app != null && app.thread != null) {//1 7 try { 8 if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0 9 || !"android".equals(r.info.packageName)) { 10 app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode, 11 mService.mProcessStats); 12 } 13 realStartActivityLocked(r, app, andResume, checkConfig);//2 14 return; 15 } catch (RemoteException e) { 16 Slog.w(TAG, "Exception when starting activity " 17 + r.intent.getComponent().flattenToShortString(), e); 18 } 19 } 20 mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 21 "activity", r.intent.getComponent(), false, false, true); 22 }

在注释1处如果当前Activity所在的Application运行的话,会执行注释2处的代码。realStartActivityLocked方法的代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

1 final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, 2 boolean andResume, boolean checkConfig) throws RemoteException { 3 ... 4 app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, 5 System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration), 6 new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage, 7 task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results, 8 newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo); 9 10 ... 11 12 return true; 13 }

这里的 app.thread指的是IApplicationThread,它的实现是ActivityThread的内部类ApplicationThread,其中ApplicationThread继承了ApplicationThreadNative,而ApplicationThreadNative继承了Binder并实现了IApplicationThread接口。 讲到这里再给出ActivityManageService到ApplicationThread调用过程的时序图,如下图所示。

Vek5NV.png

2.ActivityThread启动Activity

Android应用程序进程启动过程(前篇)这篇文章中提到过ActivityThread,在应用程序进程启动时会创建ActivityThread实例。ActivityThread作为应用程序进程的核心类,它是如何启动应用程序(Activity)的呢?我们接着往下看。 根据上文接着查看ApplicationThread的scheduleLaunchActivity方法,代码如下所示。 frameworks/base/core/java/android/app/ActivityThread.java

1 @Override 2 public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident, 3 ActivityInfo info, Configuration curConfig, Configuration overrideConfig, 4 CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor, 5 int procState, Bundle state, PersistableBundle persistentState, 6 List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents, 7 boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) { 8 updateProcessState(procState, false); 9 ActivityClientRecord r = new ActivityClientRecord(); 10 r.token = token; 11 r.ident = ident; 12 r.intent = intent; 13 r.referrer = referrer; 14 r.voiceInteractor = voiceInteractor; 15 r.activityInfo = info; 16 r.compatInfo = compatInfo; 17 r.state = state; 18 r.persistentState = persistentState; 19 r.pendingResults = pendingResults; 20 r.pendingIntents = pendingNewIntents; 21 r.startsNotResumed = notResumed; 22 r.isForward = isForward; 23 r.profilerInfo = profilerInfo; 24 r.overrideConfig = overrideConfig; 25 updatePendingConfiguration(curConfig); 26 sendMessage(H.LAUNCH_ACTIVITY, r); 27 }

scheduleLaunchActivity方法会将启动Activity的参数封装成ActivityClientRecord ,sendMessage方法向H类发送类型为LAUNCH_ACTIVITY的消息,并将ActivityClientRecord 传递过去,sendMessage方法的代码如下所示。 frameworks/base/core/java/android/app/ActivityThread.java

1 private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) { 2 ... 3 mH.sendMessage(msg); 4 }

这里mH指的是H,它是ActivityThread的内部类并继承Handler,H的代码如下所示。 frameworks/base/core/java/android/app/ActivityThread.java

1 private class H extends Handler { 2 public static final int LAUNCH_ACTIVITY = 100; 3 public static final int PAUSE_ACTIVITY = 101; 4 ... 5 public void handleMessage(Message msg) { 6 if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what)); 7 switch (msg.what) { 8 case LAUNCH_ACTIVITY: { 9 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart"); 10 final ActivityClientRecord r = (ActivityClientRecord) msg.obj;//1 11 r.packageInfo = getPackageInfoNoCheck( 12 r.activityInfo.applicationInfo, r.compatInfo);//2 13 handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");//3 14 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); 15 } break; 16 case RELAUNCH_ACTIVITY: { 17 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart"); 18 ActivityClientRecord r = (ActivityClientRecord)msg.obj; 19 handleRelaunchActivity(r); 20 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); 21 } break; 22 ... 23 }

查看H的handleMessage方法中对LAUNCH_ACTIVITY的处理,在注释1处将传过来的msg的成员变量obj转换为ActivityClientRecord。 在注释2处通过getPackageInfoNoCheck方法获得LoadedApk类型的对象并赋值给ActivityClientRecord 的成员变量packageInfo 。应用程序进程要启动Activity时需要将该Activity所属的APK加载进来,而LoadedApk就是用来描述已加载的APK文件。 在注释3处调用handleLaunchActivity方法,代码如下所示。 frameworks/base/core/java/android/app/ActivityThread.java

1 private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) { 2 ... 3 Activity a = performLaunchActivity(r, customIntent);//1 4 if (a != null) { 5 r.createdConfig = new Configuration(mConfiguration); 6 reportSizeConfigurations(r); 7 Bundle oldState = r.state; 8 handleResumeActivity(r.token, false, r.isForward, 9 !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);//2 10 11 if (!r.activity.mFinished && r.startsNotResumed) { 12 performPauseActivityIfNeeded(r, reason); 13 if (r.isPreHoneycomb()) { 14 r.state = oldState; 15 } 16 } 17 } else { 18 try { 19 ActivityManagerNative.getDefault() 20 .finishActivity(r.token, Activity.RESULT_CANCELED, null, 21 Activity.DONT_FINISH_TASK_WITH_ACTIVITY); 22 } catch (RemoteException ex) { 23 throw ex.rethrowFromSystemServer(); 24 } 25 } 26 }

注释1处的performLaunchActivity方法用来启动Activity ,注释2处的代码用来将Activity 的状态置为Resume。如果该Activity为null则会通知ActivityManager停止启动Activity。来查看performLaunchActivity方法做了什么: frameworks/base/core/java/android/app/ActivityThread.java

1 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { 2 ... 3 ActivityInfo aInfo = r.activityInfo;//1 4 if (r.packageInfo == null) { 5 r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo, 6 Context.CONTEXT_INCLUDE_CODE);//2 7 } 8 ComponentName component = r.intent.getComponent();//3 9 ... 10 Activity activity = null; 11 try { 12 java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); 13 activity = mInstrumentation.newActivity( 14 cl, component.getClassName(), r.intent);//4 15 ... 16 } 17 } catch (Exception e) { 18 ... 19 } 20 try { 21 Application app = r.packageInfo.makeApplication(false, mInstrumentation);//5 22 23 ... 24 if (activity != null) { 25 Context appContext = createBaseContextForActivity(r, activity);//6 26 ... 27 } 28 /** 29 *7 30 */ 31 activity.attach(appContext, this, getInstrumentation(), r.token, 32 r.ident, app, r.intent, r.activityInfo, title, r.parent, 33 r.embeddedID, r.lastNonConfigurationInstances, config, 34 r.referrer, r.voiceInteractor, window); 35 36 ... 37 if (r.isPersistable()) { 38 mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);//8 39 } else { 40 mInstrumentation.callActivityOnCreate(activity, r.state); 41 } 42 ... 43 } 44 return activity; 45}

注释1处用来获取ActivityInfo,在注释2处获取APK文件的描述类LoadedApk。注释3处获取要启动的Activity的ComponentName类,ComponentName类中保存了该Activity的包名和类名。注释4处根据ComponentName中存储的Activity类名,用类加载器来创建该Activity的实例。注释5处用来创建Application,makeApplication方法内部会调用Application的onCreate方法。注释6处用来创建要启动Activity的上下文环境。注释7处调用Activity的attach方法初始化Activity,attach方法中会创建Window对象(PhoneWindow)并与Activity自身进行关联。注释8处会调用Instrumentation的callActivityOnCreate方法来启动Activity: frameworks/base/core/java/android/app/Instrumentation.java

1 public void callActivityOnCreate(Activity activity, Bundle icicle, 2 PersistableBundle persistentState) { 3 prePerformCreate(activity); 4 activity.performCreate(icicle, persistentState);//1 5 postPerformCreate(activity); 6 }

注释1处调用了Activity的performCreate方法,代码如下所示。 frameworks/base/core/java/android/app/Activity.java

1 final void performCreate(Bundle icicle) { 2 restoreHasCurrentPermissionRequest(icicle); 3 onCreate(icicle); 4 mActivityTransitionState.readState(icicle); 5 performCreateCommon(); 6 }

performCreate方法中会调用Activity的onCreate方法,这样Activity就启动了,即应用程序就启动了。 应用程序启动过程就讲到这里,最后附上ActivityThread启动Activity的时序图。 Vek4A0.png

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Android解析ActivityManagerService(一)AMS启动流程和AMS家族

Android框架层Android系统服务ActivityManagerServiceAndroid框架层本文首发于微信公众号「刘望舒」前言此前在Android系统启动流程、应用进程以及深入四大组件这三个系列文章中,都提及到了AMS,但都没有系统的来讲解它,本文就以AMS为主来进行讲解,其中会有一些知识点与这些系列文章有所重合,这里会尽量做到详尽讲解

Android深入理解Context(二)Activity和Service的Context创建过程

Android框架层Android深入理解Contextcategories:Android框架层本文首发于微信公众号「刘望舒」前言上一篇文章我们学习了Context关联类和ApplicationContext的创建过程,这一篇我们接着来学习Activity和Service的Context创建过程。需要注意的是,本篇的知识点会和深入理解四大组件系列的

Android深入四大组件(七)Android8.0 根Activity启动过程(后篇)

Android框架层Android深入四大组件categories:Android框架层本文首发于微信公众号「刘望舒」前言在几个月前我写了和这两篇文章,它们都是基于Android7.0,当我开始阅读Android8.0源码时发现应用程序(根Activity)启动过程照Android7.0有了一些变化,因此又写下了本篇文章,本篇文章照此前的文章不仅

Android深入四大组件(一)应用程序启动过程(前篇)

Android框架层Android深入四大组件categories:Android框架层本文首发于微信公众号「后厂技术官」前言在此前的文章中,我讲过了Android系统启动流程和Android应用进程启动过程,这一篇顺理成章来学习Android7.0的应用程序的启动过程。分析应用程序的启动过程其实就是分析根Activity的启动过程。<!more1

Android深入四大组件(六)Android8.0 根Activity启动过程(前篇)

Android框架层Android深入四大组件categories:Android框架层本文首发于微信公众号「刘望舒」前言在几个月前我写了和这两篇文章,它们都是基于Android7.0,当我开始阅读Android8.0源码时发现应用程序(根Activity)启动过程照Android7.0有了一些变化,因此又写下了本篇文章,本篇文章照此前的文章不仅