| 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 89cb5bb6de4d041466c1ff5e00693b2f30b096c1..602358b8e4145dbfac210f73623b12f07e36235b 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
|
| @@ -12,6 +12,8 @@ import org.chromium.base.CommandLine;
|
| import org.chromium.base.JNINamespace;
|
| import org.chromium.base.TraceEvent;
|
|
|
| +import java.util.Locale;
|
| +
|
| import javax.annotation.Nullable;
|
|
|
| /**
|
| @@ -59,6 +61,13 @@ public class LibraryLoader {
|
| // APK file with executable permissions.
|
| private static boolean sMapApkWithExecPermission = false;
|
|
|
| + // One-way switch to indicate whether we probe for memory mapping the APK
|
| + // file with executable permissions. We suppress the probe under some
|
| + // conditions.
|
| + // For more, see:
|
| + // https://code.google.com/p/chromium/issues/detail?id=448084
|
| + private static boolean sProbeMapApkWithExecPermission = true;
|
| +
|
| // One-way switch becomes true if the Chromium library was loaded from the
|
| // APK file directly.
|
| private static boolean sLibraryWasLoadedFromApk = false;
|
| @@ -166,11 +175,30 @@ public class LibraryLoader {
|
| String apkFilePath = null;
|
| boolean useMapExecSupportFallback = false;
|
|
|
| + // If the Android build version pre-dates KitKat and the device
|
| + // manufacturer is Samsung, skip the check for mmap exec support and
|
| + // return false. This avoids triggering a warning on these devices.
|
| + // The version check is included because these devices do not show
|
| + // the warning on later OS builds.
|
| + //
|
| + // For more, see:
|
| + // https://code.google.com/p/chromium/issues/detail?id=448084
|
| + final String manufacturer = android.os.Build.MANUFACTURER;
|
| + final int version = android.os.Build.VERSION.SDK_INT;
|
| + if (manufacturer != null
|
| + && version < android.os.Build.VERSION_CODES.KITKAT
|
| + && manufacturer.toLowerCase(Locale.ENGLISH).contains("samsung")) {
|
| + Log.w(TAG, "Suppressed load from APK support check on this device");
|
| + sProbeMapApkWithExecPermission = false;
|
| + }
|
| +
|
| // Check if the device supports memory mapping the APK file
|
| // with executable permissions.
|
| if (context != null) {
|
| apkFilePath = context.getApplicationInfo().sourceDir;
|
| - sMapApkWithExecPermission = Linker.checkMapExecSupport(apkFilePath);
|
| + if (sProbeMapApkWithExecPermission) {
|
| + 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"
|
| @@ -378,6 +406,10 @@ public class LibraryLoader {
|
| return LibraryLoadFromApkStatusCodes.UNKNOWN;
|
| }
|
|
|
| + if (!sProbeMapApkWithExecPermission) {
|
| + return LibraryLoadFromApkStatusCodes.UNKNOWN;
|
| + }
|
| +
|
| return sMapApkWithExecPermission
|
| ? LibraryLoadFromApkStatusCodes.SUPPORTED
|
| : LibraryLoadFromApkStatusCodes.NOT_SUPPORTED;
|
|
|