blob: 7194f9e299508e878a9ec4c4196cfe0fd89824fa [file] [log] [blame]
Narayan Kamath8b2c8b92014-03-31 16:44:54 +01001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Andreas Gampe277ccbd2014-11-03 21:36:10 -080017#include "dalvik_system_ZygoteHooks.h"
18
Narayan Kamath8b2c8b92014-03-31 16:44:54 +010019#include <stdlib.h>
20
Andreas Gampe57943812017-12-06 21:39:13 -080021#include <android-base/logging.h>
22#include <android-base/stringprintf.h>
Andreas Gampe46ee31b2016-12-14 10:11:49 -080023
Ian Rogersd582fa42014-11-05 23:46:43 -080024#include "arch/instruction_set.h"
Andreas Gampec6ea7d02017-02-01 16:46:28 -080025#include "art_method-inl.h"
Andreas Gampe57943812017-12-06 21:39:13 -080026#include "base/macros.h"
27#include "base/mutex.h"
Andreas Gampedcc528d2017-12-07 13:37:10 -080028#include "base/runtime_debug.h"
Narayan Kamath8b2c8b92014-03-31 16:44:54 +010029#include "debugger.h"
Andreas Gampeaa120012018-03-28 16:23:24 -070030#include "hidden_api.h"
Mathieu Chartier455f67c2015-03-17 13:48:29 -070031#include "jit/jit.h"
Nicolas Geoffrayc9de61c2018-11-27 17:34:31 +000032#include "jit/jit_code_cache.h"
Vladimir Markoa3ad0cd2018-05-04 10:06:38 +010033#include "jni/java_vm_ext.h"
34#include "jni/jni_internal.h"
Andreas Gampe87583b32017-05-25 11:22:18 -070035#include "native_util.h"
Steven Morelande431e272017-07-18 16:53:49 -070036#include "nativehelper/jni_macros.h"
Andreas Gampe373a9b52017-10-18 09:01:57 -070037#include "nativehelper/scoped_utf_chars.h"
Alex Lighte77b48b2017-02-22 11:08:06 -080038#include "non_debuggable_classes.h"
Nicolas Geoffray68bf3902017-09-07 14:40:48 +010039#include "oat_file.h"
40#include "oat_file_manager.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070041#include "scoped_thread_state_change-inl.h"
Andreas Gampe513061a2017-06-01 09:17:34 -070042#include "stack.h"
Andreas Gampeb486a982017-06-01 13:45:54 -070043#include "thread-current-inl.h"
Alex Lighte77b48b2017-02-22 11:08:06 -080044#include "thread_list.h"
Andreas Gampe40da2862015-02-27 12:49:04 -080045#include "trace.h"
Narayan Kamath8b2c8b92014-03-31 16:44:54 +010046
Narayan Kamathad4b0d22014-04-02 12:06:02 +010047#include <sys/resource.h>
48
Narayan Kamath8b2c8b92014-03-31 16:44:54 +010049namespace art {
50
Alex Lighte77b48b2017-02-22 11:08:06 -080051// Set to true to always determine the non-debuggable classes even if we would not allow a debugger
52// to actually attach.
Andreas Gampedbe54912017-10-19 13:02:03 -070053static bool kAlwaysCollectNonDebuggableClasses =
54 RegisterRuntimeDebugFlag(&kAlwaysCollectNonDebuggableClasses);
Alex Lighte77b48b2017-02-22 11:08:06 -080055
Andreas Gampe46ee31b2016-12-14 10:11:49 -080056using android::base::StringPrintf;
57
Alex Light861af892017-02-28 12:45:36 -080058class ClassSet {
59 public:
Alex Light84740262017-03-01 09:00:28 -080060 // The number of classes we reasonably expect to have to look at. Realistically the number is more
61 // ~10 but there is little harm in having some extra.
62 static constexpr int kClassSetCapacity = 100;
Alex Light861af892017-02-28 12:45:36 -080063
Alex Light84740262017-03-01 09:00:28 -080064 explicit ClassSet(Thread* const self) : self_(self) {
65 self_->GetJniEnv()->PushFrame(kClassSetCapacity);
Alex Light861af892017-02-28 12:45:36 -080066 }
67
Alex Light84740262017-03-01 09:00:28 -080068 ~ClassSet() {
69 self_->GetJniEnv()->PopFrame();
70 }
71
72 void AddClass(ObjPtr<mirror::Class> klass) REQUIRES(Locks::mutator_lock_) {
Vladimir Markobcf17522018-06-01 13:14:32 +010073 class_set_.insert(self_->GetJniEnv()->AddLocalReference<jclass>(klass));
Alex Light84740262017-03-01 09:00:28 -080074 }
75
76 const std::unordered_set<jclass>& GetClasses() const {
Alex Light861af892017-02-28 12:45:36 -080077 return class_set_;
78 }
79
80 private:
Alex Light84740262017-03-01 09:00:28 -080081 Thread* const self_;
82 std::unordered_set<jclass> class_set_;
Alex Light861af892017-02-28 12:45:36 -080083};
84
85static void DoCollectNonDebuggableCallback(Thread* thread, void* data)
Alex Lighte77b48b2017-02-22 11:08:06 -080086 REQUIRES(Locks::mutator_lock_) {
87 class NonDebuggableStacksVisitor : public StackVisitor {
88 public:
Alex Light861af892017-02-28 12:45:36 -080089 NonDebuggableStacksVisitor(Thread* t, ClassSet* class_set)
90 : StackVisitor(t, nullptr, StackVisitor::StackWalkKind::kIncludeInlinedFrames),
91 class_set_(class_set) {}
Alex Lighte77b48b2017-02-22 11:08:06 -080092
Roland Levillainbbc6e7e2018-08-24 16:58:47 +010093 ~NonDebuggableStacksVisitor() override {}
Alex Lighte77b48b2017-02-22 11:08:06 -080094
Roland Levillainbbc6e7e2018-08-24 16:58:47 +010095 bool VisitFrame() override REQUIRES(Locks::mutator_lock_) {
Alex Lighte77b48b2017-02-22 11:08:06 -080096 if (GetMethod()->IsRuntimeMethod()) {
97 return true;
98 }
Alex Light861af892017-02-28 12:45:36 -080099 class_set_->AddClass(GetMethod()->GetDeclaringClass());
Alex Lighte77b48b2017-02-22 11:08:06 -0800100 if (kIsDebugBuild) {
101 LOG(INFO) << GetMethod()->GetDeclaringClass()->PrettyClass()
102 << " might not be fully debuggable/deoptimizable due to "
103 << GetMethod()->PrettyMethod() << " appearing on the stack during zygote fork.";
104 }
105 return true;
106 }
Alex Light861af892017-02-28 12:45:36 -0800107
108 private:
109 ClassSet* class_set_;
Alex Lighte77b48b2017-02-22 11:08:06 -0800110 };
Alex Light861af892017-02-28 12:45:36 -0800111 NonDebuggableStacksVisitor visitor(thread, reinterpret_cast<ClassSet*>(data));
Alex Lighte77b48b2017-02-22 11:08:06 -0800112 visitor.WalkStack();
113}
114
Alex Light861af892017-02-28 12:45:36 -0800115static void CollectNonDebuggableClasses() REQUIRES(!Locks::mutator_lock_) {
Alex Lighte77b48b2017-02-22 11:08:06 -0800116 Runtime* const runtime = Runtime::Current();
Alex Light861af892017-02-28 12:45:36 -0800117 Thread* const self = Thread::Current();
118 // Get the mutator lock.
119 ScopedObjectAccess soa(self);
120 ClassSet classes(self);
121 {
Alex Light84740262017-03-01 09:00:28 -0800122 // Drop the shared mutator lock.
123 ScopedThreadSuspension sts(self, art::ThreadState::kNative);
124 // Get exclusive mutator lock with suspend all.
Andreas Gampe98ea9d92018-10-19 14:06:15 -0700125 ScopedSuspendAll suspend("Checking stacks for non-obsoletable methods!",
126 /*long_suspend=*/false);
Alex Light84740262017-03-01 09:00:28 -0800127 MutexLock mu(Thread::Current(), *Locks::thread_list_lock_);
128 runtime->GetThreadList()->ForEach(DoCollectNonDebuggableCallback, &classes);
Alex Light861af892017-02-28 12:45:36 -0800129 }
Alex Light84740262017-03-01 09:00:28 -0800130 for (jclass klass : classes.GetClasses()) {
131 NonDebuggableClasses::AddNonDebuggableClass(klass);
Alex Light861af892017-02-28 12:45:36 -0800132 }
Alex Lighte77b48b2017-02-22 11:08:06 -0800133}
134
Nicolas Geoffray68bf3902017-09-07 14:40:48 +0100135// Must match values in com.android.internal.os.Zygote.
136enum {
Mathew Inwood597d7f62018-03-22 11:36:47 +0000137 DEBUG_ENABLE_JDWP = 1,
138 DEBUG_ENABLE_CHECKJNI = 1 << 1,
139 DEBUG_ENABLE_ASSERT = 1 << 2,
140 DEBUG_ENABLE_SAFEMODE = 1 << 3,
141 DEBUG_ENABLE_JNI_LOGGING = 1 << 4,
142 DEBUG_GENERATE_DEBUG_INFO = 1 << 5,
143 DEBUG_ALWAYS_JIT = 1 << 6,
144 DEBUG_NATIVE_DEBUGGABLE = 1 << 7,
145 DEBUG_JAVA_DEBUGGABLE = 1 << 8,
146 DISABLE_VERIFIER = 1 << 9,
147 ONLY_USE_SYSTEM_OAT_FILES = 1 << 10,
148 DEBUG_GENERATE_MINI_DEBUG_INFO = 1 << 11,
149 HIDDEN_API_ENFORCEMENT_POLICY_MASK = (1 << 12)
150 | (1 << 13),
Calin Juravle016fcbe22018-05-03 19:47:35 -0700151 PROFILE_SYSTEM_SERVER = 1 << 14,
Mathieu Chartiera88abfa2019-02-04 11:08:29 -0800152 USE_APP_IMAGE_STARTUP_CACHE = 1 << 16,
Mathew Inwood597d7f62018-03-22 11:36:47 +0000153
154 // bits to shift (flags & HIDDEN_API_ENFORCEMENT_POLICY_MASK) by to get a value
155 // corresponding to hiddenapi::EnforcementPolicy
156 API_ENFORCEMENT_POLICY_SHIFT = CTZ(HIDDEN_API_ENFORCEMENT_POLICY_MASK),
Nicolas Geoffray68bf3902017-09-07 14:40:48 +0100157};
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100158
Nicolas Geoffray68bf3902017-09-07 14:40:48 +0100159static uint32_t EnableDebugFeatures(uint32_t runtime_flags) {
Mathieu Chartier6eff38d2015-03-17 09:52:22 -0700160 Runtime* const runtime = Runtime::Current();
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100161 if ((runtime_flags & DEBUG_ENABLE_CHECKJNI) != 0) {
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100162 JavaVMExt* vm = runtime->GetJavaVM();
Ian Rogers68d8b422014-07-17 11:09:10 -0700163 if (!vm->IsCheckJniEnabled()) {
Brian Carlstrom966ce112014-05-12 17:30:36 -0700164 LOG(INFO) << "Late-enabling -Xcheck:jni";
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100165 vm->SetCheckJniEnabled(true);
166 // There's only one thread running at this point, so only one JNIEnv to fix up.
167 Thread::Current()->GetJniEnv()->SetCheckJniEnabled(true);
168 } else {
Brian Carlstrom966ce112014-05-12 17:30:36 -0700169 LOG(INFO) << "Not late-enabling -Xcheck:jni (already on)";
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100170 }
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100171 runtime_flags &= ~DEBUG_ENABLE_CHECKJNI;
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100172 }
173
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100174 if ((runtime_flags & DEBUG_ENABLE_JNI_LOGGING) != 0) {
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100175 gLogVerbosity.third_party_jni = true;
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100176 runtime_flags &= ~DEBUG_ENABLE_JNI_LOGGING;
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100177 }
178
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100179 Dbg::SetJdwpAllowed((runtime_flags & DEBUG_ENABLE_JDWP) != 0);
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100180 runtime_flags &= ~DEBUG_ENABLE_JDWP;
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100181
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100182 const bool safe_mode = (runtime_flags & DEBUG_ENABLE_SAFEMODE) != 0;
Mathieu Chartier6eff38d2015-03-17 09:52:22 -0700183 if (safe_mode) {
Nicolas Geoffray49cda062017-04-21 13:08:25 +0100184 // Only quicken oat files.
185 runtime->AddCompilerOption("--compiler-filter=quicken");
Nicolas Geoffray0f042e02015-11-05 11:32:24 +0000186 runtime->SetSafeMode(true);
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100187 runtime_flags &= ~DEBUG_ENABLE_SAFEMODE;
Andreas Gamped2abbc92014-12-19 09:53:27 -0800188 }
189
190 // This is for backwards compatibility with Dalvik.
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100191 runtime_flags &= ~DEBUG_ENABLE_ASSERT;
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100192
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100193 if ((runtime_flags & DEBUG_ALWAYS_JIT) != 0) {
Siva Chandra05d24152016-01-05 17:43:17 -0800194 jit::JitOptions* jit_options = runtime->GetJITOptions();
195 CHECK(jit_options != nullptr);
David Srbeckycb4f09e2018-10-21 08:45:22 +0100196 Runtime::Current()->DoAndMaybeSwitchInterpreter([=]() {
197 jit_options->SetJitAtFirstUse();
198 });
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100199 runtime_flags &= ~DEBUG_ALWAYS_JIT;
Siva Chandra05d24152016-01-05 17:43:17 -0800200 }
201
Alex Lighte77b48b2017-02-22 11:08:06 -0800202 bool needs_non_debuggable_classes = false;
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100203 if ((runtime_flags & DEBUG_JAVA_DEBUGGABLE) != 0) {
Nicolas Geoffray433b79a2017-01-30 20:54:45 +0000204 runtime->AddCompilerOption("--debuggable");
David Srbecky8f99e0b2018-01-30 14:44:52 +0000205 runtime_flags |= DEBUG_GENERATE_MINI_DEBUG_INFO;
Nicolas Geoffray433b79a2017-01-30 20:54:45 +0000206 runtime->SetJavaDebuggable(true);
Nicolas Geoffray226805d2018-12-14 10:59:02 +0000207 {
208 // Deoptimize the boot image as it may be non-debuggable.
209 ScopedSuspendAll ssa(__FUNCTION__);
210 runtime->DeoptimizeBootImage();
211 }
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100212 runtime_flags &= ~DEBUG_JAVA_DEBUGGABLE;
Alex Lighte77b48b2017-02-22 11:08:06 -0800213 needs_non_debuggable_classes = true;
214 }
215 if (needs_non_debuggable_classes || kAlwaysCollectNonDebuggableClasses) {
216 CollectNonDebuggableClasses();
Nicolas Geoffray433b79a2017-01-30 20:54:45 +0000217 }
218
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100219 if ((runtime_flags & DEBUG_NATIVE_DEBUGGABLE) != 0) {
David Srbecky346dc992016-03-13 22:00:07 +0000220 runtime->AddCompilerOption("--debuggable");
David Srbecky8f99e0b2018-01-30 14:44:52 +0000221 runtime_flags |= DEBUG_GENERATE_DEBUG_INFO;
David Srbeckyf4480162016-03-16 00:06:24 +0000222 runtime->SetNativeDebuggable(true);
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100223 runtime_flags &= ~DEBUG_NATIVE_DEBUGGABLE;
Tamas Berghammerdd5e5e92016-02-12 16:29:00 +0000224 }
225
David Srbecky8f99e0b2018-01-30 14:44:52 +0000226 if ((runtime_flags & DEBUG_GENERATE_MINI_DEBUG_INFO) != 0) {
227 // Generate native minimal debug information to allow backtracing.
228 runtime->AddCompilerOption("--generate-mini-debug-info");
229 runtime_flags &= ~DEBUG_GENERATE_MINI_DEBUG_INFO;
230 }
231
232 if ((runtime_flags & DEBUG_GENERATE_DEBUG_INFO) != 0) {
233 // Generate all native debug information we can (e.g. line-numbers).
234 runtime->AddCompilerOption("--generate-debug-info");
235 runtime_flags &= ~DEBUG_GENERATE_DEBUG_INFO;
236 }
237
Nicolas Geoffray68bf3902017-09-07 14:40:48 +0100238 return runtime_flags;
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100239}
240
241static jlong ZygoteHooks_nativePreFork(JNIEnv* env, jclass) {
242 Runtime* runtime = Runtime::Current();
243 CHECK(runtime->IsZygote()) << "runtime instance not started with -Xzygote";
Narayan Kamath3de95a72014-04-02 12:54:23 +0100244
245 runtime->PreZygoteFork();
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100246
247 // Grab thread before fork potentially makes Thread::pthread_key_self_ unusable.
Ian Rogers6a3c1fc2014-10-31 00:33:20 -0700248 return reinterpret_cast<jlong>(ThreadForEnv(env));
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100249}
250
Nicolas Geoffrayce9ed362018-11-29 03:19:28 +0000251static void ZygoteHooks_nativePostZygoteFork(JNIEnv*, jclass) {
252 Runtime* runtime = Runtime::Current();
253 if (runtime->IsZygote()) {
254 runtime->PostZygoteFork();
255 }
256}
257
Orion Hodsonad28f5e2018-10-17 09:08:17 +0100258static void ZygoteHooks_nativePostForkSystemServer(JNIEnv* env ATTRIBUTE_UNUSED,
259 jclass klass ATTRIBUTE_UNUSED) {
260 // This JIT code cache for system server is created whilst the runtime is still single threaded.
261 // System server has a window where it can create executable pages for this purpose, but this is
262 // turned off after this hook. Consequently, the only JIT mode supported is the dual-view JIT
263 // where one mapping is R->RW and the other is RX. Single view requires RX->RWX->RX.
Nicolas Geoffrayc9de61c2018-11-27 17:34:31 +0000264 if (Runtime::Current()->GetJit() != nullptr) {
265 Runtime::Current()->GetJit()->GetCodeCache()->PostForkChildAction(
266 /* is_system_server= */ true, /* is_zygote= */ false);
267 }
Orion Hodsonad28f5e2018-10-17 09:08:17 +0100268}
269
Nicolas Geoffrayd66c8622015-12-11 14:59:16 +0000270static void ZygoteHooks_nativePostForkChild(JNIEnv* env,
271 jclass,
272 jlong token,
Nicolas Geoffray5510c0a2017-09-12 15:11:37 +0100273 jint runtime_flags,
Nicolas Geoffrayd66c8622015-12-11 14:59:16 +0000274 jboolean is_system_server,
Robert Sesek77d33982018-01-17 18:39:04 -0500275 jboolean is_zygote,
Andreas Gampe6be67ee2014-09-02 21:22:18 -0700276 jstring instruction_set) {
Robert Sesek77d33982018-01-17 18:39:04 -0500277 DCHECK(!(is_system_server && is_zygote));
278
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100279 Thread* thread = reinterpret_cast<Thread*>(token);
280 // Our system thread ID, etc, has changed so reset Thread state.
281 thread->InitAfterFork();
Nicolas Geoffray68bf3902017-09-07 14:40:48 +0100282 runtime_flags = EnableDebugFeatures(runtime_flags);
David Brazdilf50ac102018-10-17 18:00:06 +0100283 hiddenapi::EnforcementPolicy api_enforcement_policy = hiddenapi::EnforcementPolicy::kDisabled;
Nicolas Geoffray68bf3902017-09-07 14:40:48 +0100284
Andreas Gampee095c912019-03-14 13:38:49 -0700285 Runtime* runtime = Runtime::Current();
286
Nicolas Geoffray68bf3902017-09-07 14:40:48 +0100287 if ((runtime_flags & DISABLE_VERIFIER) != 0) {
Andreas Gampee095c912019-03-14 13:38:49 -0700288 runtime->DisableVerifier();
Nicolas Geoffray68bf3902017-09-07 14:40:48 +0100289 runtime_flags &= ~DISABLE_VERIFIER;
290 }
291
Nicolas Geoffrayde1b2a22019-02-27 09:10:57 +0000292 if ((runtime_flags & ONLY_USE_SYSTEM_OAT_FILES) != 0 || is_system_server) {
Andreas Gampee095c912019-03-14 13:38:49 -0700293 runtime->GetOatFileManager().SetOnlyUseSystemOatFiles();
Nicolas Geoffray68bf3902017-09-07 14:40:48 +0100294 runtime_flags &= ~ONLY_USE_SYSTEM_OAT_FILES;
295 }
296
Mathew Inwood597d7f62018-03-22 11:36:47 +0000297 api_enforcement_policy = hiddenapi::EnforcementPolicyFromInt(
298 (runtime_flags & HIDDEN_API_ENFORCEMENT_POLICY_MASK) >> API_ENFORCEMENT_POLICY_SHIFT);
299 runtime_flags &= ~HIDDEN_API_ENFORCEMENT_POLICY_MASK;
David Brazdilc5e5aed2018-01-17 18:26:30 +0000300
Calin Juravle016fcbe22018-05-03 19:47:35 -0700301 bool profile_system_server = (runtime_flags & PROFILE_SYSTEM_SERVER) == PROFILE_SYSTEM_SERVER;
302 runtime_flags &= ~PROFILE_SYSTEM_SERVER;
303
Andreas Gampee095c912019-03-14 13:38:49 -0700304 runtime->SetLoadAppImageStartupCacheEnabled(
Mathieu Chartiera88abfa2019-02-04 11:08:29 -0800305 (runtime_flags & USE_APP_IMAGE_STARTUP_CACHE) != 0u);
306 runtime_flags &= ~USE_APP_IMAGE_STARTUP_CACHE;
307
Nicolas Geoffray68bf3902017-09-07 14:40:48 +0100308 if (runtime_flags != 0) {
309 LOG(ERROR) << StringPrintf("Unknown bits set in runtime_flags: %#x", runtime_flags);
310 }
Andreas Gampe6be67ee2014-09-02 21:22:18 -0700311
Andreas Gampee095c912019-03-14 13:38:49 -0700312 runtime->GetHeap()->PostForkChildAction(thread);
313 if (runtime->GetJit() != nullptr) {
Nicolas Geoffrayc9de61c2018-11-27 17:34:31 +0000314 if (!is_system_server) {
315 // System server already called the JIT cache post fork action in `nativePostForkSystemServer`.
Andreas Gampee095c912019-03-14 13:38:49 -0700316 runtime->GetJit()->GetCodeCache()->PostForkChildAction(
Nicolas Geoffrayc9de61c2018-11-27 17:34:31 +0000317 /* is_system_server= */ false, is_zygote);
318 }
319 // This must be called after EnableDebugFeatures.
Andreas Gampee095c912019-03-14 13:38:49 -0700320 runtime->GetJit()->PostForkChildAction(is_zygote);
Nicolas Geoffrayc9de61c2018-11-27 17:34:31 +0000321 }
Mathieu Chartiera98a2822017-05-24 16:14:10 -0700322
Andreas Gampe40da2862015-02-27 12:49:04 -0800323 // Update tracing.
324 if (Trace::GetMethodTracingMode() != TracingMode::kTracingInactive) {
325 Trace::TraceOutputMode output_mode = Trace::GetOutputMode();
326 Trace::TraceMode trace_mode = Trace::GetMode();
Andreas Gampee34a42c2015-04-25 14:44:29 -0700327 size_t buffer_size = Trace::GetBufferSize();
Andreas Gampe40da2862015-02-27 12:49:04 -0800328
329 // Just drop it.
330 Trace::Abort();
331
332 // Only restart if it was streaming mode.
333 // TODO: Expose buffer size, so we can also do file mode.
334 if (output_mode == Trace::TraceOutputMode::kStreaming) {
Dmitriy Filchenko03c01342016-07-11 17:41:28 -0700335 static constexpr size_t kMaxProcessNameLength = 100;
336 char name_buf[kMaxProcessNameLength] = {};
337 int rc = pthread_getname_np(pthread_self(), name_buf, kMaxProcessNameLength);
Andreas Gampe40da2862015-02-27 12:49:04 -0800338 std::string proc_name;
Dmitriy Filchenko03c01342016-07-11 17:41:28 -0700339
340 if (rc == 0) {
341 // On success use the pthread name.
342 proc_name = name_buf;
Andreas Gampe40da2862015-02-27 12:49:04 -0800343 }
Dmitriy Filchenko03c01342016-07-11 17:41:28 -0700344
345 if (proc_name.empty() || proc_name == "zygote" || proc_name == "zygote64") {
Andreas Gampe40da2862015-02-27 12:49:04 -0800346 // Either no process name, or the name hasn't been changed, yet. Just use pid.
347 pid_t pid = getpid();
348 proc_name = StringPrintf("%u", static_cast<uint32_t>(pid));
349 }
350
Calin Juravlef83e7332015-11-04 16:16:47 +0000351 std::string trace_file = StringPrintf("/data/misc/trace/%s.trace.bin", proc_name.c_str());
352 Trace::Start(trace_file.c_str(),
Calin Juravlef83e7332015-11-04 16:16:47 +0000353 buffer_size,
354 0, // TODO: Expose flags.
355 output_mode,
356 trace_mode,
357 0); // TODO: Expose interval.
358 if (thread->IsExceptionPending()) {
359 ScopedObjectAccess soa(env);
360 thread->ClearException();
Andreas Gampe40da2862015-02-27 12:49:04 -0800361 }
362 }
363 }
364
David Brazdilf50ac102018-10-17 18:00:06 +0100365 bool do_hidden_api_checks = api_enforcement_policy != hiddenapi::EnforcementPolicy::kDisabled;
Robert Sesek77d33982018-01-17 18:39:04 -0500366 DCHECK(!(is_system_server && do_hidden_api_checks))
Mathew Inwood597d7f62018-03-22 11:36:47 +0000367 << "SystemServer should be forked with EnforcementPolicy::kDisable";
Robert Sesek77d33982018-01-17 18:39:04 -0500368 DCHECK(!(is_zygote && do_hidden_api_checks))
Mathew Inwood597d7f62018-03-22 11:36:47 +0000369 << "Child zygote processes should be forked with EnforcementPolicy::kDisable";
Andreas Gampee095c912019-03-14 13:38:49 -0700370 runtime->SetHiddenApiEnforcementPolicy(api_enforcement_policy);
371 runtime->SetDedupeHiddenApiWarnings(true);
David Brazdilf50ac102018-10-17 18:00:06 +0100372 if (api_enforcement_policy != hiddenapi::EnforcementPolicy::kDisabled &&
Andreas Gampee095c912019-03-14 13:38:49 -0700373 runtime->GetHiddenApiEventLogSampleRate() != 0) {
Mathew Inwood1fd97f22018-04-03 15:32:32 +0100374 // Hidden API checks are enabled, and we are sampling access for the event log. Initialize the
375 // random seed, to ensure the sampling is actually random. We do this post-fork, as doing it
376 // pre-fork would result in the same sequence for every forked process.
377 std::srand(static_cast<uint32_t>(NanoTime()));
378 }
David Brazdilc5e5aed2018-01-17 18:26:30 +0000379
Robert Sesek77d33982018-01-17 18:39:04 -0500380 if (is_zygote) {
381 // If creating a child-zygote, do not call into the runtime's post-fork logic.
382 // Doing so would spin up threads for Binder and JDWP. Instead, the Java side
383 // of the child process will call a static main in a class specified by the parent.
384 return;
385 }
386
Nicolas Geoffrayd66c8622015-12-11 14:59:16 +0000387 if (instruction_set != nullptr && !is_system_server) {
Andreas Gampe6be67ee2014-09-02 21:22:18 -0700388 ScopedUtfChars isa_string(env, instruction_set);
389 InstructionSet isa = GetInstructionSetFromString(isa_string.c_str());
jgu21a6da74e2014-09-10 06:57:17 -0400390 Runtime::NativeBridgeAction action = Runtime::NativeBridgeAction::kUnload;
Vladimir Marko33bff252017-11-01 14:35:42 +0000391 if (isa != InstructionSet::kNone && isa != kRuntimeISA) {
Andreas Gampe6be67ee2014-09-02 21:22:18 -0700392 action = Runtime::NativeBridgeAction::kInitialize;
393 }
Andreas Gampee095c912019-03-14 13:38:49 -0700394 runtime->InitNonZygoteOrPostFork(env, is_system_server, action, isa_string.c_str());
jgu21a6da74e2014-09-10 06:57:17 -0400395 } else {
Andreas Gampee095c912019-03-14 13:38:49 -0700396 runtime->InitNonZygoteOrPostFork(
Calin Juravle016fcbe22018-05-03 19:47:35 -0700397 env,
398 is_system_server,
399 Runtime::NativeBridgeAction::kUnload,
Andreas Gampe98ea9d92018-10-19 14:06:15 -0700400 /*isa=*/ nullptr,
Calin Juravle016fcbe22018-05-03 19:47:35 -0700401 profile_system_server);
Andreas Gampe6be67ee2014-09-02 21:22:18 -0700402 }
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100403}
404
Andreas Gampef38a6612016-04-11 08:42:26 -0700405static void ZygoteHooks_startZygoteNoThreadCreation(JNIEnv* env ATTRIBUTE_UNUSED,
406 jclass klass ATTRIBUTE_UNUSED) {
407 Runtime::Current()->SetZygoteNoThreadSection(true);
408}
409
410static void ZygoteHooks_stopZygoteNoThreadCreation(JNIEnv* env ATTRIBUTE_UNUSED,
411 jclass klass ATTRIBUTE_UNUSED) {
412 Runtime::Current()->SetZygoteNoThreadSection(false);
413}
414
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100415static JNINativeMethod gMethods[] = {
416 NATIVE_METHOD(ZygoteHooks, nativePreFork, "()J"),
Nicolas Geoffrayce9ed362018-11-29 03:19:28 +0000417 NATIVE_METHOD(ZygoteHooks, nativePostZygoteFork, "()V"),
Orion Hodsonad28f5e2018-10-17 09:08:17 +0100418 NATIVE_METHOD(ZygoteHooks, nativePostForkSystemServer, "()V"),
Robert Sesek77d33982018-01-17 18:39:04 -0500419 NATIVE_METHOD(ZygoteHooks, nativePostForkChild, "(JIZZLjava/lang/String;)V"),
Andreas Gampef38a6612016-04-11 08:42:26 -0700420 NATIVE_METHOD(ZygoteHooks, startZygoteNoThreadCreation, "()V"),
421 NATIVE_METHOD(ZygoteHooks, stopZygoteNoThreadCreation, "()V"),
Narayan Kamath8b2c8b92014-03-31 16:44:54 +0100422};
423
424void register_dalvik_system_ZygoteHooks(JNIEnv* env) {
425 REGISTER_NATIVE_METHODS("dalvik/system/ZygoteHooks");
426}
427
428} // namespace art