Index: content/public/android/java/src/org/chromium/content/app/LibraryLoader.java |
diff --git a/content/public/android/java/src/org/chromium/content/app/LibraryLoader.java b/content/public/android/java/src/org/chromium/content/app/LibraryLoader.java |
index bf64b4feae831154cf77918067be6c29bd07b67b..8883255ca4d10707c22872202df91b0a63e6659e 100644 |
--- a/content/public/android/java/src/org/chromium/content/app/LibraryLoader.java |
+++ b/content/public/android/java/src/org/chromium/content/app/LibraryLoader.java |
@@ -8,6 +8,7 @@ import android.text.TextUtils; |
import android.util.Log; |
import org.chromium.base.JNINamespace; |
+import org.chromium.base.SysUtils; |
import org.chromium.content.common.CommandLine; |
import org.chromium.content.common.ProcessInitException; |
import org.chromium.content.common.ResultCodes; |
@@ -108,11 +109,27 @@ public class LibraryLoader { |
try { |
if (!sLoaded) { |
assert !sInitialized; |
- for (String sLibrary : NativeLibraries.libraries) { |
- Log.i(TAG, "loading: " + sLibrary); |
- System.loadLibrary(sLibrary); |
- Log.i(TAG, "loaded: " + sLibrary); |
+ |
+ long startTime = System.currentTimeMillis(); |
+ boolean useContentLinker = Linker.isUsed(); |
+ |
+ if (useContentLinker) |
+ Linker.prepareLibraryLoad(); |
+ |
+ for (String library : NativeLibraries.libraries) { |
+ Log.i(TAG, "Loading: " + library); |
+ if (useContentLinker) |
+ Linker.loadLibrary(library); |
+ else |
+ System.loadLibrary(library); |
} |
+ if (useContentLinker) |
+ Linker.finishLibraryLoad(); |
+ long stopTime = System.currentTimeMillis(); |
+ Log.i(TAG, String.format("Time to load native libraries: %d ms (timestamps %d-%d)", |
+ stopTime - startTime, |
+ startTime % 10000, |
+ stopTime % 10000)); |
sLoaded = true; |
} |
} catch (UnsatisfiedLinkError e) { |
@@ -138,6 +155,10 @@ public class LibraryLoader { |
sInitialized = true; |
CommandLine.enableNativeProxy(); |
TraceEvent.setEnabledToMatchNative(); |
+ // Record histogram for the content linker. |
+ if (Linker.isUsed()) |
+ nativeRecordContentAndroidLinkerHistogram(Linker.loadAtFixedAddressFailed(), |
+ SysUtils.isLowEndDevice()); |
} |
// This is the only method that is registered during System.loadLibrary. We then call it |
@@ -148,4 +169,11 @@ public class LibraryLoader { |
// Return 0 on success, otherwise return the error code from |
// content/public/common/result_codes.h. |
private static native int nativeLibraryLoaded(String[] initCommandLine); |
+ |
+ // Method called to record statistics about the content linker operation, |
+ // i.e. whether the library failed to be loaded at a fixed address, and |
+ // whether the device is 'low-memory'. |
+ private static native void nativeRecordContentAndroidLinkerHistogram( |
+ boolean loadedAtFixedAddressFailed, |
+ boolean isLowMemoryDevice); |
} |