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

Step 10. ActivityManagerService.attachApplicationLocked

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

 

public final class ActivityManagerService extends ActivityManagerNative                           implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {          ......          private final boolean attachApplicationLocked(IApplicationThread thread,               int pid) {           // Find the application record that is being attached...  either via            // the pid if we are running in multiple processes, or just pull the            // next app record if we are emulating process with anonymous threads.            ProcessRecord app;           if (pid != MY_PID && pid >= 0) {               synchronized (mPidsSelfLocked) {                   app = mPidsSelfLocked.get(pid);               }           } else if (mStartingProcesses.size() > 0) {               app = mStartingProcesses.remove(0);               app.setPid(pid);           } else {               app = null;           }              ......                 String processName = app.processName;                      ......              app.thread = thread;              ......                      boolean badApp = false;              ......              // Find any services that should be running in this process...            if (!badApp && mPendingServices.size() > 0) {               ServiceRecord sr = null;               try {                   for (int i=0; i<mPendingServices.size(); i++) {                       sr = mPendingServices.get(i);                       if (app.info.uid != sr.appInfo.uid                           || !processName.equals(sr.processName)) {                               continue;                       }                          mPendingServices.remove(i);                       i--;                       realStartServiceLocked(sr, app);                       didSomething = true;                   }               } catch (Exception e) {                      ......                  }           }              ......              return true;       }          ......      }  

        回忆一下在上面的Step 4中,以新进程的pid值作为key值保存了一个ProcessRecord在mPidsSelfLocked列表中,这里先把它取出来,存放在本地变量app中,并且将app.processName保存在本地变量processName中。

再回忆一下在上面的Step 3中,在成员变量mPendingServices中,保存了一个ServiceRecord,这里通过进程uid和进程名称将它找出来,然后通过realStartServiceLocked函数来进一步处理。

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

 

class ActivityManagerProxy implements IActivityManager   {       ......          private final void realStartServiceLocked(ServiceRecord r,               ProcessRecord app) throws RemoteException {                      ......              r.app = app;                      ......              try {                  ......                          app.thread.scheduleCreateService(r, r.serviceInfo);                              ......              } finally {                  ......              }              ......          }          ......      }  

这里的app.thread是一个ApplicationThread对象的远程接口,它是在上面的Step 6创建ActivityThread对象时作为ActivityThread对象的成员变量同时创建的,然后在Step 9中传过来的。然后调用这个远程接口的scheduleCreateService函数回到原来的ActivityThread对象中执行启动服务的操作。  

linux

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

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