Merge "Use shared namespace for bundled apps"
diff --git a/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java b/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java
index 0e112fc..e329a4c 100644
--- a/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java
+++ b/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java
@@ -28,6 +28,7 @@
*/
public class BaseDexClassLoader extends ClassLoader {
private final DexPathList pathList;
+ private final boolean sharedNamespace;
/**
* Constructs an instance.
@@ -46,7 +47,7 @@
*/
public BaseDexClassLoader(String dexPath, File optimizedDirectory,
String librarySearchPath, ClassLoader parent) {
- this(dexPath, optimizedDirectory, librarySearchPath, null, parent);
+ this(dexPath, optimizedDirectory, false, librarySearchPath, null, parent);
}
/**
@@ -57,6 +58,11 @@
* defaults to {@code ":"} on Android
* @param optimizedDirectory directory where optimized dex files
* should be written; may be {@code null}
+ * @param isSharedNamespace whether this classloader should use the shared linker
+ * namespace. If the shared linker namespace is used, the classloader will have
+ * access to all native libraries loaded by the platform. This should be limited
+ * to the classloaders used by the bundled apps - bundled apps are part of the
+ * platform
* @param librarySearchPath the list of directories containing native
* libraries, delimited by {@code File.pathSeparator}; may be
* {@code null}; directories in this list are used to search for
@@ -72,11 +78,12 @@
*
* @hide
*/
- public BaseDexClassLoader(String dexPath, File optimizedDirectory,
+ public BaseDexClassLoader(String dexPath, File optimizedDirectory, boolean isSharedNamespace,
String librarySearchPath, String libraryPermittedPath, ClassLoader parent) {
super(parent);
this.pathList = new DexPathList(this, dexPath, librarySearchPath,
libraryPermittedPath, optimizedDirectory);
+ this.sharedNamespace = isSharedNamespace;
}
@Override
@@ -172,6 +179,13 @@
return pathList.getLibraryPermittedPath();
}
+ /**
+ * @hide
+ */
+ public boolean isSharedNamespace() {
+ return sharedNamespace;
+ }
+
@Override public String toString() {
return getClass().getName() + "[" + pathList + "]";
}
diff --git a/dalvik/src/main/java/dalvik/system/DexClassLoader.java b/dalvik/src/main/java/dalvik/system/DexClassLoader.java
index 4bbdbd8..3a584e8 100644
--- a/dalvik/src/main/java/dalvik/system/DexClassLoader.java
+++ b/dalvik/src/main/java/dalvik/system/DexClassLoader.java
@@ -56,7 +56,7 @@
*/
public DexClassLoader(String dexPath, String optimizedDirectory,
String librarySearchPath, ClassLoader parent) {
- super(dexPath, new File(optimizedDirectory), librarySearchPath, null, parent);
+ super(dexPath, new File(optimizedDirectory), false, librarySearchPath, null, parent);
}
/**
@@ -88,7 +88,7 @@
*/
public DexClassLoader(String dexPath, String optimizedDirectory,
String librarySearchPath, String libraryPermittedPath, ClassLoader parent) {
- super(dexPath, new File(optimizedDirectory), librarySearchPath,
+ super(dexPath, new File(optimizedDirectory), false, librarySearchPath,
libraryPermittedPath, parent);
}
}
diff --git a/dalvik/src/main/java/dalvik/system/PathClassLoader.java b/dalvik/src/main/java/dalvik/system/PathClassLoader.java
index 83b4366..5375935 100644
--- a/dalvik/src/main/java/dalvik/system/PathClassLoader.java
+++ b/dalvik/src/main/java/dalvik/system/PathClassLoader.java
@@ -35,7 +35,7 @@
* @param parent the parent class loader
*/
public PathClassLoader(String dexPath, ClassLoader parent) {
- super(dexPath, null, null, null, parent);
+ super(dexPath, null, false, null, null, parent);
}
/**
@@ -63,7 +63,7 @@
* This method will be deprecated in the next release
*/
public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {
- super(dexPath, null, librarySearchPath, null, parent);
+ super(dexPath, null, false, librarySearchPath, null, parent);
}
/**
@@ -83,6 +83,11 @@
* @param dexPath the list of jar/apk files containing classes and
* resources, delimited by {@code File.pathSeparator}, which
* defaults to {@code ":"} on Android
+ * @param isSharedNamespace whether this classloader should use the shared linker
+ * namespace. If the shared linker namespace is used, the classloader will have
+ * access to all native libraries loaded by the platform. This should be limited
+ * to the classloaders used by the bundled apps - bundled apps are part of the
+ * platform
* @param librarySearchPath the list of directories containing native
* libraries, delimited by {@code File.pathSeparator}; may be
* {@code null}
@@ -95,8 +100,8 @@
*
* @hide
*/
- public PathClassLoader(String dexPath, String librarySearchPath, String libraryPermittedPath,
- ClassLoader parent) {
- super(dexPath, null, librarySearchPath, libraryPermittedPath, parent);
+ public PathClassLoader(String dexPath, boolean isSharedNamespace, String librarySearchPath,
+ String libraryPermittedPath, ClassLoader parent) {
+ super(dexPath, null, isSharedNamespace, librarySearchPath, libraryPermittedPath, parent);
}
}
diff --git a/luni/src/main/java/java/lang/Runtime.java b/luni/src/main/java/java/lang/Runtime.java
index 5b86346..178ff89 100644
--- a/luni/src/main/java/java/lang/Runtime.java
+++ b/luni/src/main/java/java/lang/Runtime.java
@@ -418,30 +418,33 @@
// dlopen(3) calls made from a .so's JNI_OnLoad to work too.
// So, find out what the native library search path is for the ClassLoader in question...
- String ldLibraryPath = null;
- String permittedPath = null;
+ String librarySearchPath = null;
+ String libraryPermittedPath = null;
+ boolean isSharedNamespace = false;
String dexPath = null;
if (loader == null) {
// We use the given library path for the boot class loader. This is the path
// also used in loadLibraryName if loader is null.
- ldLibraryPath = System.getProperty("java.library.path");
+ librarySearchPath = System.getProperty("java.library.path");
} else if (loader instanceof BaseDexClassLoader) {
BaseDexClassLoader dexClassLoader = (BaseDexClassLoader) loader;
- ldLibraryPath = dexClassLoader.getLdLibraryPath();
- permittedPath = dexClassLoader.getLibraryPermittedPath();
+ librarySearchPath = dexClassLoader.getLdLibraryPath();
+ libraryPermittedPath = dexClassLoader.getLibraryPermittedPath();
+ isSharedNamespace = dexClassLoader.isSharedNamespace();
}
// nativeLoad should be synchronized so there's only one LD_LIBRARY_PATH in use regardless
// of how many ClassLoaders are in the system, but dalvik doesn't support synchronized
// internal natives.
synchronized (this) {
- return nativeLoad(name, loader, ldLibraryPath, permittedPath);
+ return nativeLoad(name, loader, isSharedNamespace,
+ librarySearchPath, libraryPermittedPath);
}
}
// TODO: should be synchronized, but dalvik doesn't support synchronized internal natives.
private static native String nativeLoad(String filename, ClassLoader loader,
- String ldLibraryPath, String libraryPermittedPath);
+ boolean isSharedNamespace, String librarySearchPath, String libraryPermittedPath);
/**
* Provides a hint to the runtime that it would be useful to attempt