| Index: content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
|
| diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
|
| index c88a5d63d1e21c31ff372354280c2588f7d7071e..0ee4f4df97633478620c4ec41cd824607ce5f0c4 100644
|
| --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
|
| +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
|
| @@ -11,18 +11,13 @@ import android.os.IBinder;
|
| import android.os.RemoteException;
|
| import android.text.TextUtils;
|
|
|
| -import org.chromium.base.CpuFeatures;
|
| import org.chromium.base.Log;
|
| import org.chromium.base.ThreadUtils;
|
| import org.chromium.base.TraceEvent;
|
| import org.chromium.base.VisibleForTesting;
|
| import org.chromium.base.annotations.SuppressFBWarnings;
|
| -import org.chromium.base.library_loader.Linker;
|
| import org.chromium.base.process_launcher.ChildProcessCreationParams;
|
| -import org.chromium.base.process_launcher.FileDescriptorInfo;
|
| -import org.chromium.content.app.ChromiumLinkerParams;
|
| import org.chromium.content.app.SandboxedProcessService;
|
| -import org.chromium.content.common.ContentSwitches;
|
|
|
| import java.util.HashMap;
|
| import java.util.Map;
|
| @@ -113,8 +108,7 @@ public class ChildProcessLauncher {
|
| }
|
|
|
| @VisibleForTesting
|
| - static ChildProcessConnection allocateConnection(
|
| - ChildSpawnData spawnData, Bundle childProcessCommonParams, boolean forWarmUp) {
|
| + static ChildProcessConnection allocateConnection(ChildSpawnData spawnData, boolean forWarmUp) {
|
| assert LauncherThread.runningOnLauncherThread();
|
| ChildProcessConnection.DeathCallback deathCallback =
|
| new ChildProcessConnection.DeathCallback() {
|
| @@ -136,51 +130,11 @@ public class ChildProcessLauncher {
|
| ChildConnectionAllocator allocator =
|
| getConnectionAllocator(context, packageName, inSandbox);
|
| ChildProcessConnection connection =
|
| - allocator.allocate(spawnData, deathCallback, childProcessCommonParams, !forWarmUp);
|
| + allocator.allocate(spawnData, deathCallback, !forWarmUp);
|
| sConnectionsToAllocatorMap.put(connection, allocator);
|
| return connection;
|
| }
|
|
|
| - private static boolean sLinkerInitialized;
|
| - private static long sLinkerLoadAddress;
|
| -
|
| - private static ChromiumLinkerParams getLinkerParamsForNewConnection() {
|
| - if (!sLinkerInitialized) {
|
| - if (Linker.isUsed()) {
|
| - sLinkerLoadAddress = Linker.getInstance().getBaseLoadAddress();
|
| - if (sLinkerLoadAddress == 0) {
|
| - Log.i(TAG, "Shared RELRO support disabled!");
|
| - }
|
| - }
|
| - sLinkerInitialized = true;
|
| - }
|
| -
|
| - if (sLinkerLoadAddress == 0) return null;
|
| -
|
| - // Always wait for the shared RELROs in service processes.
|
| - final boolean waitForSharedRelros = true;
|
| - if (Linker.areTestsEnabled()) {
|
| - Linker linker = Linker.getInstance();
|
| - return new ChromiumLinkerParams(sLinkerLoadAddress,
|
| - waitForSharedRelros,
|
| - linker.getTestRunnerClassNameForTesting(),
|
| - linker.getImplementationForTesting());
|
| - } else {
|
| - return new ChromiumLinkerParams(sLinkerLoadAddress,
|
| - waitForSharedRelros);
|
| - }
|
| - }
|
| -
|
| - @VisibleForTesting
|
| - static Bundle createCommonParamsBundle(ChildProcessCreationParams params) {
|
| - Bundle commonParams = new Bundle();
|
| - commonParams.putParcelable(
|
| - ChildProcessConstants.EXTRA_LINKER_PARAMS, getLinkerParamsForNewConnection());
|
| - final boolean bindToCallerCheck = params == null ? false : params.getBindToCallerCheck();
|
| - commonParams.putBoolean(ChildProcessConstants.EXTRA_BIND_TO_CALLER, bindToCallerCheck);
|
| - return commonParams;
|
| - }
|
| -
|
| @VisibleForTesting
|
| static ChildProcessConnection allocateBoundConnection(ChildSpawnData spawnData,
|
| ChildProcessConnection.StartCallback startCallback, boolean forWarmUp) {
|
| @@ -189,8 +143,7 @@ public class ChildProcessLauncher {
|
| final boolean inSandbox = spawnData.isInSandbox();
|
| final ChildProcessCreationParams creationParams = spawnData.getCreationParams();
|
|
|
| - ChildProcessConnection connection = allocateConnection(
|
| - spawnData, createCommonParamsBundle(spawnData.getCreationParams()), forWarmUp);
|
| + ChildProcessConnection connection = allocateConnection(spawnData, forWarmUp);
|
| if (connection != null) {
|
| // Non sandboxed processes are privileged processes that should be strongly bound.
|
| boolean useStrongBinding = !inSandbox;
|
| @@ -232,8 +185,8 @@ public class ChildProcessLauncher {
|
| LauncherThread.post(new Runnable() {
|
| @Override
|
| public void run() {
|
| - startInternal(pendingSpawn.getContext(), pendingSpawn.getCommandLine(),
|
| - pendingSpawn.getFilesToBeMapped(),
|
| + start(pendingSpawn.getContext(), pendingSpawn.getServiceBundle(),
|
| + pendingSpawn.getConnectionBundle(),
|
| pendingSpawn.getLaunchCallback(),
|
| pendingSpawn.getChildProcessCallback(),
|
| pendingSpawn.isInSandbox(), pendingSpawn.isAlwaysInForeground(),
|
| @@ -378,8 +331,10 @@ public class ChildProcessLauncher {
|
| clearSpareConnection();
|
| }
|
| };
|
| - ChildSpawnData spawnData = new ChildSpawnData(context, null /* commandLine */,
|
| - null /* filesToBeMapped */, null /* launchCallback */,
|
| + boolean bindToCallerCheck = params == null ? false : params.getBindToCallerCheck();
|
| + ChildSpawnData spawnData = new ChildSpawnData(context,
|
| + ChildProcessLauncherHelper.createServiceBundle(bindToCallerCheck),
|
| + null /* connectionBundle */, null /* launchCallback */,
|
| null /* child process callback */, true /* inSandbox */,
|
| SPARE_CONNECTION_ALWAYS_IN_FOREGROUND, params);
|
| sSpareSandboxedConnection =
|
| @@ -402,61 +357,19 @@ public class ChildProcessLauncher {
|
| *
|
| * @param context Context used to obtain the application context.
|
| * @param paramId Key used to retrieve ChildProcessCreationParams.
|
| - * @param commandLine The child process command line argv.
|
| - * @param filesToBeMapped File IDs, FDs, offsets, and lengths to pass through.
|
| + * @param serviceBundle The Bundle passed in the intent used to bind to the service.
|
| + * @param connectionBundle The Bundle passed in setupConnection call.
|
| * @param launchCallback Callback invoked when the connection is established.
|
| + * @param childProcessCallback IBinder callback passed to the service.
|
| */
|
| - static void start(Context context, int paramId, final String[] commandLine,
|
| - FileDescriptorInfo[] filesToBeMapped, LaunchCallback launchCallback) {
|
| - assert LauncherThread.runningOnLauncherThread();
|
| - IBinder childProcessCallback = null;
|
| - boolean inSandbox = true;
|
| - boolean alwaysInForeground = false;
|
| - String processType =
|
| - ContentSwitches.getSwitchValue(commandLine, ContentSwitches.SWITCH_PROCESS_TYPE);
|
| - ChildProcessCreationParams params = ChildProcessCreationParams.get(paramId);
|
| - if (paramId != ChildProcessCreationParams.DEFAULT_ID && params == null) {
|
| - throw new RuntimeException("CreationParams id " + paramId + " not found");
|
| - }
|
| - if (!ContentSwitches.SWITCH_RENDERER_PROCESS.equals(processType)) {
|
| - if (params != null && !params.getPackageName().equals(context.getPackageName())) {
|
| - // WebViews and WebAPKs have renderer processes running in their applications.
|
| - // When launching these renderer processes, {@link ChildProcessConnection}
|
| - // requires the package name of the application which holds the renderer process.
|
| - // Therefore, the package name in ChildProcessCreationParams could be the package
|
| - // name of WebViews, WebAPKs, or Chrome, depending on the host application.
|
| - // Except renderer process, all other child processes should use Chrome's package
|
| - // name. In WebAPK, ChildProcessCreationParams are initialized with WebAPK's
|
| - // package name. Make a copy of the WebAPK's params, but replace the package with
|
| - // Chrome's package to use when initializing a non-renderer processes.
|
| - // TODO(boliu): Should fold into |paramId|. Investigate why this is needed.
|
| - params = new ChildProcessCreationParams(context.getPackageName(),
|
| - params.getIsExternalService(), params.getLibraryProcessType(),
|
| - params.getBindToCallerCheck());
|
| - }
|
| - if (ContentSwitches.SWITCH_GPU_PROCESS.equals(processType)) {
|
| - childProcessCallback = new GpuProcessCallback();
|
| - inSandbox = false;
|
| - alwaysInForeground = true;
|
| - } else {
|
| - // We only support sandboxed utility processes now.
|
| - assert ContentSwitches.SWITCH_UTILITY_PROCESS.equals(processType);
|
| - }
|
| - }
|
| -
|
| - startInternal(context, commandLine, filesToBeMapped, launchCallback, childProcessCallback,
|
| - inSandbox, alwaysInForeground, params);
|
| - }
|
| -
|
| @VisibleForTesting
|
| - public static ChildProcessConnection startInternal(final Context context,
|
| - final String[] commandLine, final FileDescriptorInfo[] filesToBeMapped,
|
| - final LaunchCallback launchCallback, final IBinder childProcessCallback,
|
| - final boolean inSandbox, final boolean alwaysInForeground,
|
| - final ChildProcessCreationParams creationParams) {
|
| + public static boolean start(final Context context, final Bundle serviceBundle,
|
| + final Bundle connectionBundle, final LaunchCallback launchCallback,
|
| + final IBinder childProcessCallback, final boolean inSandbox,
|
| + final boolean alwaysInForeground, final ChildProcessCreationParams creationParams) {
|
| assert LauncherThread.runningOnLauncherThread();
|
| try {
|
| - TraceEvent.begin("ChildProcessLauncher.startInternal");
|
| + TraceEvent.begin("ChildProcessLauncher.start");
|
|
|
| ChildProcessConnection allocatedConnection = null;
|
| String packageName = creationParams != null ? creationParams.getPackageName()
|
| @@ -478,9 +391,9 @@ public class ChildProcessLauncher {
|
| // than one process), so try starting the process again.
|
| // This connection that failed to start has not been freed,
|
| // so a new bound connection will be allocated.
|
| - startInternal(context, commandLine, filesToBeMapped,
|
| - launchCallback, childProcessCallback, inSandbox,
|
| - alwaysInForeground, creationParams);
|
| + start(context, serviceBundle, connectionBundle, launchCallback,
|
| + childProcessCallback, inSandbox, alwaysInForeground,
|
| + creationParams);
|
| }
|
| });
|
| }
|
| @@ -501,47 +414,28 @@ public class ChildProcessLauncher {
|
| }
|
| }
|
| if (allocatedConnection == null) {
|
| - ChildSpawnData spawnData = new ChildSpawnData(context, commandLine, filesToBeMapped,
|
| - launchCallback, childProcessCallback, inSandbox, alwaysInForeground,
|
| - creationParams);
|
| + ChildSpawnData spawnData = new ChildSpawnData(context, serviceBundle,
|
| + connectionBundle, launchCallback, childProcessCallback, inSandbox,
|
| + alwaysInForeground, creationParams);
|
| allocatedConnection =
|
| allocateBoundConnection(spawnData, startCallback, false /* forWarmUp */);
|
| if (allocatedConnection == null) {
|
| - return null;
|
| + return false;
|
| }
|
| }
|
| -
|
| boolean addToBindingmanager = inSandbox;
|
| - triggerConnectionSetup(allocatedConnection, commandLine, filesToBeMapped,
|
| - childProcessCallback, launchCallback, addToBindingmanager);
|
| - return allocatedConnection;
|
| + triggerConnectionSetup(allocatedConnection, connectionBundle, childProcessCallback,
|
| + launchCallback, addToBindingmanager);
|
| + return true;
|
| } finally {
|
| - TraceEvent.end("ChildProcessLauncher.startInternal");
|
| + TraceEvent.end("ChildProcessLauncher.start");
|
| }
|
| }
|
|
|
| - /**
|
| - * Create the common bundle to be passed to child processes.
|
| - * @param context Application context.
|
| - * @param commandLine Command line params to be passed to the service.
|
| - * @param linkerParams Linker params to start the service.
|
| - */
|
| - protected static Bundle createsServiceBundle(
|
| - String[] commandLine, FileDescriptorInfo[] filesToBeMapped) {
|
| - Bundle bundle = new Bundle();
|
| - bundle.putStringArray(ChildProcessConstants.EXTRA_COMMAND_LINE, commandLine);
|
| - bundle.putParcelableArray(ChildProcessConstants.EXTRA_FILES, filesToBeMapped);
|
| - bundle.putInt(ChildProcessConstants.EXTRA_CPU_COUNT, CpuFeatures.getCount());
|
| - bundle.putLong(ChildProcessConstants.EXTRA_CPU_FEATURES, CpuFeatures.getMask());
|
| - bundle.putBundle(Linker.EXTRA_LINKER_SHARED_RELROS, Linker.getInstance().getSharedRelros());
|
| - return bundle;
|
| - }
|
| -
|
| @VisibleForTesting
|
| static void triggerConnectionSetup(final ChildProcessConnection connection,
|
| - String[] commandLine, FileDescriptorInfo[] filesToBeMapped,
|
| - final IBinder childProcessCallback, final LaunchCallback launchCallback,
|
| - final boolean addToBindingmanager) {
|
| + Bundle connectionBundle, final IBinder childProcessCallback,
|
| + final LaunchCallback launchCallback, final boolean addToBindingmanager) {
|
| assert LauncherThread.runningOnLauncherThread();
|
| Log.d(TAG, "Setting up connection to process, connection name=%s",
|
| connection.getServiceName());
|
| @@ -567,8 +461,7 @@ public class ChildProcessLauncher {
|
| }
|
| };
|
|
|
| - connection.setupConnection(
|
| - commandLine, filesToBeMapped, childProcessCallback, connectionCallback);
|
| + connection.setupConnection(connectionBundle, childProcessCallback, connectionCallback);
|
| }
|
|
|
| /**
|
|
|