1 /*
2 * Copyright (C) 2011 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
17 #ifndef ART_RUNTIME_RUNTIME_H_
18 #define ART_RUNTIME_RUNTIME_H_
19
20 #include <jni.h>
21 #include <stdio.h>
22
23 #include <forward_list>
24 #include <iosfwd>
25 #include <memory>
26 #include <set>
27 #include <string>
28 #include <utility>
29 #include <vector>
30
31 #include "app_info.h"
32 #include "base/locks.h"
33 #include "base/macros.h"
34 #include "base/mem_map.h"
35 #include "base/metrics/metrics.h"
36 #include "base/string_view_cpp20.h"
37 #include "compat_framework.h"
38 #include "deoptimization_kind.h"
39 #include "dex/dex_file_types.h"
40 #include "experimental_flags.h"
41 #include "gc_root.h"
42 #include "instrumentation.h"
43 #include "jdwp_provider.h"
44 #include "jni/jni_id_manager.h"
45 #include "jni_id_type.h"
46 #include "metrics/reporter.h"
47 #include "obj_ptr.h"
48 #include "offsets.h"
49 #include "process_state.h"
50 #include "quick/quick_method_frame_info.h"
51 #include "reflective_value_visitor.h"
52 #include "runtime_stats.h"
53
54 namespace art {
55
56 namespace gc {
57 class AbstractSystemWeakHolder;
58 class Heap;
59 } // namespace gc
60
61 namespace hiddenapi {
62 enum class EnforcementPolicy;
63 } // namespace hiddenapi
64
65 namespace jit {
66 class Jit;
67 class JitCodeCache;
68 class JitOptions;
69 } // namespace jit
70
71 namespace jni {
72 class SmallLrtAllocator;
73 } // namespace jni
74
75 namespace mirror {
76 class Array;
77 class ClassLoader;
78 class DexCache;
79 template<class T> class ObjectArray;
80 template<class T> class PrimitiveArray;
81 using ByteArray = PrimitiveArray<int8_t>;
82 class String;
83 class Throwable;
84 } // namespace mirror
85 namespace ti {
86 class Agent;
87 class AgentSpec;
88 } // namespace ti
89 namespace verifier {
90 class MethodVerifier;
91 enum class VerifyMode : int8_t;
92 } // namespace verifier
93 class ArenaPool;
94 class ArtMethod;
95 enum class CalleeSaveType: uint32_t;
96 class ClassLinker;
97 class CompilerCallbacks;
98 class Dex2oatImageTest;
99 class DexFile;
100 enum class InstructionSet;
101 class InternTable;
102 class IsMarkedVisitor;
103 class JavaVMExt;
104 class LinearAlloc;
105 class MonitorList;
106 class MonitorPool;
107 class NullPointerHandler;
108 class OatFileAssistantTest;
109 class OatFileManager;
110 class Plugin;
111 struct RuntimeArgumentMap;
112 class RuntimeCallbacks;
113 class SignalCatcher;
114 class StackOverflowHandler;
115 class SuspensionHandler;
116 class ThreadList;
117 class ThreadPool;
118 class Trace;
119 struct TraceConfig;
120 class Transaction;
121
122 using RuntimeOptions = std::vector<std::pair<std::string, const void*>>;
123
124 class Runtime {
125 public:
126 // Parse raw runtime options.
127 static bool ParseOptions(const RuntimeOptions& raw_options,
128 bool ignore_unrecognized,
129 RuntimeArgumentMap* runtime_options);
130
131 // Creates and initializes a new runtime.
132 static bool Create(RuntimeArgumentMap&& runtime_options)
133 SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
134
135 // Creates and initializes a new runtime.
136 static bool Create(const RuntimeOptions& raw_options, bool ignore_unrecognized)
137 SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
138
139 enum class RuntimeDebugState {
140 // This doesn't support any debug features / method tracing. This is the expected state usually.
141 kNonJavaDebuggable,
142 // This supports method tracing and a restricted set of debug features (for ex: redefinition
143 // isn't supported). We transition to this state when method tracing has started or when the
144 // debugger was attached and transition back to NonDebuggable once the tracing has stopped /
145 // the debugger agent has detached..
146 kJavaDebuggable,
147 // The runtime was started as a debuggable runtime. This allows us to support the extended set
148 // of debug features (for ex: redefinition). We never transition out of this state.
149 kJavaDebuggableAtInit
150 };
151
152 bool EnsurePluginLoaded(const char* plugin_name, std::string* error_msg);
153 bool EnsurePerfettoPlugin(std::string* error_msg);
154
155 // IsAotCompiler for compilers that don't have a running runtime. Only dex2oat currently.
IsAotCompiler()156 bool IsAotCompiler() const {
157 return !UseJitCompilation() && IsCompiler();
158 }
159
160 // IsCompiler is any runtime which has a running compiler, either dex2oat or JIT.
IsCompiler()161 bool IsCompiler() const {
162 return compiler_callbacks_ != nullptr;
163 }
164
165 // If a compiler, are we compiling a boot image?
166 bool IsCompilingBootImage() const;
167
168 bool CanRelocate() const;
169
ShouldRelocate()170 bool ShouldRelocate() const {
171 return must_relocate_ && CanRelocate();
172 }
173
MustRelocateIfPossible()174 bool MustRelocateIfPossible() const {
175 return must_relocate_;
176 }
177
IsImageDex2OatEnabled()178 bool IsImageDex2OatEnabled() const {
179 return image_dex2oat_enabled_;
180 }
181
GetCompilerCallbacks()182 CompilerCallbacks* GetCompilerCallbacks() {
183 return compiler_callbacks_;
184 }
185
SetCompilerCallbacks(CompilerCallbacks * callbacks)186 void SetCompilerCallbacks(CompilerCallbacks* callbacks) {
187 CHECK(callbacks != nullptr);
188 compiler_callbacks_ = callbacks;
189 }
190
IsZygote()191 bool IsZygote() const {
192 return is_zygote_;
193 }
194
IsPrimaryZygote()195 bool IsPrimaryZygote() const {
196 return is_primary_zygote_;
197 }
198
IsSystemServer()199 bool IsSystemServer() const {
200 return is_system_server_;
201 }
202
SetAsSystemServer()203 void SetAsSystemServer() {
204 is_system_server_ = true;
205 is_zygote_ = false;
206 is_primary_zygote_ = false;
207 }
208
SetAsZygoteChild(bool is_system_server,bool is_zygote)209 void SetAsZygoteChild(bool is_system_server, bool is_zygote) {
210 // System server should have been set earlier in SetAsSystemServer.
211 CHECK_EQ(is_system_server_, is_system_server);
212 is_zygote_ = is_zygote;
213 is_primary_zygote_ = false;
214 }
215
IsExplicitGcDisabled()216 bool IsExplicitGcDisabled() const {
217 return is_explicit_gc_disabled_;
218 }
219
220 std::string GetCompilerExecutable() const;
221
GetCompilerOptions()222 const std::vector<std::string>& GetCompilerOptions() const {
223 return compiler_options_;
224 }
225
AddCompilerOption(const std::string & option)226 void AddCompilerOption(const std::string& option) {
227 compiler_options_.push_back(option);
228 }
229
GetImageCompilerOptions()230 const std::vector<std::string>& GetImageCompilerOptions() const {
231 return image_compiler_options_;
232 }
233
GetImageLocations()234 const std::vector<std::string>& GetImageLocations() const {
235 return image_locations_;
236 }
237
238 // Starts a runtime, which may cause threads to be started and code to run.
239 bool Start() UNLOCK_FUNCTION(Locks::mutator_lock_);
240
241 bool IsShuttingDown(Thread* self);
IsShuttingDownLocked()242 bool IsShuttingDownLocked() const REQUIRES(Locks::runtime_shutdown_lock_) {
243 return shutting_down_.load(std::memory_order_relaxed);
244 }
IsShuttingDownUnsafe()245 bool IsShuttingDownUnsafe() const {
246 return shutting_down_.load(std::memory_order_relaxed);
247 }
SetShuttingDown()248 void SetShuttingDown() REQUIRES(Locks::runtime_shutdown_lock_) {
249 shutting_down_.store(true, std::memory_order_relaxed);
250 }
251
NumberOfThreadsBeingBorn()252 size_t NumberOfThreadsBeingBorn() const REQUIRES(Locks::runtime_shutdown_lock_) {
253 return threads_being_born_;
254 }
255
StartThreadBirth()256 void StartThreadBirth() REQUIRES(Locks::runtime_shutdown_lock_) {
257 threads_being_born_++;
258 }
259
260 void EndThreadBirth() REQUIRES(Locks::runtime_shutdown_lock_);
261
IsStarted()262 bool IsStarted() const {
263 return started_;
264 }
265
IsFinishedStarting()266 bool IsFinishedStarting() const {
267 return finished_starting_;
268 }
269
270 void RunRootClinits(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
271
Current()272 static Runtime* Current() {
273 return instance_;
274 }
275
276 // Set the current runtime to be the given instance.
277 // Note that this function is not responsible for cleaning up the old instance or taking the
278 // ownership of the new instance.
279 //
280 // For test use only.
TestOnlySetCurrent(Runtime * instance)281 static void TestOnlySetCurrent(Runtime* instance) { instance_ = instance; }
282
283 // Aborts semi-cleanly. Used in the implementation of LOG(FATAL), which most
284 // callers should prefer.
285 NO_RETURN static void Abort(const char* msg) REQUIRES(!Locks::abort_lock_);
286
287 // Returns the "main" ThreadGroup, used when attaching user threads.
288 jobject GetMainThreadGroup() const;
289
290 // Returns the "system" ThreadGroup, used when attaching our internal threads.
291 jobject GetSystemThreadGroup() const;
292
293 // Returns the system ClassLoader which represents the CLASSPATH.
294 jobject GetSystemClassLoader() const;
295
296 // Attaches the calling native thread to the runtime.
297 bool AttachCurrentThread(const char* thread_name,
298 bool as_daemon,
299 jobject thread_group,
300 bool create_peer,
301 bool should_run_callbacks = true);
302
303 void CallExitHook(jint status);
304
305 // Detaches the current native thread from the runtime.
306 void DetachCurrentThread(bool should_run_callbacks = true) REQUIRES(!Locks::mutator_lock_);
307
308 void DumpDeoptimizations(std::ostream& os);
309 void DumpForSigQuit(std::ostream& os);
310 void DumpLockHolders(std::ostream& os);
311
312 ~Runtime();
313
GetBootClassPath()314 const std::vector<std::string>& GetBootClassPath() const {
315 return boot_class_path_;
316 }
317
GetBootClassPathLocations()318 const std::vector<std::string>& GetBootClassPathLocations() const {
319 DCHECK(boot_class_path_locations_.empty() ||
320 boot_class_path_locations_.size() == boot_class_path_.size());
321 return boot_class_path_locations_.empty() ? boot_class_path_ : boot_class_path_locations_;
322 }
323
324 // Dynamically adds an element to boot class path.
325 void AppendToBootClassPath(const std::string& filename,
326 const std::string& location,
327 const std::vector<std::unique_ptr<const art::DexFile>>& dex_files);
328
329 // Same as above, but takes raw pointers.
330 void AppendToBootClassPath(const std::string& filename,
331 const std::string& location,
332 const std::vector<const art::DexFile*>& dex_files);
333
334 // Same as above, but also takes a dex cache for each dex file.
335 void AppendToBootClassPath(
336 const std::string& filename,
337 const std::string& location,
338 const std::vector<std::pair<const art::DexFile*, ObjPtr<mirror::DexCache>>>&
339 dex_files_and_cache);
340
341 // Dynamically adds an element to boot class path and takes ownership of the dex files.
342 void AddExtraBootDexFiles(const std::string& filename,
343 const std::string& location,
344 std::vector<std::unique_ptr<const art::DexFile>>&& dex_files);
345
GetBootClassPathFds()346 const std::vector<int>& GetBootClassPathFds() const {
347 return boot_class_path_fds_;
348 }
349
GetBootClassPathImageFds()350 const std::vector<int>& GetBootClassPathImageFds() const {
351 return boot_class_path_image_fds_;
352 }
353
GetBootClassPathVdexFds()354 const std::vector<int>& GetBootClassPathVdexFds() const {
355 return boot_class_path_vdex_fds_;
356 }
357
GetBootClassPathOatFds()358 const std::vector<int>& GetBootClassPathOatFds() const {
359 return boot_class_path_oat_fds_;
360 }
361
362 // Returns the checksums for the boot image, extensions and extra boot class path dex files,
363 // based on the image spaces and boot class path dex files loaded in memory.
GetBootClassPathChecksums()364 const std::string& GetBootClassPathChecksums() const {
365 return boot_class_path_checksums_;
366 }
367
GetClassPathString()368 const std::string& GetClassPathString() const {
369 return class_path_string_;
370 }
371
GetClassLinker()372 ClassLinker* GetClassLinker() const {
373 return class_linker_;
374 }
375
GetSmallLrtAllocator()376 jni::SmallLrtAllocator* GetSmallLrtAllocator() const {
377 return small_lrt_allocator_;
378 }
379
GetJniIdManager()380 jni::JniIdManager* GetJniIdManager() const {
381 return jni_id_manager_.get();
382 }
383
GetDefaultStackSize()384 size_t GetDefaultStackSize() const {
385 return default_stack_size_;
386 }
387
GetFinalizerTimeoutMs()388 unsigned int GetFinalizerTimeoutMs() const {
389 return finalizer_timeout_ms_;
390 }
391
GetHeap()392 gc::Heap* GetHeap() const {
393 return heap_;
394 }
395
GetInternTable()396 InternTable* GetInternTable() const {
397 DCHECK(intern_table_ != nullptr);
398 return intern_table_;
399 }
400
GetJavaVM()401 JavaVMExt* GetJavaVM() const {
402 return java_vm_.get();
403 }
404
GetMaxSpinsBeforeThinLockInflation()405 size_t GetMaxSpinsBeforeThinLockInflation() const {
406 return max_spins_before_thin_lock_inflation_;
407 }
408
GetMonitorList()409 MonitorList* GetMonitorList() const {
410 return monitor_list_;
411 }
412
GetMonitorPool()413 MonitorPool* GetMonitorPool() const {
414 return monitor_pool_;
415 }
416
417 // Is the given object the special object used to mark a cleared JNI weak global?
418 bool IsClearedJniWeakGlobal(ObjPtr<mirror::Object> obj) REQUIRES_SHARED(Locks::mutator_lock_);
419
420 // Get the special object used to mark a cleared JNI weak global.
421 mirror::Object* GetClearedJniWeakGlobal() REQUIRES_SHARED(Locks::mutator_lock_);
422
423 mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenThrowingException()
424 REQUIRES_SHARED(Locks::mutator_lock_);
425 mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenThrowingOOME()
426 REQUIRES_SHARED(Locks::mutator_lock_);
427 mirror::Throwable* GetPreAllocatedOutOfMemoryErrorWhenHandlingStackOverflow()
428 REQUIRES_SHARED(Locks::mutator_lock_);
429
430 mirror::Throwable* GetPreAllocatedNoClassDefFoundError()
431 REQUIRES_SHARED(Locks::mutator_lock_);
432
GetProperties()433 const std::vector<std::string>& GetProperties() const {
434 return properties_;
435 }
436
GetThreadList()437 ThreadList* GetThreadList() const {
438 return thread_list_;
439 }
440
GetVersion()441 static const char* GetVersion() {
442 return "2.1.0";
443 }
444
IsMethodHandlesEnabled()445 bool IsMethodHandlesEnabled() const {
446 return true;
447 }
448
449 void DisallowNewSystemWeaks() REQUIRES_SHARED(Locks::mutator_lock_);
450 void AllowNewSystemWeaks() REQUIRES_SHARED(Locks::mutator_lock_);
451 // broadcast_for_checkpoint is true when we broadcast for making blocking threads to respond to
452 // checkpoint requests. It's false when we broadcast to unblock blocking threads after system weak
453 // access is reenabled.
454 void BroadcastForNewSystemWeaks(bool broadcast_for_checkpoint = false);
455
456 // Visit all the roots. If only_dirty is true then non-dirty roots won't be visited. If
457 // clean_dirty is true then dirty roots will be marked as non-dirty after visiting.
458 void VisitRoots(RootVisitor* visitor, VisitRootFlags flags = kVisitRootFlagAllRoots)
459 REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
460 REQUIRES_SHARED(Locks::mutator_lock_);
461
462 // Visit image roots, only used for hprof since the GC uses the image space mod union table
463 // instead.
464 void VisitImageRoots(RootVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_);
465
466 // Visit all of the roots we can safely visit concurrently.
467 void VisitConcurrentRoots(RootVisitor* visitor,
468 VisitRootFlags flags = kVisitRootFlagAllRoots)
469 REQUIRES(!Locks::classlinker_classes_lock_, !Locks::trace_lock_)
470 REQUIRES_SHARED(Locks::mutator_lock_);
471
472 // Visit all of the non thread roots, we can do this with mutators unpaused.
473 void VisitNonThreadRoots(RootVisitor* visitor)
474 REQUIRES_SHARED(Locks::mutator_lock_);
475
476 void VisitTransactionRoots(RootVisitor* visitor)
477 REQUIRES_SHARED(Locks::mutator_lock_);
478
479 // Sweep system weaks, the system weak is deleted if the visitor return null. Otherwise, the
480 // system weak is updated to be the visitor's returned value.
481 void SweepSystemWeaks(IsMarkedVisitor* visitor) REQUIRES_SHARED(Locks::mutator_lock_);
482
483 // Walk all reflective objects and visit their targets as well as any method/fields held by the
484 // runtime threads that are marked as being reflective.
485 void VisitReflectiveTargets(ReflectiveValueVisitor* visitor) REQUIRES(Locks::mutator_lock_);
486 // Helper for visiting reflective targets with lambdas for both field and method reflective
487 // targets.
488 template <typename FieldVis, typename MethodVis>
VisitReflectiveTargets(FieldVis && fv,MethodVis && mv)489 void VisitReflectiveTargets(FieldVis&& fv, MethodVis&& mv) REQUIRES(Locks::mutator_lock_) {
490 FunctionReflectiveValueVisitor frvv(fv, mv);
491 VisitReflectiveTargets(&frvv);
492 }
493
494 // Returns a special method that calls into a trampoline for runtime method resolution
495 ArtMethod* GetResolutionMethod();
496
HasResolutionMethod()497 bool HasResolutionMethod() const {
498 return resolution_method_ != nullptr;
499 }
500
501 void SetResolutionMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
ClearResolutionMethod()502 void ClearResolutionMethod() {
503 resolution_method_ = nullptr;
504 }
505
506 ArtMethod* CreateResolutionMethod() REQUIRES_SHARED(Locks::mutator_lock_);
507
508 // Returns a special method that calls into a trampoline for runtime imt conflicts.
509 ArtMethod* GetImtConflictMethod();
510 ArtMethod* GetImtUnimplementedMethod();
511
HasImtConflictMethod()512 bool HasImtConflictMethod() const {
513 return imt_conflict_method_ != nullptr;
514 }
515
ClearImtConflictMethod()516 void ClearImtConflictMethod() {
517 imt_conflict_method_ = nullptr;
518 }
519
520 void FixupConflictTables() REQUIRES_SHARED(Locks::mutator_lock_);
521 void SetImtConflictMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
522 void SetImtUnimplementedMethod(ArtMethod* method) REQUIRES_SHARED(Locks::mutator_lock_);
523
524 ArtMethod* CreateImtConflictMethod(LinearAlloc* linear_alloc)
525 REQUIRES_SHARED(Locks::mutator_lock_);
526
ClearImtUnimplementedMethod()527 void ClearImtUnimplementedMethod() {
528 imt_unimplemented_method_ = nullptr;
529 }
530
HasCalleeSaveMethod(CalleeSaveType type)531 bool HasCalleeSaveMethod(CalleeSaveType type) const {
532 return callee_save_methods_[static_cast<size_t>(type)] != 0u;
533 }
534
535 ArtMethod* GetCalleeSaveMethod(CalleeSaveType type)
536 REQUIRES_SHARED(Locks::mutator_lock_);
537
538 ArtMethod* GetCalleeSaveMethodUnchecked(CalleeSaveType type)
539 REQUIRES_SHARED(Locks::mutator_lock_);
540
541 QuickMethodFrameInfo GetRuntimeMethodFrameInfo(ArtMethod* method)
542 REQUIRES_SHARED(Locks::mutator_lock_);
543
GetCalleeSaveMethodOffset(CalleeSaveType type)544 static constexpr size_t GetCalleeSaveMethodOffset(CalleeSaveType type) {
545 return OFFSETOF_MEMBER(Runtime, callee_save_methods_[static_cast<size_t>(type)]);
546 }
547
GetInstrumentationOffset()548 static constexpr MemberOffset GetInstrumentationOffset() {
549 return MemberOffset(OFFSETOF_MEMBER(Runtime, instrumentation_));
550 }
551
GetInstructionSet()552 InstructionSet GetInstructionSet() const {
553 return instruction_set_;
554 }
555
556 void SetInstructionSet(InstructionSet instruction_set);
557 void ClearInstructionSet();
558
559 void SetCalleeSaveMethod(ArtMethod* method, CalleeSaveType type);
560 void ClearCalleeSaveMethods();
561
562 ArtMethod* CreateCalleeSaveMethod() REQUIRES_SHARED(Locks::mutator_lock_);
563
564 uint64_t GetStat(int kind);
565
GetStats()566 RuntimeStats* GetStats() {
567 return &stats_;
568 }
569
HasStatsEnabled()570 bool HasStatsEnabled() const {
571 return stats_enabled_;
572 }
573
574 void ResetStats(int kinds);
575
576 void SetStatsEnabled(bool new_state)
577 REQUIRES(!Locks::instrument_entrypoints_lock_, !Locks::mutator_lock_);
578
579 enum class NativeBridgeAction { // private
580 kUnload,
581 kInitialize
582 };
583
GetJit()584 jit::Jit* GetJit() const {
585 return jit_.get();
586 }
587
GetJitCodeCache()588 jit::JitCodeCache* GetJitCodeCache() const {
589 return jit_code_cache_.get();
590 }
591
592 // Returns true if JIT compilations are enabled. GetJit() will be not null in this case.
593 bool UseJitCompilation() const;
594
595 void PreZygoteFork();
596 void PostZygoteFork();
597 void InitNonZygoteOrPostFork(
598 JNIEnv* env,
599 bool is_system_server,
600 bool is_child_zygote,
601 NativeBridgeAction action,
602 const char* isa,
603 bool profile_system_server = false);
604
GetInstrumentation()605 const instrumentation::Instrumentation* GetInstrumentation() const {
606 return &instrumentation_;
607 }
608
GetInstrumentation()609 instrumentation::Instrumentation* GetInstrumentation() {
610 return &instrumentation_;
611 }
612
613 void RegisterAppInfo(const std::string& package_name,
614 const std::vector<std::string>& code_paths,
615 const std::string& profile_output_filename,
616 const std::string& ref_profile_filename,
617 int32_t code_type);
618
619 // Transaction support.
620 bool IsActiveTransaction() const;
621 // EnterTransactionMode may suspend.
622 void EnterTransactionMode(bool strict, mirror::Class* root) REQUIRES_SHARED(Locks::mutator_lock_);
623 void ExitTransactionMode();
624 void RollbackAllTransactions() REQUIRES_SHARED(Locks::mutator_lock_);
625 // Transaction rollback and exit transaction are always done together, it's convenience to
626 // do them in one function.
627 void RollbackAndExitTransactionMode() REQUIRES_SHARED(Locks::mutator_lock_);
628 bool IsTransactionAborted() const;
629 const Transaction* GetTransaction() const;
630 Transaction* GetTransaction();
631 bool IsActiveStrictTransactionMode() const;
632
633 void AbortTransactionAndThrowAbortError(Thread* self, const std::string& abort_message)
634 REQUIRES_SHARED(Locks::mutator_lock_);
635 void ThrowTransactionAbortError(Thread* self)
636 REQUIRES_SHARED(Locks::mutator_lock_);
637
638 void RecordWriteFieldBoolean(mirror::Object* obj,
639 MemberOffset field_offset,
640 uint8_t value,
641 bool is_volatile);
642 void RecordWriteFieldByte(mirror::Object* obj,
643 MemberOffset field_offset,
644 int8_t value,
645 bool is_volatile);
646 void RecordWriteFieldChar(mirror::Object* obj,
647 MemberOffset field_offset,
648 uint16_t value,
649 bool is_volatile);
650 void RecordWriteFieldShort(mirror::Object* obj,
651 MemberOffset field_offset,
652 int16_t value,
653 bool is_volatile);
654 void RecordWriteField32(mirror::Object* obj,
655 MemberOffset field_offset,
656 uint32_t value,
657 bool is_volatile);
658 void RecordWriteField64(mirror::Object* obj,
659 MemberOffset field_offset,
660 uint64_t value,
661 bool is_volatile);
662 void RecordWriteFieldReference(mirror::Object* obj,
663 MemberOffset field_offset,
664 ObjPtr<mirror::Object> value,
665 bool is_volatile)
666 REQUIRES_SHARED(Locks::mutator_lock_);
667 void RecordWriteArray(mirror::Array* array, size_t index, uint64_t value)
668 REQUIRES_SHARED(Locks::mutator_lock_);
669 void RecordStrongStringInsertion(ObjPtr<mirror::String> s)
670 REQUIRES(Locks::intern_table_lock_);
671 void RecordWeakStringInsertion(ObjPtr<mirror::String> s)
672 REQUIRES(Locks::intern_table_lock_);
673 void RecordStrongStringRemoval(ObjPtr<mirror::String> s)
674 REQUIRES(Locks::intern_table_lock_);
675 void RecordWeakStringRemoval(ObjPtr<mirror::String> s)
676 REQUIRES(Locks::intern_table_lock_);
677 void RecordResolveString(ObjPtr<mirror::DexCache> dex_cache, dex::StringIndex string_idx)
678 REQUIRES_SHARED(Locks::mutator_lock_);
679 void RecordResolveMethodType(ObjPtr<mirror::DexCache> dex_cache, dex::ProtoIndex proto_idx)
680 REQUIRES_SHARED(Locks::mutator_lock_);
681
682 void SetFaultMessage(const std::string& message);
683
684 void AddCurrentRuntimeFeaturesAsDex2OatArguments(std::vector<std::string>* arg_vector) const;
685
GetImplicitStackOverflowChecks()686 bool GetImplicitStackOverflowChecks() const {
687 return implicit_so_checks_;
688 }
689
GetImplicitSuspendChecks()690 bool GetImplicitSuspendChecks() const {
691 return implicit_suspend_checks_;
692 }
693
GetImplicitNullChecks()694 bool GetImplicitNullChecks() const {
695 return implicit_null_checks_;
696 }
697
698 void DisableVerifier();
699 bool IsVerificationEnabled() const;
700 bool IsVerificationSoftFail() const;
701
SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy)702 void SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy) {
703 hidden_api_policy_ = policy;
704 }
705
GetHiddenApiEnforcementPolicy()706 hiddenapi::EnforcementPolicy GetHiddenApiEnforcementPolicy() const {
707 return hidden_api_policy_;
708 }
709
SetCorePlatformApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy)710 void SetCorePlatformApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy) {
711 core_platform_api_policy_ = policy;
712 }
713
GetCorePlatformApiEnforcementPolicy()714 hiddenapi::EnforcementPolicy GetCorePlatformApiEnforcementPolicy() const {
715 return core_platform_api_policy_;
716 }
717
SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy)718 void SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy policy) {
719 test_api_policy_ = policy;
720 }
721
GetTestApiEnforcementPolicy()722 hiddenapi::EnforcementPolicy GetTestApiEnforcementPolicy() const {
723 return test_api_policy_;
724 }
725
SetHiddenApiExemptions(const std::vector<std::string> & exemptions)726 void SetHiddenApiExemptions(const std::vector<std::string>& exemptions) {
727 hidden_api_exemptions_ = exemptions;
728 }
729
GetHiddenApiExemptions()730 const std::vector<std::string>& GetHiddenApiExemptions() {
731 return hidden_api_exemptions_;
732 }
733
SetDedupeHiddenApiWarnings(bool value)734 void SetDedupeHiddenApiWarnings(bool value) {
735 dedupe_hidden_api_warnings_ = value;
736 }
737
ShouldDedupeHiddenApiWarnings()738 bool ShouldDedupeHiddenApiWarnings() {
739 return dedupe_hidden_api_warnings_;
740 }
741
SetHiddenApiEventLogSampleRate(uint32_t rate)742 void SetHiddenApiEventLogSampleRate(uint32_t rate) {
743 hidden_api_access_event_log_rate_ = rate;
744 }
745
GetHiddenApiEventLogSampleRate()746 uint32_t GetHiddenApiEventLogSampleRate() const {
747 return hidden_api_access_event_log_rate_;
748 }
749
GetProcessPackageName()750 const std::string& GetProcessPackageName() const {
751 return process_package_name_;
752 }
753
SetProcessPackageName(const char * package_name)754 void SetProcessPackageName(const char* package_name) {
755 if (package_name == nullptr) {
756 process_package_name_.clear();
757 } else {
758 process_package_name_ = package_name;
759 }
760 }
761
GetProcessDataDirectory()762 const std::string& GetProcessDataDirectory() const {
763 return process_data_directory_;
764 }
765
SetProcessDataDirectory(const char * data_dir)766 void SetProcessDataDirectory(const char* data_dir) {
767 if (data_dir == nullptr) {
768 process_data_directory_.clear();
769 } else {
770 process_data_directory_ = data_dir;
771 }
772 }
773
GetCpuAbilist()774 const std::vector<std::string>& GetCpuAbilist() const {
775 return cpu_abilist_;
776 }
777
IsRunningOnMemoryTool()778 bool IsRunningOnMemoryTool() const {
779 return is_running_on_memory_tool_;
780 }
781
SetTargetSdkVersion(uint32_t version)782 void SetTargetSdkVersion(uint32_t version) {
783 target_sdk_version_ = version;
784 }
785
GetTargetSdkVersion()786 uint32_t GetTargetSdkVersion() const {
787 return target_sdk_version_;
788 }
789
GetCompatFramework()790 CompatFramework& GetCompatFramework() {
791 return compat_framework_;
792 }
793
GetZygoteMaxFailedBoots()794 uint32_t GetZygoteMaxFailedBoots() const {
795 return zygote_max_failed_boots_;
796 }
797
AreExperimentalFlagsEnabled(ExperimentalFlags flags)798 bool AreExperimentalFlagsEnabled(ExperimentalFlags flags) {
799 return (experimental_flags_ & flags) != ExperimentalFlags::kNone;
800 }
801
802 void CreateJitCodeCache(bool rwx_memory_allowed);
803
804 // Create the JIT and instrumentation and code cache.
805 void CreateJit();
806
GetLinearAllocArenaPool()807 ArenaPool* GetLinearAllocArenaPool() {
808 return linear_alloc_arena_pool_.get();
809 }
GetArenaPool()810 ArenaPool* GetArenaPool() {
811 return arena_pool_.get();
812 }
GetArenaPool()813 const ArenaPool* GetArenaPool() const {
814 return arena_pool_.get();
815 }
GetJitArenaPool()816 ArenaPool* GetJitArenaPool() {
817 return jit_arena_pool_.get();
818 }
819
820 void ReclaimArenaPoolMemory();
821
GetLinearAlloc()822 LinearAlloc* GetLinearAlloc() {
823 return linear_alloc_.get();
824 }
825
GetStartupLinearAlloc()826 LinearAlloc* GetStartupLinearAlloc() {
827 return startup_linear_alloc_.load(std::memory_order_relaxed);
828 }
829
GetJITOptions()830 jit::JitOptions* GetJITOptions() {
831 return jit_options_.get();
832 }
833
IsJavaDebuggable()834 bool IsJavaDebuggable() const {
835 return runtime_debug_state_ == RuntimeDebugState::kJavaDebuggable ||
836 runtime_debug_state_ == RuntimeDebugState::kJavaDebuggableAtInit;
837 }
838
IsJavaDebuggableAtInit()839 bool IsJavaDebuggableAtInit() const {
840 return runtime_debug_state_ == RuntimeDebugState::kJavaDebuggableAtInit;
841 }
842
SetProfileableFromShell(bool value)843 void SetProfileableFromShell(bool value) {
844 is_profileable_from_shell_ = value;
845 }
846
IsProfileableFromShell()847 bool IsProfileableFromShell() const {
848 return is_profileable_from_shell_;
849 }
850
SetProfileable(bool value)851 void SetProfileable(bool value) {
852 is_profileable_ = value;
853 }
854
IsProfileable()855 bool IsProfileable() const {
856 return is_profileable_;
857 }
858
859 void SetRuntimeDebugState(RuntimeDebugState state);
860
861 // Deoptimize the boot image, called for Java debuggable apps.
862 void DeoptimizeBootImage() REQUIRES(Locks::mutator_lock_);
863
IsNativeDebuggable()864 bool IsNativeDebuggable() const {
865 return is_native_debuggable_;
866 }
867
SetNativeDebuggable(bool value)868 void SetNativeDebuggable(bool value) {
869 is_native_debuggable_ = value;
870 }
871
872 void SetSignalHookDebuggable(bool value);
873
AreNonStandardExitsEnabled()874 bool AreNonStandardExitsEnabled() const {
875 return non_standard_exits_enabled_;
876 }
877
SetNonStandardExitsEnabled()878 void SetNonStandardExitsEnabled() {
879 non_standard_exits_enabled_ = true;
880 }
881
AreAsyncExceptionsThrown()882 bool AreAsyncExceptionsThrown() const {
883 return async_exceptions_thrown_;
884 }
885
SetAsyncExceptionsThrown()886 void SetAsyncExceptionsThrown() {
887 async_exceptions_thrown_ = true;
888 }
889
890 // Returns the build fingerprint, if set. Otherwise an empty string is returned.
GetFingerprint()891 std::string GetFingerprint() {
892 return fingerprint_;
893 }
894
895 // Called from class linker.
896 void SetSentinel(ObjPtr<mirror::Object> sentinel) REQUIRES_SHARED(Locks::mutator_lock_);
897 // For testing purpose only.
898 // TODO: Remove this when this is no longer needed (b/116087961).
899 GcRoot<mirror::Object> GetSentinel() REQUIRES_SHARED(Locks::mutator_lock_);
900
901
902 // Use a sentinel for marking entries in a table that have been cleared.
903 // This helps diagnosing in case code tries to wrongly access such
904 // entries.
GetWeakClassSentinel()905 static mirror::Class* GetWeakClassSentinel() {
906 return reinterpret_cast<mirror::Class*>(0xebadbeef);
907 }
908
909 // Create a normal LinearAlloc or low 4gb version if we are 64 bit AOT compiler.
910 LinearAlloc* CreateLinearAlloc();
911 // Setup linear-alloc allocators to stop using the current arena so that the
912 // next allocations, which would be after zygote fork, happens in userfaultfd
913 // visited space.
914 void SetupLinearAllocForPostZygoteFork(Thread* self)
915 REQUIRES(!Locks::mutator_lock_, !Locks::classlinker_classes_lock_);
916
GetOatFileManager()917 OatFileManager& GetOatFileManager() const {
918 DCHECK(oat_file_manager_ != nullptr);
919 return *oat_file_manager_;
920 }
921
922 double GetHashTableMinLoadFactor() const;
923 double GetHashTableMaxLoadFactor() const;
924
IsSafeMode()925 bool IsSafeMode() const {
926 return safe_mode_;
927 }
928
SetSafeMode(bool mode)929 void SetSafeMode(bool mode) {
930 safe_mode_ = mode;
931 }
932
GetDumpNativeStackOnSigQuit()933 bool GetDumpNativeStackOnSigQuit() const {
934 return dump_native_stack_on_sig_quit_;
935 }
936
937 void UpdateProcessState(ProcessState process_state);
938
939 // Returns true if we currently care about long mutator pause.
InJankPerceptibleProcessState()940 bool InJankPerceptibleProcessState() const {
941 return process_state_ == kProcessStateJankPerceptible;
942 }
943
944 void RegisterSensitiveThread() const;
945
SetZygoteNoThreadSection(bool val)946 void SetZygoteNoThreadSection(bool val) {
947 zygote_no_threads_ = val;
948 }
949
IsZygoteNoThreadSection()950 bool IsZygoteNoThreadSection() const {
951 return zygote_no_threads_;
952 }
953
954 // Returns if the code can be deoptimized asynchronously. Code may be compiled with some
955 // optimization that makes it impossible to deoptimize.
956 bool IsAsyncDeoptimizeable(ArtMethod* method, uintptr_t code) const
957 REQUIRES_SHARED(Locks::mutator_lock_);
958
959 // Returns a saved copy of the environment (getenv/setenv values).
960 // Used by Fork to protect against overwriting LD_LIBRARY_PATH, etc.
GetEnvSnapshot()961 char** GetEnvSnapshot() const {
962 return env_snapshot_.GetSnapshot();
963 }
964
965 void AddSystemWeakHolder(gc::AbstractSystemWeakHolder* holder);
966 void RemoveSystemWeakHolder(gc::AbstractSystemWeakHolder* holder);
967
968 void AttachAgent(JNIEnv* env, const std::string& agent_arg, jobject class_loader);
969
GetAgents()970 const std::list<std::unique_ptr<ti::Agent>>& GetAgents() const {
971 return agents_;
972 }
973
974 RuntimeCallbacks* GetRuntimeCallbacks();
975
HasLoadedPlugins()976 bool HasLoadedPlugins() const {
977 return !plugins_.empty();
978 }
979
980 void InitThreadGroups(Thread* self);
981
SetDumpGCPerformanceOnShutdown(bool value)982 void SetDumpGCPerformanceOnShutdown(bool value) {
983 dump_gc_performance_on_shutdown_ = value;
984 }
985
GetDumpGCPerformanceOnShutdown()986 bool GetDumpGCPerformanceOnShutdown() const {
987 return dump_gc_performance_on_shutdown_;
988 }
989
IncrementDeoptimizationCount(DeoptimizationKind kind)990 void IncrementDeoptimizationCount(DeoptimizationKind kind) {
991 DCHECK_LE(kind, DeoptimizationKind::kLast);
992 deoptimization_counts_[static_cast<size_t>(kind)]++;
993 }
994
GetNumberOfDeoptimizations()995 uint32_t GetNumberOfDeoptimizations() const {
996 uint32_t result = 0;
997 for (size_t i = 0; i <= static_cast<size_t>(DeoptimizationKind::kLast); ++i) {
998 result += deoptimization_counts_[i];
999 }
1000 return result;
1001 }
1002
DenyArtApexDataFiles()1003 bool DenyArtApexDataFiles() const {
1004 return deny_art_apex_data_files_;
1005 }
1006
GetMadviseWillNeedTotalDexSize()1007 size_t GetMadviseWillNeedTotalDexSize() const {
1008 return madvise_willneed_total_dex_size_;
1009 }
1010
GetMadviseWillNeedSizeOdex()1011 size_t GetMadviseWillNeedSizeOdex() const {
1012 return madvise_willneed_odex_filesize_;
1013 }
1014
GetMadviseWillNeedSizeArt()1015 size_t GetMadviseWillNeedSizeArt() const {
1016 return madvise_willneed_art_filesize_;
1017 }
1018
GetJdwpOptions()1019 const std::string& GetJdwpOptions() {
1020 return jdwp_options_;
1021 }
1022
GetJdwpProvider()1023 JdwpProvider GetJdwpProvider() const {
1024 return jdwp_provider_;
1025 }
1026
GetJniIdType()1027 JniIdType GetJniIdType() const {
1028 return jni_ids_indirection_;
1029 }
1030
CanSetJniIdType()1031 bool CanSetJniIdType() const {
1032 return GetJniIdType() == JniIdType::kSwapablePointer;
1033 }
1034
1035 // Changes the JniIdType to the given type. Only allowed if CanSetJniIdType(). All threads must be
1036 // suspended to call this function.
1037 void SetJniIdType(JniIdType t);
1038
GetVerifierLoggingThresholdMs()1039 uint32_t GetVerifierLoggingThresholdMs() const {
1040 return verifier_logging_threshold_ms_;
1041 }
1042
1043 // Atomically delete the thread pool if the reference count is 0.
1044 bool DeleteThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
1045
1046 // Wait for all the thread workers to be attached.
1047 void WaitForThreadPoolWorkersToStart() REQUIRES(!Locks::runtime_thread_pool_lock_);
1048
1049 // Scoped usage of the runtime thread pool. Prevents the pool from being
1050 // deleted. Note that the thread pool is only for startup and gets deleted after.
1051 class ScopedThreadPoolUsage {
1052 public:
1053 ScopedThreadPoolUsage();
1054 ~ScopedThreadPoolUsage();
1055
1056 // Return the thread pool.
GetThreadPool()1057 ThreadPool* GetThreadPool() const {
1058 return thread_pool_;
1059 }
1060
1061 private:
1062 ThreadPool* const thread_pool_;
1063 };
1064
ReleaseStartupLinearAlloc()1065 LinearAlloc* ReleaseStartupLinearAlloc() {
1066 return startup_linear_alloc_.exchange(nullptr, std::memory_order_relaxed);
1067 }
1068
LoadAppImageStartupCache()1069 bool LoadAppImageStartupCache() const {
1070 return load_app_image_startup_cache_;
1071 }
1072
SetLoadAppImageStartupCacheEnabled(bool enabled)1073 void SetLoadAppImageStartupCacheEnabled(bool enabled) {
1074 load_app_image_startup_cache_ = enabled;
1075 }
1076
1077 // Reset the startup completed status so that we can call NotifyStartupCompleted again. Should
1078 // only be used for testing.
1079 void ResetStartupCompleted();
1080
1081 // Notify the runtime that application startup is considered completed. Only has effect for the
1082 // first call. Returns whether this was the first call.
1083 bool NotifyStartupCompleted();
1084
1085 // Notify the runtime that the application finished loading some dex/odex files. This is
1086 // called everytime we load a set of dex files in a class loader.
1087 void NotifyDexFileLoaded();
1088
1089 // Return true if startup is already completed.
1090 bool GetStartupCompleted() const;
1091
IsVerifierMissingKThrowFatal()1092 bool IsVerifierMissingKThrowFatal() const {
1093 return verifier_missing_kthrow_fatal_;
1094 }
1095
IsJavaZygoteForkLoopRequired()1096 bool IsJavaZygoteForkLoopRequired() const {
1097 return force_java_zygote_fork_loop_;
1098 }
1099
IsPerfettoHprofEnabled()1100 bool IsPerfettoHprofEnabled() const {
1101 return perfetto_hprof_enabled_;
1102 }
1103
IsPerfettoJavaHeapStackProfEnabled()1104 bool IsPerfettoJavaHeapStackProfEnabled() const {
1105 return perfetto_javaheapprof_enabled_;
1106 }
1107
IsMonitorTimeoutEnabled()1108 bool IsMonitorTimeoutEnabled() const {
1109 return monitor_timeout_enable_;
1110 }
1111
GetMonitorTimeoutNs()1112 uint64_t GetMonitorTimeoutNs() const {
1113 return monitor_timeout_ns_;
1114 }
1115
1116 // Return whether this is system server and it is being profiled.
1117 bool IsSystemServerProfiled() const;
1118
1119 // Return whether we should load oat files as executable or not.
1120 bool GetOatFilesExecutable() const;
1121
GetMetrics()1122 metrics::ArtMetrics* GetMetrics() { return &metrics_; }
1123
GetAppInfo()1124 AppInfo* GetAppInfo() { return &app_info_; }
1125
1126 void RequestMetricsReport(bool synchronous = true);
1127
1128 static void MadviseFileForRange(size_t madvise_size_limit_bytes,
1129 size_t map_size_bytes,
1130 const uint8_t* map_begin,
1131 const uint8_t* map_end,
1132 const std::string& file_name);
1133
GetApexVersions()1134 const std::string& GetApexVersions() const {
1135 return apex_versions_;
1136 }
1137
1138 // Return whether a boot image has a profile. This means it's an in-memory
1139 // image rather that an image loaded from disk.
1140 bool HasImageWithProfile() const;
1141
GetNoSigChain()1142 bool GetNoSigChain() const {
1143 return no_sig_chain_;
1144 }
1145
1146 void AddGeneratedCodeRange(const void* start, size_t size);
1147 void RemoveGeneratedCodeRange(const void* start, size_t size)
1148 REQUIRES_SHARED(Locks::mutator_lock_);
1149
1150 // Trigger a flag reload from system properties or device congfigs.
1151 //
1152 // Should only be called from runtime init and zygote post fork as
1153 // we don't want to change the runtime config midway during execution.
1154 //
1155 // The caller argument should be the name of the function making this call
1156 // and will be used to enforce the appropriate names.
1157 //
1158 // See Flags::ReloadAllFlags as well.
1159 static void ReloadAllFlags(const std::string& caller);
1160
1161 // Parses /apex/apex-info-list.xml to build a string containing apex versions of boot classpath
1162 // jars, which is encoded into .oat files.
1163 static std::string GetApexVersions(ArrayRef<const std::string> boot_class_path_locations);
1164
AllowInMemoryCompilation()1165 bool AllowInMemoryCompilation() const { return allow_in_memory_compilation_; }
1166
1167 // Used by plugin code to attach a hook for OOME.
SetOutOfMemoryErrorHook(void (* hook)())1168 void SetOutOfMemoryErrorHook(void (*hook)()) {
1169 out_of_memory_error_hook_ = hook;
1170 }
1171
OutOfMemoryErrorHook()1172 void OutOfMemoryErrorHook() {
1173 if (out_of_memory_error_hook_ != nullptr) {
1174 out_of_memory_error_hook_();
1175 }
1176 }
1177
1178 private:
1179 static void InitPlatformSignalHandlers();
1180
1181 Runtime();
1182
HandlesSignalsInCompiledCode()1183 bool HandlesSignalsInCompiledCode() const {
1184 return !no_sig_chain_ &&
1185 (implicit_null_checks_ || implicit_so_checks_ || implicit_suspend_checks_);
1186 }
1187
1188 void BlockSignals();
1189
1190 bool Init(RuntimeArgumentMap&& runtime_options)
1191 SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_);
1192 void InitNativeMethods() REQUIRES(!Locks::mutator_lock_);
1193 void RegisterRuntimeNativeMethods(JNIEnv* env);
1194 void InitMetrics();
1195
1196 void StartDaemonThreads() REQUIRES_SHARED(Locks::mutator_lock_);
1197 void StartSignalCatcher();
1198
1199 void MaybeSaveJitProfilingInfo();
1200
1201 // Visit all of the thread roots.
1202 void VisitThreadRoots(RootVisitor* visitor, VisitRootFlags flags)
1203 REQUIRES_SHARED(Locks::mutator_lock_);
1204
1205 // Visit all other roots which must be done with mutators suspended.
1206 void VisitNonConcurrentRoots(RootVisitor* visitor, VisitRootFlags flags)
1207 REQUIRES_SHARED(Locks::mutator_lock_);
1208
1209 // Constant roots are the roots which never change after the runtime is initialized, they only
1210 // need to be visited once per GC cycle.
1211 void VisitConstantRoots(RootVisitor* visitor)
1212 REQUIRES_SHARED(Locks::mutator_lock_);
1213
1214 // Note: To be lock-free, GetFaultMessage temporarily replaces the lock message with null.
1215 // As such, there is a window where a call will return an empty string. In general,
1216 // only aborting code should retrieve this data (via GetFaultMessageForAbortLogging
1217 // friend).
1218 std::string GetFaultMessage();
1219
1220 ThreadPool* AcquireThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
1221 void ReleaseThreadPool() REQUIRES(!Locks::runtime_thread_pool_lock_);
1222
1223 // Caches the apex versions produced by `GetApexVersions`.
1224 void InitializeApexVersions();
1225
1226 void AppendToBootClassPath(const std::string& filename, const std::string& location);
1227
1228 // A pointer to the active runtime or null.
1229 static Runtime* instance_;
1230
1231 // NOTE: these must match the gc::ProcessState values as they come directly from the framework.
1232 static constexpr int kProfileForground = 0;
1233 static constexpr int kProfileBackground = 1;
1234
1235 static constexpr uint32_t kCalleeSaveSize = 6u;
1236
1237 // 64 bit so that we can share the same asm offsets for both 32 and 64 bits.
1238 uint64_t callee_save_methods_[kCalleeSaveSize];
1239 // Pre-allocated exceptions (see Runtime::Init).
1240 GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_throwing_exception_;
1241 GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_throwing_oome_;
1242 GcRoot<mirror::Throwable> pre_allocated_OutOfMemoryError_when_handling_stack_overflow_;
1243 GcRoot<mirror::Throwable> pre_allocated_NoClassDefFoundError_;
1244 ArtMethod* resolution_method_;
1245 ArtMethod* imt_conflict_method_;
1246 // Unresolved method has the same behavior as the conflict method, it is used by the class linker
1247 // for differentiating between unfilled imt slots vs conflict slots in superclasses.
1248 ArtMethod* imt_unimplemented_method_;
1249
1250 // Special sentinel object used to invalid conditions in JNI (cleared weak references) and
1251 // JDWP (invalid references).
1252 GcRoot<mirror::Object> sentinel_;
1253
1254 InstructionSet instruction_set_;
1255
1256 CompilerCallbacks* compiler_callbacks_;
1257 bool is_zygote_;
1258 bool is_primary_zygote_;
1259 bool is_system_server_;
1260 bool must_relocate_;
1261 bool is_concurrent_gc_enabled_;
1262 bool is_explicit_gc_disabled_;
1263 bool image_dex2oat_enabled_;
1264
1265 std::string compiler_executable_;
1266 std::vector<std::string> compiler_options_;
1267 std::vector<std::string> image_compiler_options_;
1268 std::vector<std::string> image_locations_;
1269
1270 std::vector<std::string> boot_class_path_;
1271 std::vector<std::string> boot_class_path_locations_;
1272 std::string boot_class_path_checksums_;
1273 std::vector<int> boot_class_path_fds_;
1274 std::vector<int> boot_class_path_image_fds_;
1275 std::vector<int> boot_class_path_vdex_fds_;
1276 std::vector<int> boot_class_path_oat_fds_;
1277 std::string class_path_string_;
1278 std::vector<std::string> properties_;
1279
1280 std::list<ti::AgentSpec> agent_specs_;
1281 std::list<std::unique_ptr<ti::Agent>> agents_;
1282 std::vector<Plugin> plugins_;
1283
1284 // The default stack size for managed threads created by the runtime.
1285 size_t default_stack_size_;
1286
1287 // Finalizers running for longer than this many milliseconds abort the runtime.
1288 unsigned int finalizer_timeout_ms_;
1289
1290 gc::Heap* heap_;
1291
1292 std::unique_ptr<ArenaPool> jit_arena_pool_;
1293 std::unique_ptr<ArenaPool> arena_pool_;
1294 // This pool is used for linear alloc if we are using userfaultfd GC, or if
1295 // low 4gb pool is required for compiler linear alloc. Otherwise, use
1296 // arena_pool_.
1297 // We need ArtFields to be in low 4gb if we are compiling using a 32 bit image
1298 // on a 64 bit compiler in case we resolve things in the image since the field
1299 // arrays are int arrays in this case.
1300 std::unique_ptr<ArenaPool> linear_alloc_arena_pool_;
1301
1302 // Shared linear alloc for now.
1303 std::unique_ptr<LinearAlloc> linear_alloc_;
1304
1305 // Linear alloc used for allocations during startup. Will be deleted after
1306 // startup. Atomic because the pointer can be concurrently updated to null.
1307 std::atomic<LinearAlloc*> startup_linear_alloc_;
1308
1309 // The number of spins that are done before thread suspension is used to forcibly inflate.
1310 size_t max_spins_before_thin_lock_inflation_;
1311 MonitorList* monitor_list_;
1312 MonitorPool* monitor_pool_;
1313
1314 ThreadList* thread_list_;
1315
1316 InternTable* intern_table_;
1317
1318 ClassLinker* class_linker_;
1319
1320 SignalCatcher* signal_catcher_;
1321
1322 jni::SmallLrtAllocator* small_lrt_allocator_;
1323
1324 std::unique_ptr<jni::JniIdManager> jni_id_manager_;
1325
1326 std::unique_ptr<JavaVMExt> java_vm_;
1327
1328 std::unique_ptr<jit::Jit> jit_;
1329 std::unique_ptr<jit::JitCodeCache> jit_code_cache_;
1330 std::unique_ptr<jit::JitOptions> jit_options_;
1331
1332 // Runtime thread pool. The pool is only for startup and gets deleted after.
1333 std::unique_ptr<ThreadPool> thread_pool_ GUARDED_BY(Locks::runtime_thread_pool_lock_);
1334 size_t thread_pool_ref_count_ GUARDED_BY(Locks::runtime_thread_pool_lock_);
1335
1336 // Fault message, printed when we get a SIGSEGV. Stored as a native-heap object and accessed
1337 // lock-free, so needs to be atomic.
1338 std::atomic<std::string*> fault_message_;
1339
1340 // A non-zero value indicates that a thread has been created but not yet initialized. Guarded by
1341 // the shutdown lock so that threads aren't born while we're shutting down.
1342 size_t threads_being_born_ GUARDED_BY(Locks::runtime_shutdown_lock_);
1343
1344 // Waited upon until no threads are being born.
1345 std::unique_ptr<ConditionVariable> shutdown_cond_ GUARDED_BY(Locks::runtime_shutdown_lock_);
1346
1347 // Set when runtime shutdown is past the point that new threads may attach. Usually
1348 // GUARDED_BY(Locks::runtime_shutdown_lock_). But we need to check it in Abort without the
1349 // lock, because we may already own it.
1350 std::atomic<bool> shutting_down_;
1351
1352 // The runtime is starting to shutdown but is blocked waiting on shutdown_cond_.
1353 bool shutting_down_started_ GUARDED_BY(Locks::runtime_shutdown_lock_);
1354
1355 bool started_;
1356
1357 // New flag added which tells us if the runtime has finished starting. If
1358 // this flag is set then the Daemon threads are created and the class loader
1359 // is created. This flag is needed for knowing if its safe to request CMS.
1360 bool finished_starting_;
1361
1362 // Hooks supported by JNI_CreateJavaVM
1363 jint (*vfprintf_)(FILE* stream, const char* format, va_list ap);
1364 void (*exit_)(jint status);
1365 void (*abort_)();
1366
1367 bool stats_enabled_;
1368 RuntimeStats stats_;
1369
1370 const bool is_running_on_memory_tool_;
1371
1372 std::unique_ptr<TraceConfig> trace_config_;
1373
1374 instrumentation::Instrumentation instrumentation_;
1375
1376 jobject main_thread_group_;
1377 jobject system_thread_group_;
1378
1379 // As returned by ClassLoader.getSystemClassLoader().
1380 jobject system_class_loader_;
1381
1382 // If true, then we dump the GC cumulative timings on shutdown.
1383 bool dump_gc_performance_on_shutdown_;
1384
1385 // Transactions used for pre-initializing classes at compilation time.
1386 // Support nested transactions, maintain a list containing all transactions. Transactions are
1387 // handled under a stack discipline. Because GC needs to go over all transactions, we choose list
1388 // as substantial data structure instead of stack.
1389 std::forward_list<Transaction> preinitialization_transactions_;
1390
1391 // If kNone, verification is disabled. kEnable by default.
1392 verifier::VerifyMode verify_;
1393
1394 // List of supported cpu abis.
1395 std::vector<std::string> cpu_abilist_;
1396
1397 // Specifies target SDK version to allow workarounds for certain API levels.
1398 uint32_t target_sdk_version_;
1399
1400 // ART counterpart for the compat framework (go/compat-framework).
1401 CompatFramework compat_framework_;
1402
1403 // Implicit checks flags.
1404 bool implicit_null_checks_; // NullPointer checks are implicit.
1405 bool implicit_so_checks_; // StackOverflow checks are implicit.
1406 bool implicit_suspend_checks_; // Thread suspension checks are implicit.
1407
1408 // Whether or not the sig chain (and implicitly the fault handler) should be
1409 // disabled. Tools like dex2oat don't need them. This enables
1410 // building a statically link version of dex2oat.
1411 bool no_sig_chain_;
1412
1413 // Force the use of native bridge even if the app ISA matches the runtime ISA.
1414 bool force_native_bridge_;
1415
1416 // Whether or not a native bridge has been loaded.
1417 //
1418 // The native bridge allows running native code compiled for a foreign ISA. The way it works is,
1419 // if standard dlopen fails to load native library associated with native activity, it calls to
1420 // the native bridge to load it and then gets the trampoline for the entry to native activity.
1421 //
1422 // The option 'native_bridge_library_filename' specifies the name of the native bridge.
1423 // When non-empty the native bridge will be loaded from the given file. An empty value means
1424 // that there's no native bridge.
1425 bool is_native_bridge_loaded_;
1426
1427 // Whether we are running under native debugger.
1428 bool is_native_debuggable_;
1429
1430 // whether or not any async exceptions have ever been thrown. This is used to speed up the
1431 // MterpShouldSwitchInterpreters function.
1432 bool async_exceptions_thrown_;
1433
1434 // Whether anything is going to be using the shadow-frame APIs to force a function to return
1435 // early. Doing this requires that (1) we be debuggable and (2) that mterp is exited.
1436 bool non_standard_exits_enabled_;
1437
1438 // Whether Java code needs to be debuggable.
1439 RuntimeDebugState runtime_debug_state_;
1440
1441 bool monitor_timeout_enable_;
1442 uint64_t monitor_timeout_ns_;
1443
1444 // Whether or not this application can be profiled by the shell user,
1445 // even when running on a device that is running in user mode.
1446 bool is_profileable_from_shell_ = false;
1447
1448 // Whether or not this application can be profiled by system services on a
1449 // device running in user mode, but not necessarily by the shell user.
1450 bool is_profileable_ = false;
1451
1452 // The maximum number of failed boots we allow before pruning the dalvik cache
1453 // and trying again. This option is only inspected when we're running as a
1454 // zygote.
1455 uint32_t zygote_max_failed_boots_;
1456
1457 // Enable experimental opcodes that aren't fully specified yet. The intent is to
1458 // eventually publish them as public-usable opcodes, but they aren't ready yet.
1459 //
1460 // Experimental opcodes should not be used by other production code.
1461 ExperimentalFlags experimental_flags_;
1462
1463 // Contains the build fingerprint, if given as a parameter.
1464 std::string fingerprint_;
1465
1466 // Oat file manager, keeps track of what oat files are open.
1467 OatFileManager* oat_file_manager_;
1468
1469 // Whether or not we are on a low RAM device.
1470 bool is_low_memory_mode_;
1471
1472 // Limiting size (in bytes) for applying MADV_WILLNEED on vdex files
1473 // or uncompressed dex files in APKs.
1474 // A 0 for this will turn off madvising to MADV_WILLNEED
1475 size_t madvise_willneed_total_dex_size_;
1476
1477 // Limiting size (in bytes) for applying MADV_WILLNEED on odex files
1478 // A 0 for this will turn off madvising to MADV_WILLNEED
1479 size_t madvise_willneed_odex_filesize_;
1480
1481 // Limiting size (in bytes) for applying MADV_WILLNEED on art files
1482 // A 0 for this will turn off madvising to MADV_WILLNEED
1483 size_t madvise_willneed_art_filesize_;
1484
1485 // Whether the application should run in safe mode, that is, interpreter only.
1486 bool safe_mode_;
1487
1488 // Whether access checks on hidden API should be performed.
1489 hiddenapi::EnforcementPolicy hidden_api_policy_;
1490
1491 // Whether access checks on core platform API should be performed.
1492 hiddenapi::EnforcementPolicy core_platform_api_policy_;
1493
1494 // Whether access checks on test API should be performed.
1495 hiddenapi::EnforcementPolicy test_api_policy_;
1496
1497 // List of signature prefixes of methods that have been removed from the blocklist, and treated
1498 // as if SDK.
1499 std::vector<std::string> hidden_api_exemptions_;
1500
1501 // Do not warn about the same hidden API access violation twice.
1502 // This is only used for testing.
1503 bool dedupe_hidden_api_warnings_;
1504
1505 // How often to log hidden API access to the event log. An integer between 0
1506 // (never) and 0x10000 (always).
1507 uint32_t hidden_api_access_event_log_rate_;
1508
1509 // The package of the app running in this process.
1510 std::string process_package_name_;
1511
1512 // The data directory of the app running in this process.
1513 std::string process_data_directory_;
1514
1515 // Whether threads should dump their native stack on SIGQUIT.
1516 bool dump_native_stack_on_sig_quit_;
1517
1518 // Whether or not we currently care about pause times.
1519 ProcessState process_state_;
1520
1521 // Whether zygote code is in a section that should not start threads.
1522 bool zygote_no_threads_;
1523
1524 // The string containing requested jdwp options
1525 std::string jdwp_options_;
1526
1527 // The jdwp provider we were configured with.
1528 JdwpProvider jdwp_provider_;
1529
1530 // True if jmethodID and jfieldID are opaque Indices. When false (the default) these are simply
1531 // pointers. This is set by -Xopaque-jni-ids:{true,false}.
1532 JniIdType jni_ids_indirection_;
1533
1534 // Set to false in cases where we want to directly control when jni-id
1535 // indirection is changed. This is intended only for testing JNI id swapping.
1536 bool automatically_set_jni_ids_indirection_;
1537
1538 // True if files in /data/misc/apexdata/com.android.art are considered untrustworthy.
1539 bool deny_art_apex_data_files_;
1540
1541 // Whether to allow compiling the boot classpath in memory when the given boot image is unusable.
1542 bool allow_in_memory_compilation_ = false;
1543
1544 // Saved environment.
1545 class EnvSnapshot {
1546 public:
1547 EnvSnapshot() = default;
1548 void TakeSnapshot();
1549 char** GetSnapshot() const;
1550
1551 private:
1552 std::unique_ptr<char*[]> c_env_vector_;
1553 std::vector<std::unique_ptr<std::string>> name_value_pairs_;
1554
1555 DISALLOW_COPY_AND_ASSIGN(EnvSnapshot);
1556 } env_snapshot_;
1557
1558 // Generic system-weak holders.
1559 std::vector<gc::AbstractSystemWeakHolder*> system_weak_holders_;
1560
1561 std::unique_ptr<RuntimeCallbacks> callbacks_;
1562
1563 std::atomic<uint32_t> deoptimization_counts_[
1564 static_cast<uint32_t>(DeoptimizationKind::kLast) + 1];
1565
1566 MemMap protected_fault_page_;
1567
1568 uint32_t verifier_logging_threshold_ms_;
1569
1570 bool load_app_image_startup_cache_ = false;
1571
1572 // If startup has completed, must happen at most once.
1573 std::atomic<bool> startup_completed_ = false;
1574
1575 bool verifier_missing_kthrow_fatal_;
1576 bool force_java_zygote_fork_loop_;
1577 bool perfetto_hprof_enabled_;
1578 bool perfetto_javaheapprof_enabled_;
1579
1580 // Called on out of memory error
1581 void (*out_of_memory_error_hook_)();
1582
1583 metrics::ArtMetrics metrics_;
1584 std::unique_ptr<metrics::MetricsReporter> metrics_reporter_;
1585
1586 // Apex versions of boot classpath jars concatenated in a string. The format
1587 // is of the type:
1588 // '/apex1_version/apex2_version//'
1589 //
1590 // When the apex is the factory version, we don't encode it (for example in
1591 // the third entry in the example above).
1592 std::string apex_versions_;
1593
1594 // The info about the application code paths.
1595 AppInfo app_info_;
1596
1597 // Note: See comments on GetFaultMessage.
1598 friend std::string GetFaultMessageForAbortLogging();
1599 friend class Dex2oatImageTest;
1600 friend class ScopedThreadPoolUsage;
1601 friend class OatFileAssistantTest;
1602 class SetupLinearAllocForZygoteFork;
1603
1604 DISALLOW_COPY_AND_ASSIGN(Runtime);
1605 };
1606
GetMetrics()1607 inline metrics::ArtMetrics* GetMetrics() { return Runtime::Current()->GetMetrics(); }
1608
1609 } // namespace art
1610
1611 #endif // ART_RUNTIME_RUNTIME_H_
1612