| Index: content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
|
| diff --git a/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java b/content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
|
| similarity index 87%
|
| copy from content/public/android/java/src/org/chromium/content/app/ChildProcessService.java
|
| copy to content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
|
| index ee6dba468e9f21ee694edda873268829e2d91f6e..a022eb45f1b372ed238f6958b4dd5d2da14781e1 100644
|
| --- a/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java
|
| +++ b/content/public/android/java/src/org/chromium/content/app/ChildProcessServiceImpl.java
|
| @@ -1,10 +1,9 @@
|
| -// Copyright 2012 The Chromium Authors. All rights reserved.
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| package org.chromium.content.app;
|
|
|
| -import android.app.Service;
|
| import android.content.Context;
|
| import android.content.Intent;
|
| import android.graphics.SurfaceTexture;
|
| @@ -27,7 +26,6 @@ import org.chromium.base.library_loader.Linker;
|
| import org.chromium.base.library_loader.ProcessInitException;
|
| import org.chromium.content.browser.ChildProcessConstants;
|
| import org.chromium.content.browser.ChildProcessCreationParams;
|
| -import org.chromium.content.browser.ChildProcessLauncher;
|
| import org.chromium.content.browser.FileDescriptorInfo;
|
| import org.chromium.content.common.ContentSwitches;
|
| import org.chromium.content.common.IChildProcessCallback;
|
| @@ -38,18 +36,15 @@ import java.util.concurrent.Semaphore;
|
| import java.util.concurrent.atomic.AtomicReference;
|
|
|
| /**
|
| - * This is the base class for child services; the [Non]SandboxedProcessService0, 1.. etc
|
| - * subclasses provide the concrete service entry points, to enable the browser to connect
|
| - * to more than one distinct process (i.e. one process per service number, up to limit of N).
|
| - * The embedding application must declare these service instances in the application section
|
| - * of its AndroidManifest.xml, for example with N entries of the form:-
|
| - * <service android:name="org.chromium.content.app.[Non]SandboxedProcessServiceX"
|
| - * android:process=":[non]sandboxed_processX" />
|
| - * for X in 0...N-1 (where N is {@link ChildProcessLauncher#MAX_REGISTERED_SERVICES})
|
| + * This class implements all of the functionality for {@link ChildProcessService} which owns an
|
| + * object of {@link ChildProcessServiceImpl}.
|
| + * It makes possible that WebAPK's ChildProcessService owns a ChildProcessServiceImpl object
|
| + * and uses the same functionalities to create renderer process for WebAPKs when "--enable-webapk"
|
| + * flag is turned on.
|
| */
|
| @JNINamespace("content")
|
| @SuppressWarnings("SynchronizeOnNonFinalField")
|
| -public class ChildProcessService extends Service {
|
| +public class ChildProcessServiceImpl {
|
| private static final String MAIN_THREAD_NAME = "ChildProcessMain";
|
| private static final String TAG = "ChildProcessService";
|
| protected static final FileDescriptorInfo[] EMPTY_FILE_DESCRIPTOR_INFO = {};
|
| @@ -104,16 +99,28 @@ public class ChildProcessService extends Service {
|
| }
|
| };
|
|
|
| - @Override
|
| - public void onCreate() {
|
| + // The ClassLoader for the host browser context.
|
| + private ClassLoader mHostClassLoader;
|
| +
|
| + /* package */ static Context getContext() {
|
| + return sContext.get();
|
| + }
|
| +
|
| + /**
|
| + * Loads Chrome's native libraries and initializes a ChildProcessServiceImpl.
|
| + * @param context The application context.
|
| + * @param hostBrowserContext The context of the host browser (i.e. Chrome).
|
| + */
|
| + public void create(final Context context, final Context hostBrowserContext) {
|
| + mHostClassLoader = hostBrowserContext.getClassLoader();
|
| Log.i(TAG, "Creating new ChildProcessService pid=%d", Process.myPid());
|
| if (sContext.get() != null) {
|
| throw new RuntimeException("Illegal child process reuse.");
|
| }
|
| - sContext.set(this);
|
| - super.onCreate();
|
| + sContext.set(context);
|
|
|
| - ContextUtils.initApplicationContext(getApplicationContext());
|
| + // Initialize the context for the application that owns this ChildProcessServiceImpl object.
|
| + ContextUtils.initApplicationContext(context);
|
|
|
| mMainThread = new Thread(new Runnable() {
|
| @Override
|
| @@ -152,7 +159,7 @@ public class ChildProcessService extends Service {
|
|
|
| boolean loadAtFixedAddressFailed = false;
|
| try {
|
| - LibraryLoader.get(mLibraryProcessType).loadNow(getApplicationContext());
|
| + LibraryLoader.get(mLibraryProcessType).loadNow(hostBrowserContext);
|
| isLoaded = true;
|
| } catch (ProcessInitException e) {
|
| if (requestedSharedRelro) {
|
| @@ -166,7 +173,7 @@ public class ChildProcessService extends Service {
|
| if (!isLoaded && requestedSharedRelro) {
|
| linker.disableSharedRelros();
|
| try {
|
| - LibraryLoader.get(mLibraryProcessType).loadNow(getApplicationContext());
|
| + LibraryLoader.get(mLibraryProcessType).loadNow(hostBrowserContext);
|
| isLoaded = true;
|
| } catch (ProcessInitException e) {
|
| Log.e(TAG, "Failed to load native library on retry", e);
|
| @@ -190,7 +197,8 @@ public class ChildProcessService extends Service {
|
| nativeRegisterGlobalFileDescriptor(
|
| fdInfo.mId, fdInfo.mFd.detachFd(), fdInfo.mOffset, fdInfo.mSize);
|
| }
|
| - nativeInitChildProcess(ChildProcessService.this, mCpuCount, mCpuFeatures);
|
| + nativeInitChildProcessImpl(ChildProcessServiceImpl.this, mCpuCount,
|
| + mCpuFeatures);
|
| if (mActivitySemaphore.tryAcquire()) {
|
| ContentMain.start();
|
| nativeExitChildProcess();
|
| @@ -205,11 +213,9 @@ public class ChildProcessService extends Service {
|
| mMainThread.start();
|
| }
|
|
|
| - @Override
|
| @SuppressFBWarnings("DM_EXIT")
|
| - public void onDestroy() {
|
| + public void destroy() {
|
| Log.i(TAG, "Destroying ChildProcessService pid=%d", Process.myPid());
|
| - super.onDestroy();
|
| if (mActivitySemaphore.tryAcquire()) {
|
| // TODO(crbug.com/457406): This is a bit hacky, but there is no known better solution
|
| // as this service will get reused (at least if not sandboxed).
|
| @@ -234,22 +240,12 @@ public class ChildProcessService extends Service {
|
| nativeShutdownMainThread();
|
| }
|
|
|
| - @Override
|
| - public IBinder onBind(Intent intent) {
|
| - // We call stopSelf() to request that this service be stopped as soon as the client
|
| - // unbinds. Otherwise the system may keep it around and available for a reconnect. The
|
| - // child processes do not currently support reconnect; they must be initialized from
|
| - // scratch every time.
|
| - stopSelf();
|
| + public IBinder bind(Intent intent) {
|
| initializeParams(intent);
|
| return mBinder;
|
| }
|
|
|
| - /**
|
| - * Helper method to initialize the params from intent.
|
| - * @param intent Intent to launch the service.
|
| - */
|
| - protected void initializeParams(Intent intent) {
|
| + void initializeParams(Intent intent) {
|
| synchronized (mMainThread) {
|
| mCommandLineParams =
|
| intent.getStringArrayExtra(ChildProcessConstants.EXTRA_COMMAND_LINE);
|
| @@ -262,13 +258,9 @@ public class ChildProcessService extends Service {
|
| }
|
| }
|
|
|
| - /**
|
| - * Helper method to get the information about the service from a given bundle.
|
| - * @param bundle Bundle that contains the information to start the service.
|
| - */
|
| void getServiceInfo(Bundle bundle) {
|
| // Required to unparcel FileDescriptorInfo.
|
| - bundle.setClassLoader(getClassLoader());
|
| + bundle.setClassLoader(mHostClassLoader);
|
| synchronized (mMainThread) {
|
| // Allow the command line to be set via bind() intent or setupConnection, but
|
| // the FD can only be transferred here.
|
| @@ -423,11 +415,11 @@ public class ChildProcessService extends Service {
|
| * The main entry point for a child process. This should be called from a new thread since
|
| * it will not return until the child process exits. See child_process_service.{h,cc}
|
| *
|
| - * @param service The current ChildProcessService object.
|
| + * @param serviceImpl The current ChildProcessServiceImpl object.
|
| * renderer.
|
| */
|
| - private static native void nativeInitChildProcess(
|
| - ChildProcessService service, int cpuCount, long cpuFeatures);
|
| + private static native void nativeInitChildProcessImpl(
|
| + ChildProcessServiceImpl serviceImpl, int cpuCount, long cpuFeatures);
|
|
|
| /**
|
| * Force the child process to exit.
|
|
|