Index: base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java |
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java |
index 348f9969b5f48921045238e1b9578458c6ed5081..3aa559f0e3d05730a982025c7a0daea12569bce2 100644 |
--- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java |
+++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java |
@@ -6,6 +6,7 @@ package org.chromium.base.library_loader; |
import android.annotation.TargetApi; |
import android.content.Context; |
+import android.content.SharedPreferences; |
import android.content.pm.ApplicationInfo; |
import android.content.pm.PackageInfo; |
import android.content.pm.PackageManager.NameNotFoundException; |
@@ -21,7 +22,6 @@ import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
import org.chromium.base.metrics.RecordHistogram; |
-import java.io.File; |
import java.util.concurrent.atomic.AtomicBoolean; |
import javax.annotation.Nullable; |
@@ -259,8 +259,29 @@ public class LibraryLoader { |
String zipFilePath = null; |
String libFilePath = System.mapLibraryName(library); |
if (Linker.isInZipFile()) { |
+ SharedPreferences prefs = context.getSharedPreferences( |
+ "MINT_PREFS", Context.MODE_PRIVATE); |
+ String packageString = prefs.getString("CHROME_PACKAGE_PREF", |
+ DEFAULT_CHROME_PACKAGE_NAME); |
+ Context remoteContext = context; |
+ if (mLibraryProcessType == LibraryProcessType.PROCESS_CHILD |
+ && !context.getPackageName().equals(packageString)) { |
+ try { |
+ // Construct the context of the WebAPK host, which has native |
+ // libraries that the WebAPK. |
+ Log.w(TAG, "package name from context: %s", |
+ context.getPackageName()); |
+ remoteContext = |
+ context.getApplicationContext().createPackageContext( |
+ packageString, |
+ Context.CONTEXT_IGNORE_SECURITY |
+ | Context.CONTEXT_INCLUDE_CODE); |
+ } catch (NameNotFoundException e) { |
+ e.printStackTrace(); |
+ } |
+ } |
// Load directly from the APK. |
- zipFilePath = getLibraryApkPath(context); |
+ zipFilePath = getLibraryApkPath(remoteContext); |
Log.i(TAG, "Loading " + library + " from within " + zipFilePath); |
} else { |
// The library is in its own file. |
@@ -273,35 +294,9 @@ public class LibraryLoader { |
linker.finishLibraryLoad(); |
} else { |
- // TODO(yfriedman): Extract library for Chrome to depend on when using Minted |
- // APKs. This should come from that library instead of reading the same shared |
- // prefs. |
- String packageString = |
- context.getSharedPreferences(MINT_PREFS, Context.MODE_PRIVATE) |
- .getString(CHROME_PACKAGE_PREF, DEFAULT_CHROME_PACKAGE_NAME); |
- |
- if (mLibraryProcessType == LibraryProcessType.PROCESS_CHILD |
- && !context.getPackageName().equals(packageString)) { |
- Context remoteContext = null; |
- try { |
- Log.w(TAG, "package name from context: %s", context.getPackageName()); |
- remoteContext = context.getApplicationContext().createPackageContext( |
- packageString, |
- Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE); |
- } catch (NameNotFoundException e1) { |
- e1.printStackTrace(); |
- } |
- File input = new File(remoteContext.getApplicationInfo().nativeLibraryDir); |
- Log.w(TAG, "load native libraries from remote context: " |
- + input.getAbsolutePath()); |
- for (String library : NativeLibraries.LIBRARIES) { |
- System.load(input.getAbsolutePath() + "/lib" + library + ".so"); |
- } |
- } else { |
- // Load libraries using the system linker. |
- for (String library : NativeLibraries.LIBRARIES) { |
- System.loadLibrary(library); |
- } |
+ // Load libraries using the system linker. |
+ for (String library : NativeLibraries.LIBRARIES) { |
+ System.loadLibrary(library); |
} |
} |
@@ -342,6 +337,12 @@ public class LibraryLoader { |
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { |
return appInfo.sourceDir; |
} |
+ // In minted runtime, getApplicationContext() of its host context returns null, since |
+ // we use reflection to construct the host's context. In this case, simply |
+ // return its host's sourceDir. |
+ if (context.getApplicationContext() == null) { |
+ return appInfo.sourceDir; |
+ } |
PackageInfo packageInfo = PackageUtils.getOwnPackageInfo(context); |
if (packageInfo.splitNames != null) { |
for (int i = 0; i < packageInfo.splitNames.length; ++i) { |