Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(546)

Unified Diff: base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java

Issue 706203003: Update from https://crrev.com/303153 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 97afbea788877ac640dbef61857c71b9c045bed2..28c688dae29c0654db4da036ee202c97a015bc89 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
@@ -55,17 +55,17 @@ public class LibraryLoader {
private static boolean sIsUsingBrowserSharedRelros = false;
private static boolean sLoadAtFixedAddressFailed = false;
- // One-way switch becomes true if the device supports loading the Chromium
- // library directly from the APK.
- private static boolean sLibraryLoadFromApkSupported = false;
+ // One-way switch becomes true if the device supports memory mapping the
+ // APK file with executable permissions.
+ private static boolean sMapApkWithExecPermission = false;
// One-way switch becomes true if the Chromium library was loaded from the
// APK file directly.
private static boolean sLibraryWasLoadedFromApk = false;
// One-way switch becomes false if the Chromium library should be loaded
- // directly from the APK file but it was not aligned.
- private static boolean sLibraryWasAlignedInApk = true;
+ // directly from the APK file but it was compressed or not aligned.
+ private static boolean sLibraryIsMappableInApk = true;
// One-way switch becomes true if the system library loading failed,
// and the right native library was found and loaded by the hack.
@@ -176,12 +176,20 @@ public class LibraryLoader {
if (useChromiumLinker) {
String apkFilePath = null;
+ boolean useMapExecSupportFallback = false;
- // Check if the device supports loading a library directly from the APK file.
+ // Check if the device supports memory mapping the APK file
+ // with executable permissions.
if (context != null) {
apkFilePath = context.getApplicationInfo().sourceDir;
- sLibraryLoadFromApkSupported = Linker.checkLibraryLoadFromApkSupport(
- apkFilePath);
+ sMapApkWithExecPermission = Linker.checkMapExecSupport(apkFilePath);
+ if (!sMapApkWithExecPermission && Linker.isInZipFile()) {
+ Log.w(TAG, "the no map executable support fallback will be used because"
+ + " memory mapping the APK file with executable permissions is"
+ + " not supported");
+ Linker.enableNoMapExecSupportFallback();
+ useMapExecSupportFallback = true;
+ }
} else {
Log.w(TAG, "could not check load from APK support due to null context");
}
@@ -203,18 +211,22 @@ public class LibraryLoader {
String libFilePath = System.mapLibraryName(library);
if (apkFilePath != null && Linker.isInZipFile()) {
// The library is in the APK file.
- if (!Linker.checkLibraryAlignedInApk(apkFilePath, libFilePath)) {
- sLibraryWasAlignedInApk = false;
+ if (!Linker.checkLibraryIsMappableInApk(apkFilePath, libFilePath)) {
+ sLibraryIsMappableInApk = false;
}
- if (!sLibraryLoadFromApkSupported || sLibraryWasAlignedInApk) {
- // Load directly from the APK (or use memory fallback, see
- // crazy_linker_elf_loader.cpp).
- Log.i(TAG, "Loading " + library + " directly from within "
- + apkFilePath);
+ if (sLibraryIsMappableInApk || useMapExecSupportFallback) {
+ // Load directly from the APK (or use the no map executable
+ // support fallback, see crazy_linker_elf_loader.cpp).
zipFilePath = apkFilePath;
+ Log.i(TAG, "Loading " + library + " "
+ + (useMapExecSupportFallback
+ ? "using no map executable support fallback"
+ : "directly")
+ + " from within " + apkFilePath);
} else {
- // Fallback.
- Log.i(TAG, "Loading " + library + " using fallback from within "
+ // Unpack library fallback.
+ Log.i(TAG, "Loading " + library
+ + " using unpack library fallback from within "
+ apkFilePath);
libFilePath = LibraryLoaderHelper.buildFallbackLibrary(
context, library);
@@ -299,10 +311,10 @@ public class LibraryLoader {
// Load a native shared library with the Chromium linker. If the zip file
// path is not null, the library is loaded directly from the zip file.
private static void loadLibrary(@Nullable String zipFilePath, String libFilePath) {
+ Linker.loadLibrary(zipFilePath, libFilePath);
if (zipFilePath != null) {
sLibraryWasLoadedFromApk = true;
}
- Linker.loadLibrary(zipFilePath, libFilePath);
}
// The WebView requires the Command Line to be switched over before
@@ -380,11 +392,13 @@ public class LibraryLoader {
assert Linker.isUsed();
if (sLibraryWasLoadedFromApk) {
- return LibraryLoadFromApkStatusCodes.SUCCESSFUL;
+ return sMapApkWithExecPermission
+ ? LibraryLoadFromApkStatusCodes.SUCCESSFUL
+ : LibraryLoadFromApkStatusCodes.USED_NO_MAP_EXEC_SUPPORT_FALLBACK;
}
- if (!sLibraryWasAlignedInApk) {
- return LibraryLoadFromApkStatusCodes.NOT_ALIGNED;
+ if (!sLibraryIsMappableInApk) {
+ return LibraryLoadFromApkStatusCodes.USED_UNPACK_LIBRARY_FALLBACK;
}
if (context == null) {
@@ -392,7 +406,7 @@ public class LibraryLoader {
return LibraryLoadFromApkStatusCodes.UNKNOWN;
}
- return Linker.checkLibraryLoadFromApkSupport(context.getApplicationInfo().sourceDir)
+ return sMapApkWithExecPermission
? LibraryLoadFromApkStatusCodes.SUPPORTED
: LibraryLoadFromApkStatusCodes.NOT_SUPPORTED;
}

Powered by Google App Engine
This is Rietveld 408576698