xref: /aosp_15_r20/external/cronet/base/android/library_loader/library_loader_hooks.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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()43 LibraryProcessType GetLibraryProcessType() {
44   return g_library_process_type;
45 }
46 
IsUsingOrderfileOptimization()47 bool 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)55 void SetNativeInitializationHook(
56     NativeInitializationHook native_initialization_hook) {
57   g_native_initialization_hook = native_initialization_hook;
58 }
59 
SetLibraryLoadedHook(LibraryLoadedHook * func)60 void SetLibraryLoadedHook(LibraryLoadedHook* func) {
61   g_registration_callback = func;
62 }
63 
JNI_LibraryLoader_LibraryLoaded(JNIEnv * env,jint library_process_type)64 static 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()97 void LibraryLoaderExitHook() {
98   if (g_at_exit_manager) {
99     delete g_at_exit_manager;
100     g_at_exit_manager = nullptr;
101   }
102 }
103 
InitAtExitManager()104 void InitAtExitManager() {
105   g_at_exit_manager = new base::AtExitManager();
106 }
107 
108 }  // namespace android
109 }  // namespace base
110