Android系统在新进程中启动自定义服务过程(startService)的原理分析 联系客服

发布时间 : 星期六 文章Android系统在新进程中启动自定义服务过程(startService)的原理分析更新完毕开始阅读

???

??? } catch (RuntimeException e) { ???

??? ...... ???

??? } ??? ??? } ???

??? ...... ??? ??? }

这里调用Process.start函数创建了一个新的进程,指定新的进程执行android.app.ActivityThread类。最后将表示这个新进程的ProcessRecord保存在mPidSelfLocked列表中,后面会用到。

Step 5. Process.start

这个函数定义在frameworks/base/core/java/android/os/Process.java文件中,这个函数我们就不看了,有兴趣的读者可以自己研究一下。在这个场景中,它就是新建一个进程,然后导入android.app.ActivityThread这个类,然后执行它的main函数。 Step 6. ActivityThread.main

这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

view plain

??? public final class ActivityThread { ??? ??? ...... ???

??? public static final void main(String[] args) { ???

??? ...... ???

??? Looper.prepareMainLooper(); ???

??? ...... ???

??? ActivityThread thread = new ActivityThread();

??? thread.attach(false); ???

??? ...... ???

??? Looper.loop(); ???

??? ...... ???

??? thread.detach(); ???

??? ...... ??? } ??? }

注意,执行到这里的时候,已经是在上一步创建的新进程里面了,即这里的进程是用来启动服务的,原来的主进程已经完成了它的命令,返回了。

前面我们提到,在Android应用程序中,每一个进程对应一个ActivityThread实例,所以,这个函数会创建一个thread实例,然后调用ActivityThread.attach函数进一步处理。 Step 7. ActivityThread.attach

这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

view plain

??? public final class ActivityThread { ??? ??? ...... ???

??? private final void attach(boolean system) { ??? ??? ...... ???

??? if (!system) { ???

??? ...... ???

??? IActivityManager mgr = ActivityManagerNative.getDefault(); ??? try {

??? mgr.attachApplication(mAppThread); ??? } catch (RemoteException ex) { ??? }

??? } else { ???

??? ...... ???

??? } ???

??? ...... ??? ??? } ???

??? ...... ??? ??? }

从Step 6中,这里传进来的参数system为false。成员变量mAppThread是一个ApplicationThread实例,我们在前面已经描述过这个实例的作用,它是用来辅助ActivityThread来执行一些操作的。

调用ActivityManagerNative.getDefault函数得到ActivityManagerService的远程接口,即ActivityManagerProxy,接着调用它的attachApplication函数。 Step 8. ActivityManagerProxy.attachApplication 这

frameworks/base/core/java/android/app/ActivityManagerNative.java文件中:

view plain

??? class ActivityManagerProxy implements IActivityManager ??? {

??? ...... ???

??? public ??? {

??? 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(); ??? }

void

attachApplication(IApplicationThread

app)

throws

RemoteException

???

??? ...... ??? ??? }

这个函数主要是将新进程里面的IApplicationThread实例通过Binder驱动程序传递给ActivityManagerService。

Step 9. ActivityManagerService.attachApplication 这文件中:

view plain

个函数定义在

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

??? public final class ActivityManagerService extends ActivityManagerNative ??? implements BatteryStatsImpl.BatteryCallback { ??? ??? ...... ???

??? public final void attachApplication(IApplicationThread thread) ??? {

??? synchronized (this) {

??? int callingPid = Binder.getCallingPid();

??? final long origId = Binder.clearCallingIdentity(); ??? attachApplicationLocked(thread, callingPid); ??? Binder.restoreCallingIdentity(origId); ??? } ??? } ??? ??? ...... ??? ??? }

Watchdog.Monitor,

这里通过调用attachApplicationLocked函数进一步处理。

Step 10. ActivityManagerService.attachApplicationLocked 这

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