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 4e159553d725d095b593ef8fe911264250873ba6..c3b3b35fc5ec0b8b6e4e9b5f868d88a5ddd8901b 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 |
@@ -4,6 +4,7 @@ |
package org.chromium.base.library_loader; |
+import android.content.Context; |
import android.os.SystemClock; |
import android.util.Log; |
@@ -41,16 +42,42 @@ public class LibraryLoader { |
// library_loader_hooks.cc). |
private static boolean sInitialized = false; |
+ // One-way switch becomes true if the system library loading failed, |
+ // and the right native library was found and loaded by the hack. |
+ // The flag is used to report UMA stats later. |
+ private static boolean sNativeLibraryHackWasUsed = false; |
+ |
+ |
/** |
- * This method blocks until the library is fully loaded and initialized. |
+ * TODO: http://crbug.com/354655 |
+ * remove this method once WebViewChromiumFactoryProvider.java |
+ * changes the call to ensureInitialized(null). |
*/ |
public static void ensureInitialized() throws ProcessInitException { |
+ ensureInitialized(null); |
+ } |
+ |
+ /** |
+ * This method blocks until the library is fully loaded and initialized. |
+ * |
+ * @param context The context in which the method is called, the caller |
+ * may pass in a null context if it doesn't know in which context it |
+ * is running, or it doesn't need to work around the issue |
+ * http://b/13216167. |
+ * |
+ * When the context is not null and native library was not extracted |
+ * by Android package manager, the LibraryLoader class |
+ * will extract the native libraries from APK. This is a hack used to |
+ * work around some Sony devices with the following platform bug: |
+ * http://b/13216167. |
+ */ |
+ public static void ensureInitialized(Context context) throws ProcessInitException { |
synchronized (sLock) { |
if (sInitialized) { |
// Already initialized, nothing to do. |
return; |
} |
- loadAlreadyLocked(); |
+ loadAlreadyLocked(context); |
initializeAlreadyLocked(CommandLine.getJavaSwitchesOrNull()); |
} |
} |
@@ -73,9 +100,9 @@ public class LibraryLoader { |
* |
* @throws ProcessInitException if the native library failed to load. |
*/ |
- public static void loadNow() throws ProcessInitException { |
+ public static void loadNow(Context context) throws ProcessInitException { |
synchronized (sLock) { |
- loadAlreadyLocked(); |
+ loadAlreadyLocked(context); |
} |
} |
@@ -93,7 +120,7 @@ public class LibraryLoader { |
} |
// Invoke System.loadLibrary(...), triggering JNI_OnLoad in native code |
- private static void loadAlreadyLocked() throws ProcessInitException { |
+ private static void loadAlreadyLocked(Context context) throws ProcessInitException { |
try { |
if (!sLoaded) { |
assert !sInitialized; |
@@ -108,7 +135,21 @@ public class LibraryLoader { |
if (useChromiumLinker) { |
Linker.loadLibrary(library); |
} else { |
- System.loadLibrary(library); |
+ try { |
+ System.loadLibrary(library); |
+ if (context != null) { |
+ LibraryLoaderHelper.deleteWorkaroundLibrariesAsynchronously( |
+ context); |
+ } |
+ } catch (UnsatisfiedLinkError e) { |
+ if (context != null |
+ && LibraryLoaderHelper.tryLoadLibraryUsingWorkaround(context, |
+ library)) { |
+ sNativeLibraryHackWasUsed = true; |
+ } else { |
+ throw e; |
+ } |
+ } |
} |
} |
if (useChromiumLinker) Linker.finishLibraryLoad(); |
@@ -154,6 +195,8 @@ public class LibraryLoader { |
nativeRecordChromiumAndroidLinkerHistogram(Linker.loadAtFixedAddressFailed(), |
SysUtils.isLowEndDevice()); |
} |
+ |
+ nativeRecordNativeLibraryHack(sNativeLibraryHackWasUsed); |
} |
// Only methods needed before or during normal JNI registration are during System.OnLoad. |
@@ -174,4 +217,6 @@ public class LibraryLoader { |
// Get the version of the native library. This is needed so that we can check we |
// have the right version before initializing the (rest of the) JNI. |
private static native String nativeGetVersionNumber(); |
+ |
+ private static native void nativeRecordNativeLibraryHack(boolean usedHack); |
} |