1 // Copyright 2014 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/android/library_loader/library_loader_hooks.h" 6 7 #include <string> 8 9 #include "base/android/jni_string.h" 10 #include "base/android/library_loader/anchor_functions_buildflags.h" 11 #include "base/android/library_loader/library_prefetcher.h" 12 #include "base/android/orderfile/orderfile_buildflags.h" 13 #include "base/android/sys_utils.h" 14 #include "base/at_exit.h" 15 #include "base/base_switches.h" 16 #include "base/metrics/histogram.h" 17 #include "base/metrics/histogram_functions.h" 18 #include "base/metrics/histogram_macros.h" 19 #include "build/robolectric_buildflags.h" 20 21 #if BUILDFLAG(IS_ROBOLECTRIC) 22 #include "base/base_robolectric_jni/LibraryLoader_jni.h" // nogncheck 23 #else 24 #include "base/base_jni/LibraryLoader_jni.h" 25 #endif 26 27 #if BUILDFLAG(ORDERFILE_INSTRUMENTATION) 28 #include "base/android/orderfile/orderfile_instrumentation.h" 29 #endif 30 31 namespace base { 32 namespace android { 33 34 namespace { 35 36 base::AtExitManager* g_at_exit_manager = nullptr; 37 LibraryLoadedHook* g_registration_callback = nullptr; 38 NativeInitializationHook* g_native_initialization_hook = nullptr; 39 LibraryProcessType g_library_process_type = PROCESS_UNINITIALIZED; 40 41 } // namespace 42 GetLibraryProcessType()43LibraryProcessType GetLibraryProcessType() { 44 return g_library_process_type; 45 } 46 IsUsingOrderfileOptimization()47bool IsUsingOrderfileOptimization() { 48 #if BUILDFLAG(SUPPORTS_CODE_ORDERING) 49 return SysUtils::IsLowEndDeviceFromJni(); 50 #else // !SUPPORTS_CODE_ORDERING 51 return false; 52 #endif 53 } 54 SetNativeInitializationHook(NativeInitializationHook native_initialization_hook)55void SetNativeInitializationHook( 56 NativeInitializationHook native_initialization_hook) { 57 g_native_initialization_hook = native_initialization_hook; 58 } 59 SetLibraryLoadedHook(LibraryLoadedHook * func)60void SetLibraryLoadedHook(LibraryLoadedHook* func) { 61 g_registration_callback = func; 62 } 63 JNI_LibraryLoader_LibraryLoaded(JNIEnv * env,jint library_process_type)64static jboolean JNI_LibraryLoader_LibraryLoaded( 65 JNIEnv* env, 66 jint library_process_type) { 67 DCHECK_EQ(g_library_process_type, PROCESS_UNINITIALIZED); 68 g_library_process_type = 69 static_cast<LibraryProcessType>(library_process_type); 70 71 #if BUILDFLAG(ORDERFILE_INSTRUMENTATION) 72 orderfile::StartDelayedDump(); 73 #endif 74 75 #if BUILDFLAG(SUPPORTS_CODE_ORDERING) 76 if (CommandLine::ForCurrentProcess()->HasSwitch( 77 "log-native-library-residency")) { 78 NativeLibraryPrefetcher::MadviseForResidencyCollection(); 79 } else if (IsUsingOrderfileOptimization()) { 80 NativeLibraryPrefetcher::MadviseForOrderfile(); 81 } 82 #endif 83 84 if (g_native_initialization_hook && 85 !g_native_initialization_hook( 86 static_cast<LibraryProcessType>(library_process_type))) 87 return false; 88 if (g_registration_callback && 89 !g_registration_callback( 90 env, nullptr, 91 static_cast<LibraryProcessType>(library_process_type))) { 92 return false; 93 } 94 return true; 95 } 96 LibraryLoaderExitHook()97void LibraryLoaderExitHook() { 98 if (g_at_exit_manager) { 99 delete g_at_exit_manager; 100 g_at_exit_manager = nullptr; 101 } 102 } 103 InitAtExitManager()104void InitAtExitManager() { 105 g_at_exit_manager = new base::AtExitManager(); 106 } 107 108 } // namespace android 109 } // namespace base 110