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

Side by Side Diff: base/android/java/src/org/chromium/base/library_loader/Linker.java

Issue 684453003: Add UMA for testing whether the Chromium library was page aligned in the APK file. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.base.library_loader; 5 package org.chromium.base.library_loader;
6 6
7 import android.os.Bundle; 7 import android.os.Bundle;
8 import android.os.Parcel; 8 import android.os.Parcel;
9 import android.os.ParcelFileDescriptor; 9 import android.os.ParcelFileDescriptor;
10 import android.os.Parcelable; 10 import android.os.Parcelable;
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 loadLibraryMaybeInZipFile(null, library); 720 loadLibraryMaybeInZipFile(null, library);
721 } 721 }
722 722
723 private static void loadLibraryMaybeInZipFile( 723 private static void loadLibraryMaybeInZipFile(
724 @Nullable String zipFile, String library) { 724 @Nullable String zipFile, String library) {
725 if (DEBUG) Log.i(TAG, "loadLibrary: " + library); 725 if (DEBUG) Log.i(TAG, "loadLibrary: " + library);
726 726
727 // Don't self-load the linker. This is because the build system is 727 // Don't self-load the linker. This is because the build system is
728 // not clever enough to understand that all the libraries packaged 728 // not clever enough to understand that all the libraries packaged
729 // in the final .apk don't need to be explicitly loaded. 729 // in the final .apk don't need to be explicitly loaded.
730 // Also deal with the component build that adds a .cr suffix to the name . 730 if (isLinkerLibrary(library)) {
731 if (library.equals(TAG) || library.equals(TAG + ".cr")) {
732 if (DEBUG) Log.i(TAG, "ignoring self-linker load"); 731 if (DEBUG) Log.i(TAG, "ignoring self-linker load");
733 return; 732 return;
734 } 733 }
735 734
736 synchronized (Linker.class) { 735 synchronized (Linker.class) {
737 ensureInitializedLocked(); 736 ensureInitializedLocked();
738 737
739 // Security: Ensure prepareLibraryLoad() was called before. 738 // Security: Ensure prepareLibraryLoad() was called before.
740 // In theory, this can be done lazily here, but it's more consistent 739 // In theory, this can be done lazily here, but it's more consistent
741 // to use a pair of functions (i.e. prepareLibraryLoad() + finishLib raryLoad()) 740 // to use a pair of functions (i.e. prepareLibraryLoad() + finishLib raryLoad())
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 // only. 813 // only.
815 sCurrentLoadAddress = libInfo.mLoadAddress + libInfo.mLoadSize; 814 sCurrentLoadAddress = libInfo.mLoadAddress + libInfo.mLoadSize;
816 } 815 }
817 816
818 sLoadedLibraries.put(sharedRelRoName, libInfo); 817 sLoadedLibraries.put(sharedRelRoName, libInfo);
819 if (DEBUG) Log.i(TAG, "Library details " + libInfo.toString()); 818 if (DEBUG) Log.i(TAG, "Library details " + libInfo.toString());
820 } 819 }
821 } 820 }
822 821
823 /** 822 /**
823 * Determine whether a library is the linker library. Also deal with the
824 * component build that adds a .cr suffix to the name.
825 */
826 public static boolean isLinkerLibrary(String library) {
827 return library.equals(TAG) || library.equals(TAG + ".cr");
828 }
829
830 /**
824 * Check whether the device supports loading a library directly from the APK file. 831 * Check whether the device supports loading a library directly from the APK file.
825 * 832 *
826 * @param apkFile Filename of the APK. 833 * @param apkFile Filename of the APK.
827 * @return true if supported. 834 * @return true if supported.
828 */ 835 */
829 public static boolean checkLibraryLoadFromApkSupport(String apkFile) { 836 public static boolean checkLibraryLoadFromApkSupport(String apkFile) {
830 assert apkFile != null; 837 assert apkFile != null;
831 synchronized (Linker.class) { 838 synchronized (Linker.class) {
832 ensureInitializedLocked(); 839 ensureInitializedLocked();
833 840
834 if (DEBUG) Log.i(TAG, "checkLibraryLoadFromApkSupported: " + apkFile ); 841 if (DEBUG) Log.i(TAG, "checkLibraryLoadFromApkSupported: " + apkFile );
835 boolean supported = nativeCheckLibraryLoadFromApkSupport(apkFile); 842 boolean supported = nativeCheckLibraryLoadFromApkSupport(apkFile);
836 if (DEBUG) Log.i(TAG, "Loading a library directly from the APK file " + 843 if (DEBUG) Log.i(TAG, "Loading a library directly from the APK file " +
837 (supported ? "" : "NOT ") + "supported"); 844 (supported ? "" : "NOT ") + "supported");
838 return supported; 845 return supported;
839 } 846 }
840 } 847 }
841 848
842 /** 849 /**
850 * Check whether a library is page aligned in the APK file.
851 *
852 * @param apkFile Filename of the APK.
853 * @param library The library's base name.
854 * @return true if page aligned.
855 */
856 public static boolean checkLibraryAlignedInApk(String apkFile, String librar y) {
857 synchronized (Linker.class) {
858 ensureInitializedLocked();
859
860 if (DEBUG) Log.i(TAG, "checkLibraryAlignedInApk: " + apkFile + ", " + library);
861 boolean aligned = nativeCheckLibraryAlignedInApk(apkFile, library);
862 if (DEBUG) Log.i(TAG, library + " is " + (aligned ? "" : "NOT ") +
863 "page aligned in " + apkFile);
864 return aligned;
865 }
866 }
867
868 /**
843 * Move activity from the native thread to the main UI thread. 869 * Move activity from the native thread to the main UI thread.
844 * Called from native code on its own thread. Posts a callback from 870 * Called from native code on its own thread. Posts a callback from
845 * the UI thread back to native code. 871 * the UI thread back to native code.
846 * 872 *
847 * @param opaque Opaque argument. 873 * @param opaque Opaque argument.
848 */ 874 */
849 @CalledByNative 875 @CalledByNative
850 public static void postCallbackOnMainThread(final long opaque) { 876 public static void postCallbackOnMainThread(final long opaque) {
851 ThreadUtils.postOnUiThread(new Runnable() { 877 ThreadUtils.postOnUiThread(new Runnable() {
852 @Override 878 @Override
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 * @return address to pass to future mmap, or 0 on error. 961 * @return address to pass to future mmap, or 0 on error.
936 */ 962 */
937 private static native long nativeGetRandomBaseLoadAddress(long sizeBytes); 963 private static native long nativeGetRandomBaseLoadAddress(long sizeBytes);
938 964
939 /** 965 /**
940 * Native method which checks whether the device supports loading a library 966 * Native method which checks whether the device supports loading a library
941 * directly from the APK file. 967 * directly from the APK file.
942 * 968 *
943 * @param apkFile Filename of the APK. 969 * @param apkFile Filename of the APK.
944 * @return true if supported. 970 * @return true if supported.
945 *
946 */ 971 */
947 private static native boolean nativeCheckLibraryLoadFromApkSupport(String ap kFile); 972 private static native boolean nativeCheckLibraryLoadFromApkSupport(String ap kFile);
948 973
949 /** 974 /**
975 * Native method which checks whether a library is page aligned in the APK f ile.
976 *
977 * @param apkFile Filename of the APK.
978 * @param library The library's base name.
979 * @return true if page aligned.
980 */
981 private static native boolean nativeCheckLibraryAlignedInApk(String apkFile, String library);
982
983 /**
950 * Record information for a given library. 984 * Record information for a given library.
951 * IMPORTANT: Native code knows about this class's fields, so 985 * IMPORTANT: Native code knows about this class's fields, so
952 * don't change them without modifying the corresponding C++ sources. 986 * don't change them without modifying the corresponding C++ sources.
953 * Also, the LibInfo instance owns the ashmem file descriptor. 987 * Also, the LibInfo instance owns the ashmem file descriptor.
954 */ 988 */
955 public static class LibInfo implements Parcelable { 989 public static class LibInfo implements Parcelable {
956 990
957 public LibInfo() { 991 public LibInfo() {
958 mLoadAddress = 0; 992 mLoadAddress = 0;
959 mLoadSize = 0; 993 mLoadSize = 0;
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1074 } 1108 }
1075 } 1109 }
1076 1110
1077 // The map of libraries that are currently loaded in this process. 1111 // The map of libraries that are currently loaded in this process.
1078 private static HashMap<String, LibInfo> sLoadedLibraries = null; 1112 private static HashMap<String, LibInfo> sLoadedLibraries = null;
1079 1113
1080 // Used to pass the shared RELRO Bundle through Binder. 1114 // Used to pass the shared RELRO Bundle through Binder.
1081 public static final String EXTRA_LINKER_SHARED_RELROS = 1115 public static final String EXTRA_LINKER_SHARED_RELROS =
1082 "org.chromium.base.android.linker.shared_relros"; 1116 "org.chromium.base.android.linker.shared_relros";
1083 } 1117 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698