Android系统在新进程中启动自定义服务过程(sta(5)

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文件中:

 

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文件中:

 

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文件中:

 

class ActivityManagerProxy implements IActivityManager   {       ......          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();       }          ......      }  

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

Step 9. ActivityManagerService.attachApplication

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

 

public final class ActivityManagerService extends ActivityManagerNative                               implements Watchdog.Monitor, 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);           }       }              ......      }  

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

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwddpy.html