赞
踩
Android系统中,应用程序是由框架创建的。通过startAcitivty函数可以启动一个应用程序,那么,startActivity到底做了些什么,以至于这样一个简单的几行代码就能调用起一个应用程序。本节分析startActivity的执行流程。
当调用startActivity函数时,通过Android Binder机制, 调用到ActivityManagerService.再由ActivityManagerService去创建Java层的Process。
并且最终通过Zygote的fork去真正的创建出一个进程,当然,这个进程可以在adb终端使用ps命令列出来。
当点击一个桌面app图标时,会调用startActivityForResult,然后,会调用到Instrumentation.execStartActivity,并且最终调用到ActivityMangerService的startActivity中,整个流程如下:
这样,代码就进入到ActivityManagerService中了,如下图:
可见,ActivityStack对activity进行了管理。
在1.9startSpecificActivityLocked中,会判断app创建没有,如果创建了,就调用
realStartActivityLocked,
否则,就会调用startProcessLocked。
最关键的就是:
app.thread.scheduleLaunchActivity
方法的调用。这个app.thread类型是
IApplicationThread
所以,这里通过Binder调用到了ApplicationThreadNative的scheduleLaunchActivity,然后,又调用到了ActivityThread的“scheduleLaunchActivity”。
ActivityThread的scheduleLaunchActivity方法:
- queueOrSendMessage(H.LAUNCH_ACTIVITY, r); ->
-
- mH.sendMessage(msg);
-
- ->
-
- H.handleMessage()中,有:
-
- case LAUNCH_ACTIVITY: {
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
- ActivityClientRecord r = (ActivityClientRecord)msg.obj;
-
- r.packageInfo = getPackageInfoNoCheck(
- r.activityInfo.applicationInfo, r.compatInfo);
- handleLaunchActivity(r, null);
- Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
- }
-
-
handleLaunchActivity方法调用了
performLaunchActivity
,在这个方法中,创建了Activity(终于,Activity创建):
- //performLaunchActivity方法的实现:
- Activity activity = null;
- try {
- java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
- activity = mInstrumentation.newActivity(
- cl, component.getClassName(), r.intent);
- StrictMode.incrementExpectedActivityCount(activity.getClass());
- r.intent.setExtrasClassLoader(cl);
- if (r.state != null) {
- r.state.setClassLoader(cl);
- }
- }
-
- ......
-
- Application app = r.packageInfo.makeApplication
-
- ......
-
- activity.attach
-
- ......
-
- mInstrumentation.callActivityOnCreate(activity, r.state);
-
这样,通过mInstrumentation 创建了Activity,并且执行attach后,再执行
callActivityOnCreate
就进入到Activity的OnCreate生命周期了。
在执行到startProcessLocked时,代码由ActivityStack进入到ActivityManagerService中,继续执行,如下图:
在Process.java中,有
- argsForZygote.add("--runtime-init");
- argsForZygote.add("--setuid=" + uid);
- argsForZygote.add("--setgid=" + gid);
-
- ......
-
- zygoteSendArgsAndGetResult(argsForZygote)
openZygoteSocketIfNeeded函数的实现:
- try {
- sZygoteSocket = new LocalSocket();
-
- sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET,
- LocalSocketAddress.Namespace.RESERVED));
-
- sZygoteInputStream
- = new DataInputStream(sZygoteSocket.getInputStream());
-
- sZygoteWriter =
- new BufferedWriter(
- new OutputStreamWriter(
- sZygoteSocket.getOutputStream()),
- 256);
-
- Log.i("Zygote", "Process: zygote socket opened");
-
- sPreviousZygoteOpenFailed = false;
- break;
- } catch (IOException ex) {
- ......
- }
分析:
创建一个LocalSocket sZygoteSocket,作为client通过调用sZygoteSocket.connect 去连接socket,而作为服务端的socket,就是在Zygote初始化时在runSelectLoop中进行监听的套接字,然后,在Zygote中去真正地用fork创建进程。
参见:
Android系统的心脏-Zygote进程如何fork一个新的应用进程
这样,进程就创建好了。
进程创建好之后,代码回到Process.java中,继续执行。保存进程状态,然后,去创建ActivityThread。(在Process.start时,就将ActivityThread这个类名传递过来了)。
我们继续分析Application的创建过程(即“分支二:startProcessLocked的执行”的继续执行)
在ActivityThread的main函数中,主要功能:
1)创建Thread;并调用attach方法;
2)进行Application的attach;
3)进行Handler的创建和message的处理;
4)AsyncTask的初始化。
直接看ActivityThread中的main函数:
- public static void main(String[] args) {
-
- ......
-
- Looper.prepareMainLooper();
-
- if (sMainThreadHandler == null) {
- sMainThreadHandler = new Handler();
- }
-
- ActivityThread thread = new ActivityThread();
- thread.attach(false);
-
- AsyncTask.init();
-
- if (false) {
- Looper.myLooper().setMessageLogging(new
- LogPrinter(Log.DEBUG, "ActivityThread"));
- }
-
- Looper.loop();
-
- throw new RuntimeException("Main thread loop unexpectedly exited");
- }
thread.attach()的实现:
- IActivityManager mgr = ActivityManagerNative.getDefault();
- mgr.attachApplication(mAppThread);
1) 从Client端到Server端:
注意,这里的mgr是ActiivtyManagerProxy的实例,而ActiivtyManagerProxy是Binder机制中的Client端,是服务端AMS(ActivityManagerService)的代理。
再通过Binder IPC机制调用到AMS的对应的方法中,调用序列如下:
1. client端:
ActivityManagerNative.getDefault://获取ActivityManagerProxy
ActivityManagerProxy.attachApplication -> mRemote.transact, 如下:
public void attachApplication(IApplicationThread app) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(app.asBinder()); mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); }这样,通过Binder机制就执行到了ActivityManagerService中了。
2. server端:
在ActivityManagerNative中,有对ATTACH_APPLICATION_TRANSACTION的处理(这时,已经是在Service执行这个case了):
case ATTACH_APPLICATION_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IApplicationThread app = ApplicationThreadNative.asInterface( data.readStrongBinder()); if (app != null) { attachApplication(app); } reply.writeNoException(); return true; }而这里的attachApplication方法就在ActivityManagerService中有实现,代码如下:
public final void attachApplication(IApplicationThread thread) { synchronized (this) { int callingPid = Binder.getCallingPid(); final long origId = Binder.clearCallingIdentity(); attachApplicationLocked(thread, callingPid); Binder.restoreCallingIdentity(origId); } }调用到server端:ActivityManagerNative ->ActivityManagerService。
继续AMS的attachApplication的分析,就执行到AMS中的对应的
attachApplicationLocked
方法中了,这个方法非常重要,接下来分析一下。
2)AMS中attachApplicationLocked方法的分析:
在attachApplicationLocked方法中,关键调用了下面这个方法:
即
thread.bindApplication(processName, appInfo, providers,...)//省略若干参数
说明:
这里的thread是IApplicationThread类型,而且thread是Client端,真正类型是ApplicationThreadProxy,即服务端的代理。而这个ApplicationThreadProxy是在ApplicationThreadNative中定义的。
所以,我们来分析ApplicationThreadProxy的bindApplication方法的实现。
继续分析,ApplicationThreadProxy的bindApplication方法的实现:
- public final void bindApplication(String packageName, ApplicationInfo info,
- ......) throws RemoteException {
-
- Parcel data = Parcel.obtain();
- data.writeInterfaceToken(IApplicationThread.descriptor);
- data.writeString(packageName);
- info.writeToParcel(data, 0);
-
- ...... //都是data.write方法
-
-
- mRemote.transact(BIND_APPLICATION_TRANSACTION, data, null,
- IBinder.FLAG_ONEWAY);
- data.recycle();
- }
mRemote.transact最终调用到ApplicationThreadNative中,即Service端。
3)服务端对BIND_APPLICATION_TRANSACTION的处理:
mRemote是IBinder类型,而真正的实例是ActivityThread。
原因如下:
ApplicationThreadNative是抽象类,无法实例化;
ActivityThread是继承自ApplicationThreadNative的具体类;
所以,mRemote其实是ActivityThread的实例。
然后,就是BIND_APPLICATION_TRANSACTION的处理:
mRemote.transact通过binder机制,调用到ApplicationThreadNative中去处理。
代码如下:
- case BIND_APPLICATION_TRANSACTION:
- {
- data.enforceInterface(IApplicationThread.descriptor);
- String packageName = data.readString();
- ApplicationInfo info =
- ApplicationInfo.CREATOR.createFromParcel(data);
-
- ......
-
- bindApplication(packageName, info,
- providers, testName, profileName, profileFd, autoStopProfiler,
- testArgs, testWatcher, testMode, openGlTrace, restrictedBackupMode,
- persistent, config, compatInfo, services, coreSettings);
- return true;
- }
这里的bindApplication是在ApplicationThread中实现的。前面已经分析过,ApplicationThread是ApplicationThreadNative的子类。所以在ApplicationThreadNative中的代码调用,其实就是ApplicationThread的代码的执行。
4)ApplicationThread的bindApplication方法:
在ApplicationThread的bindApplication方法中,最后一条语句
queueOrSendMessage(H.BIND_APPLICATION, data);
发送了message,在H 这个handler类中,对message的处理如下:
- case BIND_APPLICATION:
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
- AppBindData data = (AppBindData)msg.obj;
- handleBindApplication(data);
- Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
- break;
接着,我们看
handleBindApplication
5) handleBindApplication的分析:
好像看到一些曙光了。再次说明一下,我们分析这部分代码的目的是:为了分析清楚一个App是如何被创建和初始化的。也就是说,Application的onCreate函数是如何被执行的。
在handleBindApplication中,关键点如下:
1. mInstrumentation的创建;
mInstrumentation = new Instrumentation(); //如果已经创建,就不需要new了
2. Application的创建;
Application app = data.info.makeApplication(data.restrictedBackupMode, null);
3. 通过mInstrumentation的
callApplicationOnCreate来启动App:
mInstrumentation.callApplicationOnCreate(app);
Instrumentation.callApplicationOnCreate的实现:
到了这里,只需要一句代码即可:
- public void callApplicationOnCreate(Application app) {
- app.onCreate();
- }
这样,就调用到了app的onCreate()方法了。
至此,整个分析流程结束。
1. 一系列的startActivity的调用;
2. AMS(ActivityManagerService)相关的关键组件:
ActivityManager //可以认为是对ActivityManagerProxy的封装
ActivityManagerProxy //作为客户端;
ActivityManagerNative //抽象类,无法实例化;
ActivityManagerService //继承自ActivityManagerNative,具体类,作为服务端;
3. ApplicationThread相关的关键的组件:
ApplicationThreadProxy //作为客户端;
ApplicationThreadNative //抽象类,无法实例化;
ApplicationThread //继承自ApplicationThreadNative,具体类,作为服务端;
4. Instrumentation //Activity和Application的启动,都要由它来触发。
可见,从binder的角度来看,AMS和ApplicationThread的组件架构几乎一样。这是Android系统服务中典型的服务实现方式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。