0
点赞
收藏
分享

微信扫一扫

App进程的启动过程

无聊到学习 2024-10-14 阅读 19

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
/frameworks/base/services/core/java/com/android/server/am/ProcessList.java
/frameworks/base/core/java/android/os/Process.java
/frameworks/base/core/java/android/os/ZygoteProcess.java
/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
/frameworks/base/core/java/com/android/internal/os/ZygoteServer.java
/frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java
/frameworks/base/core/java/com/android/internal/os/Zygote.java
/frameworks/base/core/java/android/app/ActivityThread.java
/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
/frameworks/base/core/java/android/app/Instrumentation.java
/frameworks/base/core/java/android/app/LoadedApk.java

进程的启动过程

在四大组件:Activity、Service、ContentProvider、BroadcastReceiver,启动过程中,如果其承载的进程不存在,则会调用AMS.startProcessLocked方法创建进程。

App进程的启动过程_android

1. AMS向Zygote请求创建进程

AMS.startProcessLocked

调用startProcessLocked()方法开始启动进程

final ProcessList mProcessList;

  final ProcessRecord startProcessLocked(String processName,
                                         ApplicationInfo info, boolean knownToBeDead, int intentFlags,
                                         HostingRecord hostingRecord, int zygotePolicyFlags, boolean allowWhileBooting,
                                         boolean isolated, boolean keepIfLarge) {
      // 将其请求创建进程逻辑交给ProcessList类处理
      return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
              hostingRecord, zygotePolicyFlags, allowWhileBooting, isolated, 0 /* isolatedUid */,
              keepIfLarge, null /* ABI override */, null /* entryPoint */,
              null /* entryPointArgs */, null /* crashHandler */);
  }

ActivityManagerService服务的startProcessLocked方法通过调用ProcessList.startProcessLocked方法,接下来看看ProcessList如何处理:

ProcessList.startProcessLocked

public final class ProcessList {

