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_jni/LibraryLoader_jni.h" 16 #include "base/base_switches.h" 17 #include "base/metrics/histogram.h" 18 #include "base/metrics/histogram_functions.h" 19 #include "base/metrics/histogram_macros.h" 20 21 #if BUILDFLAG(ORDERFILE_INSTRUMENTATION) 22 #include "base/android/orderfile/orderfile_instrumentation.h" 23 #endif 24 25 namespace base { 26 namespace android { 27 28 namespace { 29 30 base::AtExitManager* g_at_exit_manager = nullptr; 31 LibraryLoadedHook* g_registration_callback = nullptr; 32 NativeInitializationHook* g_native_initialization_hook = nullptr; 33 LibraryProcessType g_library_process_type = PROCESS_UNINITIALIZED; 34 35 } // namespace 36 GetLibraryProcessType()37LibraryProcessType GetLibraryProcessType() { 38 return g_library_process_type; 39 } 40 IsUsingOrderfileOptimization()41bool IsUsingOrderfileOptimization() { 42 #if BUILDFLAG(SUPPORTS_CODE_ORDERING) 43 return SysUtils::IsLowEndDeviceFromJni(); 44 #else // !SUPPORTS_CODE_ORDERING 45 return false; 46 #endif 47 } 48 SetNativeInitializationHook(NativeInitializationHook native_initialization_hook)49void SetNativeInitializationHook( 50 NativeInitializationHook native_initialization_hook) { 51 g_native_initialization_hook = native_initialization_hook; 52 } 53 SetLibraryLoadedHook(LibraryLoadedHook * func)54void SetLibraryLoadedHook(LibraryLoadedHook* func) { 55 g_registration_callback = func; 56 } 57 JNI_LibraryLoader_LibraryLoaded(JNIEnv * env,jint library_process_type)58static jboolean JNI_LibraryLoader_LibraryLoaded( 59 JNIEnv* env, 60 jint library_process_type) { 61 DCHECK_EQ(g_library_process_type, PROCESS_UNINITIALIZED); 62 g_library_process_type = 63 static_cast<LibraryProcessType>(library_process_type); 64 65 #if BUILDFLAG(ORDERFILE_INSTRUMENTATION) 66 orderfile::StartDelayedDump(); 67 #endif 68 69 #if BUILDFLAG(SUPPORTS_CODE_ORDERING) 70 if (CommandLine::ForCurrentProcess()->HasSwitch( 71 "log-native-library-residency")) { 72 NativeLibraryPrefetcher::MadviseForResidencyCollection(); 73 } else if (IsUsingOrderfileOptimization()) { 74 NativeLibraryPrefetcher::MadviseForOrderfile(); 75 } 76 #endif 77 78 if (g_native_initialization_hook && 79 !g_native_initialization_hook( 80 static_cast<LibraryProcessType>(library_process_type))) 81 return false; 82 if (g_registration_callback && 83 !g_registration_callback( 84 env, nullptr, 85 static_cast<LibraryProcessType>(library_process_type))) { 86 return false; 87 } 88 return true; 89 } 90 LibraryLoaderExitHook()91void LibraryLoaderExitHook() { 92 if (g_at_exit_manager) { 93 delete g_at_exit_manager; 94 g_at_exit_manager = nullptr; 95 } 96 } 97 InitAtExitManager()98void InitAtExitManager() { 99 g_at_exit_manager = new base::AtExitManager(); 100 } 101 102 } // namespace android 103 } // namespace base 104