• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()37 LibraryProcessType GetLibraryProcessType() {
38   return g_library_process_type;
39 }
40 
IsUsingOrderfileOptimization()41 bool 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)49 void SetNativeInitializationHook(
50     NativeInitializationHook native_initialization_hook) {
51   g_native_initialization_hook = native_initialization_hook;
52 }
53 
SetLibraryLoadedHook(LibraryLoadedHook * func)54 void SetLibraryLoadedHook(LibraryLoadedHook* func) {
55   g_registration_callback = func;
56 }
57 
JNI_LibraryLoader_LibraryLoaded(JNIEnv * env,jint library_process_type)58 static 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()91 void LibraryLoaderExitHook() {
92   if (g_at_exit_manager) {
93     delete g_at_exit_manager;
94     g_at_exit_manager = nullptr;
95   }
96 }
97 
InitAtExitManager()98 void InitAtExitManager() {
99   g_at_exit_manager = new base::AtExitManager();
100 }
101 
102 }  // namespace android
103 }  // namespace base
104