  @GuardedBy("mService")
  final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
                                         boolean knownToBeDead, int intentFlags, HostingRecord hostingRecord,
                                         int zygotePolicyFlags, boolean allowWhileBooting, boolean isolated, int isolatedUid,
                                         boolean keepIfLarge, String abiOverride, String entryPoint, String[] entryPointArgs,
                                         Runnable crashHandler) {
      long startTime = SystemClock.uptimeMillis();
      ProcessRecord app;
      if (!isolated) {
          //根据进程名和uid检查相应的ProcessRecord
          app = getProcessRecordLocked(processName, info.uid, keepIfLarge);
          if ((intentFlags & Intent.FLAG_FROM_BACKGROUND) != 0) {
              //如果当前处于后台进程,检查当前进程是否处于bad进程列表,如果处于返回null
              if (mService.mAppErrors.isBadProcessLocked(info)) {
                  if (DEBUG_PROCESSES) Slog.v(TAG, "Bad process: " + info.uid
                          + "/" + info.processName);
                  return null;
              }
          } else {
              //当用户明确地启动进程,则清空crash次数,以保证其不处于bad进程直到下次再弹出crash对话框。
              mService.mAppErrors.resetProcessCrashTimeLocked(info);
              if (mService.mAppErrors.isBadProcessLocked(info)) {
                  EventLog.writeEvent(EventLogTags.AM_PROC_GOOD,
                          UserHandle.getUserId(info.uid), info.uid,
                          info.processName);
                  mService.mAppErrors.clearBadProcessLocked(info);
                  if (app != null) {
                      app.bad = false;
                  }
              }
          }
      } else {
          //对于孤立进程,无法再利用已存在的进程
          app = null;
      }

      ProcessRecord precedence = null;
      //当存在ProcessRecord,且已分配pid(正在启动或者已经启动)
      if (app != null && app.pid > 0) {
          // 且caller并不认为该进程已死亡或者没有thread对象attached到该进程.则不应该清理该进程
          if ((!knownToBeDead && !app.killed) || app.thread == null) {
              //如果这是进程中新package,则添加到列表
              app.addPackage(info.packageName, info.longVersionCode, mService.mProcessStats);
              // 返回该ProcessRecord
              return app;
          }

          // 当ProcessRecord已经被attached到先前的一个进程,则杀死并清理该进程,并将app = null
          ProcessList.killProcessGroup(app.uid, app.pid);
          precedence = app;
          app = null;
      }

      if (app == null) {
          // 创建新的Process Record对象
          app = newProcessRecordLocked(info, processName, isolated, isolatedUid, hostingRecord);
          if (app == null) {
              return null;
          }
          app.crashHandler = crashHandler;
          app.isolatedEntryPoint = entryPoint;
          app.isolatedEntryPointArgs = entryPointArgs;
          if (precedence != null) {
              app.mPrecedence = precedence;
              precedence.mSuccessor = app;
          }
          checkSlow(startTime, "startProcess: done creating new process record");
      } else {
          // 如果这是进程中新package,则添加到列表
          app.addPackage(info.packageName, info.longVersionCode, mService.mProcessStats);
      }

      //当系统未准备完毕,则将当前进程加入到mProcessesOnHold
      if (!mService.mProcessesReady
              && !mService.isAllowedWhileBooting(info)
              && !allowWhileBooting) {
          if (!mService.mProcessesOnHold.contains(app)) {
              mService.mProcessesOnHold.add(app);
          }
          return app;
      }

      // 启动进程
      final boolean success =
              startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride);
      return success ? app : null;
  }

  @GuardedBy("mService")
  final boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,
                                   int zygotePolicyFlags, String abiOverride) {
      return startProcessLocked(app, hostingRecord, zygotePolicyFlags,
              false /* disableHiddenApiChecks */, false /* disableTestApiChecks */,
              false /* mountExtStorageFull */, abiOverride);
  }


  @GuardedBy("mService")
  boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord,
                             int zygotePolicyFlags, boolean disableHiddenApiChecks, boolean disableTestApiChecks,
                             boolean mountExtStorageFull, String abiOverride) {
      if (app.pendingStart) {
          return true;
      }
      long startTime = SystemClock.uptimeMillis();
      //当app的pid大于0且不是当前进程的pid,则从mPidsSelfLocked中移除该app.pid
      if (app.pid > 0 && app.pid != ActivityManagerService.MY_PID) {
          mService.removePidLocked(app);
          app.bindMountPending = false;
          mService.mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);
          app.setPid(0);
          app.startSeq = 0;
      }

      //从mProcessesOnHold移除该app
      mService.mProcessesOnHold.remove(app);
      //更新cpu统计信息
      mService.updateCpuStats();

      //当前package已被冻结,则抛出异常
      try {
          try {
              final int userId = UserHandle.getUserId(app.uid);
              AppGlobals.getPackageManager().checkPackageStartable(app.info.packageName, userId);
          } catch (RemoteException e) {
              throw e.rethrowAsRuntimeException();
          }

          int uid = app.uid;
          int[] gids = null;
          int mountExternal = Zygote.MOUNT_EXTERNAL_NONE;

          if (!app.isolated) {
              int[] permGids = null;
              try {
                  //通过Package Manager获取gids
                  final IPackageManager pm = AppGlobals.getPackageManager();
                  permGids = pm.getPackageGids(app.info.packageName,
                          MATCH_DIRECT_BOOT_AUTO, app.userId);
                  if (StorageManager.hasIsolatedStorage() && mountExtStorageFull) {
                      mountExternal = Zygote.MOUNT_EXTERNAL_FULL;
                  } else {
                      StorageManagerInternal storageManagerInternal = LocalServices.getService(
                              StorageManagerInternal.class);
                      mountExternal = storageManagerInternal.getExternalStorageMountMode(uid,
                              app.info.packageName);
                  }
              } catch (RemoteException e) {
                  throw e.rethrowAsRuntimeException();
              }

              //添加共享app和gids,用于app直接共享资源
              if (app.processInfo != null && app.processInfo.deniedPermissions != null) {
                  for (int i = app.processInfo.deniedPermissions.size() - 1; i >= 0; i--) {
                      int[] denyGids = mService.mPackageManagerInt.getPermissionGids(
                              app.processInfo.deniedPermissions.valueAt(i), app.userId);
                      if (denyGids != null) {
                          for (int gid : denyGids) {
                              permGids = ArrayUtils.removeInt(permGids, gid);
                          }
                      }
                  }
              }

              gids = computeGidsForProcess(mountExternal, uid, permGids);
          }
          //....
          // 设置app ProcessRecord的参数
          app.gids = gids;
          app.setRequiredAbi(requiredAbi);
          app.instructionSet = instructionSet;

          // entryPoint 为 android.app.ActivityThread
          final String entryPoint = "android.app.ActivityThread";

          // 调用startProcessLocked方法,继续请求Zygote创建新进程
          return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,
                  runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,
                  instructionSet, invokeWith, startTime);
      } catch (RuntimeException e) {
          //...
          return false;
      }
  }

  @GuardedBy("mService")
  boolean startProcessLocked(HostingRecord hostingRecord, String entryPoint, ProcessRecord app,
                             int uid, int[] gids, int runtimeFlags, int zygotePolicyFlags, int mountExternal,
                             String seInfo, String requiredAbi, String instructionSet, String invokeWith,
                             long startTime) {
      // 最终都会调用startProcess()方法,调用Zygote进程创建进程
      final Process.ProcessStartResult startResult = startProcess(hostingRecord,
              entryPoint, app,
              uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo,
              requiredAbi, instructionSet, invokeWith, startTime);
  }

  private Process.ProcessStartResult startProcess(HostingRecord hostingRecord, String entryPoint,
                                                  ProcessRecord app, int uid, int[] gids, int runtimeFlags, int zygotePolicyFlags,
                                                  int mountExternal, String seInfo, String requiredAbi, String instructionSet,
                                                  String invokeWith, long startTime) {
      try {
          //...
          // 通过Process.start通知Zygote进程创建进程
          startResult = Process.start(entryPoint,
                  app.processName, uid, uid, gids, runtimeFlags, mountExternal,
                  app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
                  app.info.dataDir, invokeWith, app.info.packageName, zygotePolicyFlags,
                  isTopApp, app.mDisabledCompatChanges, pkgDataInfoMap,
                  whitelistedAppDataInfoMap, bindMountAppsData, bindMountAppStorageDirs,
                  new String[]{PROC_START_SEQ_IDENT + app.startSeq});
          return startResult;
      } finally {
          Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
      }
  }
}




举报

相关推荐

0 条评论