diff --git a/core/java/android/app/ApplicationLoaders.java b/core/java/android/app/ApplicationLoaders.java index ddb2d46eb1185..7d0d1b4f5ee55 100644 --- a/core/java/android/app/ApplicationLoaders.java +++ b/core/java/android/app/ApplicationLoaders.java @@ -27,7 +27,7 @@ class ApplicationLoaders return gApplicationLoaders; } - public ClassLoader getClassLoader(String zip, String librarySearchPath, + public ClassLoader getClassLoader(String zip, boolean isBundled, String librarySearchPath, String libraryPermittedPath, ClassLoader parent) { /* @@ -56,7 +56,8 @@ class ApplicationLoaders Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, zip); PathClassLoader pathClassloader = - new PathClassLoader(zip, librarySearchPath, libraryPermittedPath, parent); + new PathClassLoader(zip, isBundled, librarySearchPath, + libraryPermittedPath, parent); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); mLoaders.put(zip, pathClassloader); diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 01209227273ee..763cb1c8420a0 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -359,12 +359,21 @@ public final class LoadedApk { } } + String libraryPermittedPath = mAppDir + File.pathSeparator + mDataDir; + boolean isBundledApp = false; + if (mApplicationInfo.isSystemApp()) { + isBundledApp = true; // Add path to system libraries to libPaths; // Access to system libs should be limited // to bundled applications; this is why updated // system apps are not included. libPaths.add(System.getProperty("java.library.path")); + + // This is necessary to grant bundled apps access to + // libraries located in subdirectories of /system/lib + libraryPermittedPath += File.pathSeparator + + System.getProperty("java.library.path"); } final String librarySearchPath = TextUtils.join(File.pathSeparator, libPaths); @@ -382,10 +391,8 @@ public final class LoadedApk { // as this is early and necessary. StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); - String libraryPermittedPath = mAppDir + File.pathSeparator + mDataDir; - - mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip, librarySearchPath, - libraryPermittedPath, mBaseClassLoader); + mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip, isBundledApp, + librarySearchPath, libraryPermittedPath, mBaseClassLoader); StrictMode.setThreadPolicy(oldPolicy); } else { diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp index 6ecb3fb19f624..88a56d2084d0f 100644 --- a/core/jni/android_app_NativeActivity.cpp +++ b/core/jni/android_app_NativeActivity.cpp @@ -270,7 +270,7 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName bool needNativeBridge = false; void* handle = OpenNativeLibrary(env, sdkVersion, pathStr, classLoader, - libraryPath, isolationPath); + false, libraryPath, isolationPath); if (handle == NULL) { if (NativeBridgeIsSupported(pathStr)) { handle = NativeBridgeLoadLibrary(pathStr, RTLD_LAZY);