- Android框架层
- Android深入四大组件 categories:
- Android框架层
本文首发于微信公众号「后厂技术官」
前言
在此前的文章中,我讲过了Android系统启动流程和Android应用进程启动过程,这一篇顺理成章来学习Android 7.0的应用程序的启动过程。分析应用程序的启动过程其实就是分析根Activity的启动过程。
<!--more-->1.Launcher请求ActivityManageService
在 Android系统启动流程(四)Launcher启动过程与系统启动流程这篇文章我讲过Launcher启动后会将已安装应用程序的快捷图标显示到界面上,当我们点击应用程序的快捷图标时就会调用Launcher的startActivitySafely方法,如下所示。 packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
1 public boolean startActivitySafely(View v, Intent intent, Object tag) { 2 ... 3 try { 4 success = startActivity(v, intent, tag); 5 } catch (ActivityNotFoundException e) { 6 Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); 7 Log.e(TAG, "Unable to launch. tag=" + tag + " intent=" + intent, e); 8 } 9 return success; 10 }
startActivitySafely函数中主要就是调用了startActivity函数: packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
1 private boolean startActivity(View v, Intent intent, Object tag) { 2 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//1 3 try { 4 ... 5 if (user == null || user.equals(UserHandleCompat.myUserHandle())) { 6 StrictMode.VmPolicy oldPolicy = StrictMode.getVmPolicy(); 7 try { 8 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll() 9 .penaltyLog().build()); 10 startActivity(intent, optsBundle);//2 11 } finally { 12 StrictMode.setVmPolicy(oldPolicy); 13 } 14 } else { 15 launcherApps.startActivityForProfile(intent.getComponent(), user, 16 intent.getSourceBounds(), optsBundle); 17 } 18 return true; 19 } catch (SecurityException e) { 20 ... 21 } 22 return false; 23 }
在注释1处设置Flag为Intent.FLAG_ACTIVITY_NEW_TASK,这样根Activity会在新的任务栈中启动。在注释2处调用了startActivity函数: frameworks/base/core/java/android/app/Activity.java
1Override 2public void startActivity(Intent intent, @Nullable Bundle options) { 3 if (options != null) { 4 startActivityForResult(intent, -1, options); 5 } else { 6 startActivityForResult(intent, -1); 7 } 8}
startActivity会调用startActivityForResult函数,其中第二个参数为-1,表示Launcher不需要知道Activity启动的结果,startActivityForResult函数的代码如下所示。 frameworks/base/core/java/android/app/Activity.java
1 public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, 2 @Nullable Bundle options) { 3 if (mParent == null) { 4 Instrumentation.ActivityResult ar = 5 mInstrumentation.execStartActivity( 6 this, mMainThread.getApplicationThread(), mToken, this, 7 intent, requestCode, options); 8 ... 9 } else { 10 ... 11 } 12 }
mParent是Activity类型的,表示当前Activity的父类。因为目前根Activity还没有创建出来,因此,mParent == null成立。接着调用Instrumentation的execStartActivity方法,Instrumentation主要用来监控应用程序和系统的交互,execStartActivity方法的代码如下所示。 frameworks/base/core/java/android/app/Instrumentation.java
1public ActivityResult execStartActivity( 2 Context who, IBinder contextThread, IBinder token, Activity target, 3 Intent intent, int requestCode, Bundle options) { 4 ... 5 try { 6 intent.migrateExtraStreamToClipData(); 7 intent.prepareToLeaveProcess(who); 8 int result = ActivityManagerNative.getDefault() 9 .startActivity(whoThread, who.getBasePackageName(), intent, 10 intent.resolveTypeIfNeeded(who.getContentResolver()), 11 token, target != null ? target.mEmbeddedID : null, 12 requestCode, 0, null, options); 13 checkStartActivityResult(result, intent); 14 } catch (RemoteException e) { 15 throw new RuntimeException("Failure from system", e); 16 } 17 return null; 18 }
首先会调用ActivityManagerNative的getDefault来获取ActivityManageService(以后简称为AMS)的代理对象,接着调用它的startActivity方法。首先我们先来查看ActivityManagerNative的getDefault方法做了什么: frameworks/base/core/java/android/app/ActivityManagerNative.java
1 static public IActivityManager getDefault() { 2 return gDefault.get(); 3 } 4 5 private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() { 6 protected IActivityManager create() { 7 IBinder b = ServiceManager.getService("activity");//1 8 if (false) { 9 Log.v("ActivityManager", "default service binder = " + b); 10 } 11 IActivityManager am = asInterface(b);//2 12 if (false) { 13 Log.v("ActivityManager", "default service = " + am); 14 } 15 return am; 16 } 17 }; 18}
getDefault方法调用了gDefault的get方法,我们接着往下看,gDefault 是一个Singleton类。注释1处得到名为"activity"的Service引用,也就是IBinder类型的ActivityManagerService的引用。接着在注释2处将它封装成ActivityManagerProxy(以后简称为AMP)类型对象,并将它保存到gDefault中,此后调用ActivityManagerNative的getDefault方法就会直接获得AMS的代理AMP对象。 回到Instrumentation类的execStartActivity方法中,从上面得知就是调用AMP的startActivity,其中AMP是ActivityManagerNative的内部类,代码如下所示。 frameworks/base/core/java/android/app/ActivityManagerNative.java
1 public int startActivity(IApplicationThread caller, String callingPackage, Intent intent, 2 String resolvedType, IBinder resultTo, String resultWho, int requestCode, 3 int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException { 4 Parcel data = Parcel.obtain(); 5 Parcel reply = Parcel.obtain(); 6 data.writeInterfaceToken(IActivityManager.descriptor); 7 data.writeStrongBinder(caller != null ? caller.asBinder() : null); 8 data.writeString(callingPackage); 9 intent.writeToParcel(data, 0); 10 data.writeString(resolvedType); 11 data.writeStrongBinder(resultTo); 12 data.writeString(resultWho); 13 data.writeInt(requestCode); 14 data.writeInt(startFlags); 15 if (profilerInfo != null) { 16 data.writeInt(1); 17 profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 18 } else { 19 data.writeInt(0); 20 } 21 if (options != null) { 22 data.writeInt(1); 23 options.writeToParcel(data, 0); 24 } else { 25 data.writeInt(0); 26 } 27 mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);//1 28 reply.readException(); 29 int result = reply.readInt(); 30 reply.recycle(); 31 data.recycle(); 32 return result; 33 }
首先会将传入的参数写入到Parcel类型的data中。在注释1处通过IBinder类型对象mRemote向AMS发送一个START_ACTIVITY_TRANSACTION类型的进程间通信请求。那么服务端AMS就会从Binder线程池中读取我们客户端发来的数据,最终会调用ActivityManagerNative的onTransact方法中执行,如下所示。 frameworks/base/core/java/android/app/ActivityManagerNative.java
1 @Override 2 public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 3 throws RemoteException { 4 switch (code) { 5 case START_ACTIVITY_TRANSACTION: 6 { 7 ... 8 int result = startActivity(app, callingPackage, intent, resolvedType, 9 resultTo, resultWho, requestCode, startFlags, profilerInfo, options); 10 reply.writeNoException(); 11 reply.writeInt(result); 12 return true; 13 } 14 }
onTransact中会调用AMS的startActivity方法,如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
1 @Override 2 public final int startActivity(IApplicationThread caller, String callingPackage, 3 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, 4 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) { 5 return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo, 6 resultWho, requestCode, startFlags, profilerInfo, bOptions, 7 UserHandle.getCallingUserId()); 8 }
为了便于理解,给出Launcher到AMS调用过程的时序图。

