Loading core/java/android/app/ApplicationLoaders.java +10 −21 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.app; import android.os.Trace; import android.util.ArrayMap; import com.android.internal.os.PathClassLoaderFactory; import dalvik.system.PathClassLoader; class ApplicationLoaders { Loading Loading @@ -54,20 +55,15 @@ class ApplicationLoaders { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, zip); PathClassLoader pathClassloader = new PathClassLoader(zip, librarySearchPath, parent); String errorMessage = createClassloaderNamespace(pathClassloader, targetSdkVersion, PathClassLoader pathClassloader = PathClassLoaderFactory.createClassLoader( zip, librarySearchPath, libraryPermittedPath, parent, targetSdkVersion, isBundled); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); if (errorMessage != null) { throw new UnsatisfiedLinkError("Unable to create namespace for the classloader " + pathClassloader + ": " + errorMessage); } Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); mLoaders.put(zip, pathClassloader); return pathClassloader; Loading @@ -80,14 +76,7 @@ class ApplicationLoaders { } } private static native String createClassloaderNamespace(ClassLoader classLoader, int targetSdkVersion, String librarySearchPath, String libraryPermittedPath, boolean isShared); private final ArrayMap<String, ClassLoader> mLoaders = new ArrayMap<String, ClassLoader>(); private static final ApplicationLoaders gApplicationLoaders = new ApplicationLoaders(); private static final ApplicationLoaders gApplicationLoaders = new ApplicationLoaders(); } core/java/com/android/internal/os/PathClassLoaderFactory.java 0 → 100644 +62 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.os; import dalvik.system.PathClassLoader; /** * Creates path class loaders. * * @hide */ public class PathClassLoaderFactory { // Unconstructable private PathClassLoaderFactory() {} /** * Create a PathClassLoader and initialize a linker-namespace for it. * * @hide */ public static PathClassLoader createClassLoader(String dexPath, String librarySearchPath, String libraryPermittedPath, ClassLoader parent, int targetSdkVersion, boolean isNamespaceShared) { PathClassLoader pathClassloader = new PathClassLoader(dexPath, librarySearchPath, parent); String errorMessage = createClassloaderNamespace(pathClassloader, targetSdkVersion, librarySearchPath, libraryPermittedPath, isNamespaceShared); if (errorMessage != null) { throw new UnsatisfiedLinkError("Unable to create namespace for the classloader " + pathClassloader + ": " + errorMessage); } return pathClassloader; } private static native String createClassloaderNamespace(ClassLoader classLoader, int targetSdkVersion, String librarySearchPath, String libraryPermittedPath, boolean isNamespaceShared); } core/java/com/android/internal/os/ZygoteInit.java +20 −1 Original line number Diff line number Diff line Loading @@ -458,7 +458,9 @@ public class ZygoteInit { } else { ClassLoader cl = null; if (systemServerClasspath != null) { cl = new PathClassLoader(systemServerClasspath, ClassLoader.getSystemClassLoader()); cl = createSystemServerClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion); Thread.currentThread().setContextClassLoader(cl); } Loading @@ -471,6 +473,23 @@ public class ZygoteInit { /* should never reach here */ } /** * 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. */ private static PathClassLoader createSystemServerClassLoader(String systemServerClasspath, int targetSdkVersion) { String librarySearchPath = System.getProperty("java.library.path"); return PathClassLoaderFactory.createClassLoader(systemServerClasspath, librarySearchPath, null /* libraryPermittedPath */, ClassLoader.getSystemClassLoader(), targetSdkVersion, true /* isNamespaceShared */); } /** * Performs dex-opt on the elements of {@code classPath}, if needed. We * choose the instruction set of the current runtime. Loading core/jni/Android.mk +1 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ LOCAL_SRC_FILES:= \ com_android_internal_content_NativeLibraryHelper.cpp \ com_google_android_gles_jni_EGLImpl.cpp \ com_google_android_gles_jni_GLImpl.cpp.arm \ android_app_ApplicationLoaders.cpp \ android_app_NativeActivity.cpp \ android_opengl_EGL14.cpp \ android_opengl_EGLExt.cpp \ Loading Loading @@ -173,6 +172,7 @@ LOCAL_SRC_FILES:= \ android_content_res_Configuration.cpp \ android_animation_PropertyValuesHolder.cpp \ com_android_internal_net_NetworkStatsFactory.cpp \ com_android_internal_os_PathClassLoaderFactory.cpp \ com_android_internal_os_Zygote.cpp \ com_android_internal_util_VirtualRefBasePtr.cpp \ com_android_internal_view_animation_NativeInterpolatorFactoryHelper.cpp Loading core/jni/AndroidRuntime.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -173,7 +173,6 @@ extern int register_android_backup_BackupDataOutput(JNIEnv *env); extern int register_android_backup_FileBackupHelperBase(JNIEnv *env); extern int register_android_backup_BackupHelperDispatcher(JNIEnv *env); extern int register_android_app_backup_FullBackup(JNIEnv *env); extern int register_android_app_ApplicationLoaders(JNIEnv* env); extern int register_android_app_ActivityThread(JNIEnv *env); extern int register_android_app_NativeActivity(JNIEnv *env); extern int register_android_media_RemoteDisplay(JNIEnv *env); Loading @@ -193,6 +192,7 @@ extern int register_android_content_res_Configuration(JNIEnv* env); extern int register_android_animation_PropertyValuesHolder(JNIEnv *env); extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env); extern int register_com_android_internal_net_NetworkStatsFactory(JNIEnv *env); extern int register_com_android_internal_os_PathClassLoaderFactory(JNIEnv* env); extern int register_com_android_internal_os_Zygote(JNIEnv *env); extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env); Loading Loading @@ -1338,6 +1338,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_net_NetworkUtils), REG_JNI(register_android_net_TrafficStats), REG_JNI(register_android_os_MemoryFile), REG_JNI(register_com_android_internal_os_PathClassLoaderFactory), REG_JNI(register_com_android_internal_os_Zygote), REG_JNI(register_com_android_internal_util_VirtualRefBasePtr), REG_JNI(register_android_hardware_Camera), Loading Loading @@ -1368,7 +1369,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_backup_FileBackupHelperBase), REG_JNI(register_android_backup_BackupHelperDispatcher), REG_JNI(register_android_app_backup_FullBackup), REG_JNI(register_android_app_ApplicationLoaders), REG_JNI(register_android_app_ActivityThread), REG_JNI(register_android_app_NativeActivity), REG_JNI(register_android_util_jar_StrictJarFile), Loading Loading
core/java/android/app/ApplicationLoaders.java +10 −21 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.app; import android.os.Trace; import android.util.ArrayMap; import com.android.internal.os.PathClassLoaderFactory; import dalvik.system.PathClassLoader; class ApplicationLoaders { Loading Loading @@ -54,20 +55,15 @@ class ApplicationLoaders { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, zip); PathClassLoader pathClassloader = new PathClassLoader(zip, librarySearchPath, parent); String errorMessage = createClassloaderNamespace(pathClassloader, targetSdkVersion, PathClassLoader pathClassloader = PathClassLoaderFactory.createClassLoader( zip, librarySearchPath, libraryPermittedPath, parent, targetSdkVersion, isBundled); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); if (errorMessage != null) { throw new UnsatisfiedLinkError("Unable to create namespace for the classloader " + pathClassloader + ": " + errorMessage); } Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); mLoaders.put(zip, pathClassloader); return pathClassloader; Loading @@ -80,14 +76,7 @@ class ApplicationLoaders { } } private static native String createClassloaderNamespace(ClassLoader classLoader, int targetSdkVersion, String librarySearchPath, String libraryPermittedPath, boolean isShared); private final ArrayMap<String, ClassLoader> mLoaders = new ArrayMap<String, ClassLoader>(); private static final ApplicationLoaders gApplicationLoaders = new ApplicationLoaders(); private static final ApplicationLoaders gApplicationLoaders = new ApplicationLoaders(); }
core/java/com/android/internal/os/PathClassLoaderFactory.java 0 → 100644 +62 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.os; import dalvik.system.PathClassLoader; /** * Creates path class loaders. * * @hide */ public class PathClassLoaderFactory { // Unconstructable private PathClassLoaderFactory() {} /** * Create a PathClassLoader and initialize a linker-namespace for it. * * @hide */ public static PathClassLoader createClassLoader(String dexPath, String librarySearchPath, String libraryPermittedPath, ClassLoader parent, int targetSdkVersion, boolean isNamespaceShared) { PathClassLoader pathClassloader = new PathClassLoader(dexPath, librarySearchPath, parent); String errorMessage = createClassloaderNamespace(pathClassloader, targetSdkVersion, librarySearchPath, libraryPermittedPath, isNamespaceShared); if (errorMessage != null) { throw new UnsatisfiedLinkError("Unable to create namespace for the classloader " + pathClassloader + ": " + errorMessage); } return pathClassloader; } private static native String createClassloaderNamespace(ClassLoader classLoader, int targetSdkVersion, String librarySearchPath, String libraryPermittedPath, boolean isNamespaceShared); }
core/java/com/android/internal/os/ZygoteInit.java +20 −1 Original line number Diff line number Diff line Loading @@ -458,7 +458,9 @@ public class ZygoteInit { } else { ClassLoader cl = null; if (systemServerClasspath != null) { cl = new PathClassLoader(systemServerClasspath, ClassLoader.getSystemClassLoader()); cl = createSystemServerClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion); Thread.currentThread().setContextClassLoader(cl); } Loading @@ -471,6 +473,23 @@ public class ZygoteInit { /* should never reach here */ } /** * 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. */ private static PathClassLoader createSystemServerClassLoader(String systemServerClasspath, int targetSdkVersion) { String librarySearchPath = System.getProperty("java.library.path"); return PathClassLoaderFactory.createClassLoader(systemServerClasspath, librarySearchPath, null /* libraryPermittedPath */, ClassLoader.getSystemClassLoader(), targetSdkVersion, true /* isNamespaceShared */); } /** * Performs dex-opt on the elements of {@code classPath}, if needed. We * choose the instruction set of the current runtime. Loading
core/jni/Android.mk +1 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ LOCAL_SRC_FILES:= \ com_android_internal_content_NativeLibraryHelper.cpp \ com_google_android_gles_jni_EGLImpl.cpp \ com_google_android_gles_jni_GLImpl.cpp.arm \ android_app_ApplicationLoaders.cpp \ android_app_NativeActivity.cpp \ android_opengl_EGL14.cpp \ android_opengl_EGLExt.cpp \ Loading Loading @@ -173,6 +172,7 @@ LOCAL_SRC_FILES:= \ android_content_res_Configuration.cpp \ android_animation_PropertyValuesHolder.cpp \ com_android_internal_net_NetworkStatsFactory.cpp \ com_android_internal_os_PathClassLoaderFactory.cpp \ com_android_internal_os_Zygote.cpp \ com_android_internal_util_VirtualRefBasePtr.cpp \ com_android_internal_view_animation_NativeInterpolatorFactoryHelper.cpp Loading
core/jni/AndroidRuntime.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -173,7 +173,6 @@ extern int register_android_backup_BackupDataOutput(JNIEnv *env); extern int register_android_backup_FileBackupHelperBase(JNIEnv *env); extern int register_android_backup_BackupHelperDispatcher(JNIEnv *env); extern int register_android_app_backup_FullBackup(JNIEnv *env); extern int register_android_app_ApplicationLoaders(JNIEnv* env); extern int register_android_app_ActivityThread(JNIEnv *env); extern int register_android_app_NativeActivity(JNIEnv *env); extern int register_android_media_RemoteDisplay(JNIEnv *env); Loading @@ -193,6 +192,7 @@ extern int register_android_content_res_Configuration(JNIEnv* env); extern int register_android_animation_PropertyValuesHolder(JNIEnv *env); extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env); extern int register_com_android_internal_net_NetworkStatsFactory(JNIEnv *env); extern int register_com_android_internal_os_PathClassLoaderFactory(JNIEnv* env); extern int register_com_android_internal_os_Zygote(JNIEnv *env); extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env); Loading Loading @@ -1338,6 +1338,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_net_NetworkUtils), REG_JNI(register_android_net_TrafficStats), REG_JNI(register_android_os_MemoryFile), REG_JNI(register_com_android_internal_os_PathClassLoaderFactory), REG_JNI(register_com_android_internal_os_Zygote), REG_JNI(register_com_android_internal_util_VirtualRefBasePtr), REG_JNI(register_android_hardware_Camera), Loading Loading @@ -1368,7 +1369,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_backup_FileBackupHelperBase), REG_JNI(register_android_backup_BackupHelperDispatcher), REG_JNI(register_android_app_backup_FullBackup), REG_JNI(register_android_app_ApplicationLoaders), REG_JNI(register_android_app_ActivityThread), REG_JNI(register_android_app_NativeActivity), REG_JNI(register_android_util_jar_StrictJarFile), Loading