diff options
| author | 2017-03-16 15:48:55 +0000 | |
|---|---|---|
| committer | 2017-03-16 15:48:55 +0000 | |
| commit | d794855fba65efcee29227c5a3172c652cde9643 (patch) | |
| tree | 78ada5bda90e52766451fa33cd6c9450932d01e5 | |
| parent | 5c8e3edf4888b622185b801dfcc8829dcd414bf8 (diff) | |
| parent | 959628a32ed0c5d3e9c69df1184f54f8919ea56b (diff) | |
Merge "Set system server's class loader for wrap.system_server" am: 8d2d6bfa12
am: 959628a32e
Change-Id: I88bfbb33aa1247a9b0d1d468b35621ed89abcc51
| -rw-r--r-- | core/java/com/android/internal/os/WrapperInit.java | 17 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 17 |
2 files changed, 24 insertions, 10 deletions
diff --git a/core/java/com/android/internal/os/WrapperInit.java b/core/java/com/android/internal/os/WrapperInit.java index dbbebbe7f758..c329fd1b5e09 100644 --- a/core/java/com/android/internal/os/WrapperInit.java +++ b/core/java/com/android/internal/os/WrapperInit.java @@ -139,6 +139,21 @@ public class WrapperInit { Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from wrapper"); } - RuntimeInit.applicationInit(targetSdkVersion, argv, null); + // Check whether the first argument is a "-cp" in argv, and assume the next argument is the + // classpath. If found, create a PathClassLoader and use it for applicationInit. + ClassLoader classLoader = null; + if (argv != null && argv.length > 2 && argv[0].equals("-cp")) { + classLoader = ZygoteInit.createPathClassLoader(argv[1], targetSdkVersion); + + // Install this classloader as the context classloader, too. + Thread.currentThread().setContextClassLoader(classLoader); + + // Remove the classpath from the arguments. + String removedArgs[] = new String[argv.length - 2]; + System.arraycopy(argv, 2, removedArgs, 0, argv.length - 2); + argv = removedArgs; + } + + RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader); } } diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 17bbf792429a..1d73c79f0b12 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -452,7 +452,8 @@ public class ZygoteInit { String[] amendedArgs = new String[args.length + 2]; amendedArgs[0] = "-cp"; amendedArgs[1] = systemServerClasspath; - System.arraycopy(parsedArgs.remainingArgs, 0, amendedArgs, 2, parsedArgs.remainingArgs.length); + System.arraycopy(args, 0, amendedArgs, 2, args.length); + args = amendedArgs; } WrapperInit.execApplication(parsedArgs.invokeWith, @@ -461,8 +462,7 @@ public class ZygoteInit { } else { ClassLoader cl = null; if (systemServerClasspath != null) { - cl = createSystemServerClassLoader(systemServerClasspath, - parsedArgs.targetSdkVersion); + cl = createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion); Thread.currentThread().setContextClassLoader(cl); } @@ -477,15 +477,14 @@ public class ZygoteInit { } /** - * Creates a PathClassLoader for the system server. It also creates - * a shared namespace associated with the classloader to let it access - * platform-private native libraries. + * Creates a PathClassLoader for the given class path that is associated with a shared + * namespace, i.e., this classloader can access platform-private native libraries. The + * classloader will use java.library.path as the native library path. */ - private static PathClassLoader createSystemServerClassLoader(String systemServerClasspath, - int targetSdkVersion) { + static PathClassLoader createPathClassLoader(String classPath, int targetSdkVersion) { String libraryPath = System.getProperty("java.library.path"); - return PathClassLoaderFactory.createClassLoader(systemServerClasspath, + return PathClassLoaderFactory.createClassLoader(classPath, libraryPath, libraryPath, ClassLoader.getSystemClassLoader(), |