diff options
| -rw-r--r-- | core/java/android/os/Process.java | 10 | ||||
| -rw-r--r-- | core/java/android/os/ZygoteProcess.java | 13 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 4 |
3 files changed, 22 insertions, 5 deletions
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 4eee8541f3bb..8cd4273ea99c 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -398,6 +398,9 @@ public class Process { * make easily identifyable processes even if you are using the same base * <var>processClass</var> to start them. * + * When invokeWith is not null, the process will be started as a fresh app + * and not a zygote fork. Note that this is only allowed for uid 0. + * * @param processClass The class to use as the process's main entry * point. * @param niceName A more readable name to use for the process. @@ -410,6 +413,7 @@ public class Process { * @param abi non-null the ABI this app should be started with. * @param instructionSet null-ok the instruction set to use. * @param appDataDir null-ok the data directory of the app. + * @param invokeWith null-ok the command to invoke with. * @param zygoteArgs Additional arguments to supply to the zygote process. * * @return An object that describes the result of the attempt to start the process. @@ -426,10 +430,11 @@ public class Process { String abi, String instructionSet, String appDataDir, + String invokeWith, String[] zygoteArgs) { return zygoteProcess.start(processClass, niceName, uid, gid, gids, debugFlags, mountExternal, targetSdkVersion, seInfo, - abi, instructionSet, appDataDir, zygoteArgs); + abi, instructionSet, appDataDir, invokeWith, zygoteArgs); } /** @hide */ @@ -442,10 +447,11 @@ public class Process { String abi, String instructionSet, String appDataDir, + String invokeWith, String[] zygoteArgs) { return WebViewZygote.getProcess().start(processClass, niceName, uid, gid, gids, debugFlags, mountExternal, targetSdkVersion, seInfo, - abi, instructionSet, appDataDir, zygoteArgs); + abi, instructionSet, appDataDir, invokeWith, zygoteArgs); } /** diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java index c45fe5a61852..cd8163ceccc2 100644 --- a/core/java/android/os/ZygoteProcess.java +++ b/core/java/android/os/ZygoteProcess.java @@ -170,6 +170,9 @@ public class ZygoteProcess { * make easily identifyable processes even if you are using the same base * <var>processClass</var> to start them. * + * When invokeWith is not null, the process will be started as a fresh app + * and not a zygote fork. Note that this is only allowed for uid 0. + * * @param processClass The class to use as the process's main entry * point. * @param niceName A more readable name to use for the process. @@ -182,6 +185,7 @@ public class ZygoteProcess { * @param abi non-null the ABI this app should be started with. * @param instructionSet null-ok the instruction set to use. * @param appDataDir null-ok the data directory of the app. + * @param invokeWith null-ok the command to invoke with. * @param zygoteArgs Additional arguments to supply to the zygote process. * * @return An object that describes the result of the attempt to start the process. @@ -196,11 +200,12 @@ public class ZygoteProcess { String abi, String instructionSet, String appDataDir, + String invokeWith, String[] zygoteArgs) { try { return startViaZygote(processClass, niceName, uid, gid, gids, debugFlags, mountExternal, targetSdkVersion, seInfo, - abi, instructionSet, appDataDir, zygoteArgs); + abi, instructionSet, appDataDir, invokeWith, zygoteArgs); } catch (ZygoteStartFailedEx ex) { Log.e(LOG_TAG, "Starting VM process through Zygote failed"); @@ -330,6 +335,7 @@ public class ZygoteProcess { String abi, String instructionSet, String appDataDir, + String invokeWith, String[] extraArgs) throws ZygoteStartFailedEx { ArrayList<String> argsForZygote = new ArrayList<String>(); @@ -407,6 +413,11 @@ public class ZygoteProcess { argsForZygote.add("--app-data-dir=" + appDataDir); } + if (invokeWith != null) { + argsForZygote.add("--invoke-with"); + argsForZygote.add(invokeWith); + } + argsForZygote.add(processClass); if (extraArgs != null) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5005f4aaf83f..c2c7b72f5e02 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3810,12 +3810,12 @@ public final class ActivityManagerService extends ActivityManagerNative startResult = Process.startWebView(entryPoint, app.processName, uid, uid, gids, debugFlags, mountExternal, app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet, - app.info.dataDir, entryPointArgs); + app.info.dataDir, null, entryPointArgs); } else { startResult = Process.start(entryPoint, app.processName, uid, uid, gids, debugFlags, mountExternal, app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet, - app.info.dataDir, entryPointArgs); + app.info.dataDir, null, entryPointArgs); } checkTime(startTime, "startProcess: returned from zygote!"); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); |