- A+
四个函数
final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting, boolean isolated, boolean keepIfLarge) { return startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingType, hostingName, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge, null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */, null /* crashHandler */); }
final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge, String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) {
private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr) { startProcessLocked(app, hostingType, hostingNameStr, null /* abiOverride */, null /* entryPoint */, null /* entryPointArgs */); }
private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
我们把四个startProcessLocked函数放在一块,前面两种调用的参数比较多,最后通过转换呢,都会转换到最后一个函数的形式。
我们来看下参数的意思:
ProcessRecord app : 要启动的app的统一信息,一些uid啊等等都在里面
String hostingType : 启动的一些标签比如后台启动什么的...
String hostingNameStr : 启动的标记比如会标记 brocast启动等待
String entryPoint : 进程启动的进入点,一般是ActivityThread的main函数
String[] entryPointArgs : 启动参数。
最后我们来具体分析下这个函数。
private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) { if (DEBUG_PROCESSES && mProcessesOnHold.contains(app)) Slog.v(TAG_PROCESSES, "startProcessLocked removing on hold: " + app); mProcessesOnHold.remove(app); updateCpuStats(); ... 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) { } if (mFactoryTest != FactoryTest.FACTORY_TEST_OFF) { if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL && mTopComponent != null && app.processName.equals(mTopComponent.getPackageName())) { uid = 0; } if (mFactoryTest == FactoryTest.FACTORY_TEST_HIGH_LEVEL && (app.info.flags&ApplicationInfo.FLAG_FACTORY_TEST) != 0) { uid = 0; } } app.gids = gids; app.requiredAbi = requiredAbi; app.instructionSet = instructionSet; if (entryPoint == null) entryPoint = "android.app.ActivityThread"; Process.ProcessStartResult startResult = Process.start(entryPoint, app.processName, uid, uid, gids, debugFlags, mountExternal, app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet, app.info.dataDir, entryPointArgs); app.setPid(startResult.pid); app.usingWrapper = startResult.usingWrapper; app.removed = false; app.killed = false; app.killedByAm = false; checkTime(startTime, "startProcess: starting to update pids map"); ProcessRecord oldApp; synchronized (mPidsSelfLocked) { oldApp = mPidsSelfLocked.get(startResult.pid); } if (oldApp != null && !app.isolated) { cleanUpApplicationRecordLocked(oldApp, false, false, -1, true /*replacingPid*/); } synchronized (mPidsSelfLocked) { this.mPidsSelfLocked.put(startResult.pid, app); } checkTime(startTime, "startProcess: done updating pids map"); } catch (RuntimeException e) { forceStopPackageLocked(app.info.packageName, UserHandle.getAppId(app.uid), false, false, true, false, false, UserHandle.getUserId(app.userId), "start failure"); } }
其实一整段函数最重要的是这个Process.start
Process.ProcessStartResult startResult = Process.start(entryPoint, app.processName, uid, uid, gids, debugFlags, mountExternal, app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet, app.info.dataDir, entryPointArgs);
在这个Process.start
之前它指定了,entryPoint = "android.app.ActivityThread"
之后是进程已经起来了对 app的一些信息的设置,比如pid
再之后是进行一些错误的检查。
OK,下文进行Process.start分析......
Android app启动流程:调用startProcessLocked的几种情况(1)
Android app启动流程:startProcessLocked函数分析(2)
Android app启动流程:Process.start(3)
Android app启动流程:startservice(4)
Android app启动流程:broadcast广播的注册(5)
Android app启动流程:广播的发送broadcastIntentLocked(6)
Android app启动流程:广播的发送scheduleBroadcastsLocked(7)
Android app启动流程:广播的发送processNextBroadcast(8)
Android app启动流程:关于FocusedStack的研究(9)
Android app启动流程:startActivityMayWait分析(10)
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