From 44fadb21e0de195d7d950aeb8958875c9920006e Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Fri, 11 Dec 2015 17:34:21 -0800 Subject: [PATCH] Use shared namespace for bundled app classloader Allow bundled apps to reference platform native libraries located in subdirectories of the default library path (/system/lib/hw/* for example). In addition to this bundled apps need to share native libraries with default namespace. Added parameter to ApplicationLoaders.createClassLoader() to do just that. Bug: 26165097 Bug: 26164393 (cherry picked from commit 75b10ecccdd1881390075dd22c1d4f9bdf1c5828) Change-Id: I836e5fed4713f2a605a5de673c40970ef6d988dd --- core/java/android/app/ApplicationLoaders.java | 5 +++-- core/java/android/app/LoadedApk.java | 15 +++++++++++---- core/jni/android_app_NativeActivity.cpp | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) 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);