当前位置:首页 > 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
共分享92篇相关文档