Revert^2 "Remove test_per_src from ART tests."

Second attempt at this, which fixes the asan failures.

Remove test_per_src since it is not supported by atest.
Replace it with gtest_isolate which is transparent to atest,
and which still allows us to run tests in parallel.

The size of test binaries halves (from 1GB to 0.5GB).
Test run-time on host is unchanged.
Test run-time on target is 4x faster (tested on walleye).

Added a gtest_main.cc with the gtest isolated main function,
and ART-specific initialization.

Bug: 147819342

Test: m test-art-host-gtest
Test: art/tools/run-gtests.sh
Test: art/test/testrunner/run_build_test_target.py art-gtest-asan
Change-Id: I515c911bb7d44285495802fc66cd732fc8e6d8df
diff --git a/build/Android.gtest.mk b/build/Android.gtest.mk
index fe66bbb..7c2d6ba 100644
--- a/build/Android.gtest.mk
+++ b/build/Android.gtest.mk
@@ -14,6 +14,9 @@
 # limitations under the License.
 #
 
+# Build rules are excluded from Mac, since we can not run ART tests there in the first place.
+ifneq ($(HOST_OS),darwin)
+
 # The path for which all the dex files are relative, not actually the current directory.
 LOCAL_PATH := art/test
 
@@ -507,6 +510,7 @@
   gtest_exe := $(2)
   # Dependencies for all host gtests.
   gtest_deps := $$(ART_HOST_DEX_DEPENDENCIES) \
+    $$(ART_TEST_HOST_GTEST_DEPENDENCIES) \
     $$(HOST_BOOT_IMAGE_JARS) \
     $$($(3)ART_HOST_OUT_SHARED_LIBRARIES)/libicu_jni$$(ART_HOST_SHLIB_EXTENSION) \
     $$($(3)ART_HOST_OUT_SHARED_LIBRARIES)/libjavacore$$(ART_HOST_SHLIB_EXTENSION) \
@@ -538,14 +542,14 @@
     gtest_deps += $$($(3)HOST_BOOT_IMAGE)
   endif
 
-  ART_TEST_HOST_GTEST_DEPENDENCIES += $$(gtest_deps)
-
 .PHONY: $$(gtest_rule)
 $$(gtest_rule): $$(gtest_output)
 
 # Re-run the tests, even if nothing changed. Until the build system has a dedicated "no cache"
 # option, claim to write a file that is never produced.
 $$(gtest_output): .KATI_IMPLICIT_OUTPUTS := $$(gtest_output)-nocache
+# Limit concurrent runs. Each test itself is already highly parallel (and thus memory hungry).
+$$(gtest_output): .KATI_NINJA_POOL := highmem_pool
 $$(gtest_output): NAME := $$(gtest_rule)
 ifeq (,$(SANITIZE_HOST))
 $$(gtest_output): $$(gtest_exe) $$(gtest_deps)
@@ -585,6 +589,40 @@
   gtest_suffix :=
 endef  # define-art-gtest-rule-host
 
+# Global list of all dependencies. All tests depend on all tools.
+# Removal of test_per_src broke the naming convention for dependencies,
+# so the fine-grained dependencies no longer work for now.
+# TODO: Move all dependency tracking to the blueprint file.
+ART_GTEST_ALL_DEX_DEPS := \
+  EmptyUncompressed \
+  EmptyUncompressedAligned \
+  LinkageTest \
+  MainStripped \
+  MainUncompressedAligned \
+  MultiDexUncompressedAligned \
+  VerifierDeps \
+  VerifierDepsMulti  \
+  VerifySoftFailDuringClinit \
+  $(foreach dir,$(GTEST_DEX_DIRECTORIES),$(dir))
+ART_TEST_HOST_GTEST_DEPENDENCIES += \
+  $(HOST_OUT_EXECUTABLES)/dex2oatd \
+  $(HOST_OUT_EXECUTABLES)/dex2oatds \
+  $(HOST_OUT_EXECUTABLES)/dexanalyze \
+  $(HOST_OUT_EXECUTABLES)/dexdiag \
+  $(HOST_OUT_EXECUTABLES)/dexdump \
+  $(HOST_OUT_EXECUTABLES)/dexlayoutd  \
+  $(HOST_OUT_EXECUTABLES)/dexlist \
+  $(HOST_OUT_EXECUTABLES)/dexoptanalyzerd \
+  $(HOST_OUT_EXECUTABLES)/hiddenapid \
+  $(HOST_OUT_EXECUTABLES)/imgdiagd \
+  $(HOST_OUT_EXECUTABLES)/oatdumpd \
+  $(HOST_OUT_EXECUTABLES)/oatdumpds \
+  $(HOST_OUT_EXECUTABLES)/profmand \
+  $(foreach file,$(ART_GTEST_ALL_DEX_DEPS),$(ART_TEST_HOST_GTEST_$(file)_DEX))
+ART_TEST_TARGET_GTEST_DEPENDENCIES += \
+  $(TESTING_ART_APEX) \
+  $(foreach file,$(ART_GTEST_ALL_DEX_DEPS),$(ART_TEST_TARGET_GTEST_$(file)_DEX))
+
 # Add the additional dependencies for the specified test
 # $(1): test name
 define add-art-gtest-dependencies
@@ -779,3 +817,5 @@
 ART_TEST_TARGET_GTEST_VerifySoftFailDuringClinit_DEX :=
 GTEST_DEX_DIRECTORIES :=
 LOCAL_PATH :=
+
+endif # ifneq ($(HOST_OS),darwin)
diff --git a/build/apex/art_apex_test.py b/build/apex/art_apex_test.py
index f6c81db..b97ac23 100755
--- a/build/apex/art_apex_test.py
+++ b/build/apex/art_apex_test.py
@@ -728,251 +728,27 @@
     return 'Testing (Target) Checker'
 
   def run(self):
-    # Check cmdline tests.
-    self._checker.check_optional_art_test_executable('cmdline_parser_test')
-
-    # Check compiler tests.
-    self._checker.check_art_test_executable('atomic_dex_ref_map_test')
-    self._checker.check_art_test_executable('bounds_check_elimination_test')
-    self._checker.check_art_test_executable('codegen_test')
-    self._checker.check_art_test_executable('compiled_method_storage_test')
-    self._checker.check_art_test_executable('constant_folding_test')
-    self._checker.check_art_test_executable('data_type_test')
-    self._checker.check_art_test_executable('dead_code_elimination_test')
-    self._checker.check_art_test_executable('dedupe_set_test')
-    self._checker.check_art_test_executable('dominator_test')
-    self._checker.check_art_test_executable('dwarf_test')
-    self._checker.check_art_test_executable('exception_test')
-    self._checker.check_art_test_executable('find_loops_test')
-    self._checker.check_art_test_executable('graph_checker_test')
-    self._checker.check_art_test_executable('graph_test')
-    self._checker.check_art_test_executable('gvn_test')
-    self._checker.check_art_test_executable('induction_var_analysis_test')
-    self._checker.check_art_test_executable('induction_var_range_test')
-    self._checker.check_art_test_executable('jni_cfi_test')
-    self._checker.check_art_test_executable('jni_compiler_test')
-    self._checker.check_art_test_executable('licm_test')
-    self._checker.check_art_test_executable('linearize_test')
-    self._checker.check_art_test_executable('linker_patch_test')
-    self._checker.check_art_test_executable('live_interval_test')
-    self._checker.check_art_test_executable('live_ranges_test')
-    self._checker.check_art_test_executable('liveness_test')
-    self._checker.check_art_test_executable('load_store_analysis_test')
-    self._checker.check_art_test_executable('load_store_elimination_test')
-    self._checker.check_art_test_executable('loop_optimization_test')
-    self._checker.check_art_test_executable('nodes_test')
-    self._checker.check_art_test_executable('nodes_vector_test')
-    self._checker.check_art_test_executable('optimizing_cfi_test')
-    self._checker.check_art_test_executable('output_stream_test')
-    self._checker.check_art_test_executable('parallel_move_test')
-    self._checker.check_art_test_executable('pretty_printer_test')
-    self._checker.check_art_test_executable('reference_type_propagation_test')
-    self._checker.check_art_test_executable('scheduler_test')
-    self._checker.check_art_test_executable('select_generator_test')
-    self._checker.check_art_test_executable('side_effects_test')
-    self._checker.check_art_test_executable('src_map_elem_test')
-    self._checker.check_art_test_executable('ssa_liveness_analysis_test')
-    self._checker.check_art_test_executable('ssa_test')
-    self._checker.check_art_test_executable('stack_map_test')
-    self._checker.check_art_test_executable('superblock_cloner_test')
-    self._checker.check_art_test_executable('suspend_check_test')
-    self._checker.check_art_test_executable('swap_space_test')
-    # These tests depend on a specific code generator and are conditionally included.
-    self._checker.check_optional_art_test_executable('constant_folding_test')
-    self._checker.check_optional_art_test_executable('dead_code_elimination_test')
-    self._checker.check_optional_art_test_executable('linearize_test')
-    self._checker.check_optional_art_test_executable('live_ranges_test')
-    self._checker.check_optional_art_test_executable('liveness_test')
-    self._checker.check_optional_art_test_executable('managed_register_arm64_test')
-    self._checker.check_optional_art_test_executable('managed_register_arm_test')
-    self._checker.check_optional_art_test_executable('managed_register_x86_64_test')
-    self._checker.check_optional_art_test_executable('managed_register_x86_test')
-    self._checker.check_optional_art_test_executable('register_allocator_test')
-
-    # Check dex2oat tests.
-    self._checker.check_art_test_executable('compiler_driver_test')
-    self._checker.check_art_test_executable('dex2oat_image_test')
-    self._checker.check_art_test_executable('dex2oat_test')
-    self._checker.check_art_test_executable('dex_to_dex_decompiler_test')
-    self._checker.check_art_test_executable('elf_writer_test')
-    self._checker.check_art_test_executable('image_test')
-    self._checker.check_art_test_executable('image_write_read_test')
-    self._checker.check_art_test_executable('index_bss_mapping_encoder_test')
-    self._checker.check_art_test_executable('multi_oat_relative_patcher_test')
-    self._checker.check_art_test_executable('oat_writer_test')
-    self._checker.check_art_test_executable('verifier_deps_test')
-    # These tests depend on a specific code generator and are conditionally included.
-    self._checker.check_optional_art_test_executable('relative_patcher_arm64_test')
-    self._checker.check_optional_art_test_executable('relative_patcher_thumb2_test')
-    self._checker.check_optional_art_test_executable('relative_patcher_x86_64_test')
-    self._checker.check_optional_art_test_executable('relative_patcher_x86_test')
-
-    # Check dexanalyze tests.
-    self._checker.check_optional_art_test_executable('dexanalyze_test')
-
-    # Check dexdiag tests.
-    self._checker.check_optional_art_test_executable('dexdiag_test')
-
-    # Check dexdump tests.
-    self._checker.check_art_test_executable('dexdump_test')
-
-    # Check dexlayout tests.
-    self._checker.check_optional_art_test_executable('dexlayout_test')
-
-    # Check dexlist tests.
-    self._checker.check_art_test_executable('dexlist_test')
-
-    # Check dexoptanalyzer tests.
-    self._checker.check_art_test_executable('dexoptanalyzer_test')
-
-    # Check imgdiag tests.
-    self._checker.check_art_test_executable('imgdiag_test')
-
-    # Check libartbase tests.
-    self._checker.check_art_test_executable('arena_allocator_test')
-    self._checker.check_art_test_executable('bit_field_test')
-    self._checker.check_art_test_executable('bit_memory_region_test')
-    self._checker.check_art_test_executable('bit_string_test')
-    self._checker.check_art_test_executable('bit_struct_test')
-    self._checker.check_art_test_executable('bit_table_test')
-    self._checker.check_art_test_executable('bit_utils_test')
-    self._checker.check_art_test_executable('bit_vector_test')
-    self._checker.check_art_test_executable('fd_file_test')
-    self._checker.check_art_test_executable('file_utils_test')
-    self._checker.check_art_test_executable('hash_set_test')
-    self._checker.check_art_test_executable('hex_dump_test')
-    self._checker.check_art_test_executable('histogram_test')
-    self._checker.check_art_test_executable('indenter_test')
-    self._checker.check_art_test_executable('instruction_set_test')
-    self._checker.check_art_test_executable('intrusive_forward_list_test')
-    self._checker.check_art_test_executable('leb128_test')
-    self._checker.check_art_test_executable('logging_test')
-    self._checker.check_art_test_executable('mem_map_test')
-    self._checker.check_art_test_executable('membarrier_test')
-    self._checker.check_art_test_executable('memfd_test')
-    self._checker.check_art_test_executable('memory_region_test')
-    self._checker.check_art_test_executable('safe_copy_test')
-    self._checker.check_art_test_executable('scoped_flock_test')
-    self._checker.check_art_test_executable('time_utils_test')
-    self._checker.check_art_test_executable('transform_array_ref_test')
-    self._checker.check_art_test_executable('transform_iterator_test')
-    self._checker.check_art_test_executable('utils_test')
-    self._checker.check_art_test_executable('variant_map_test')
-    self._checker.check_art_test_executable('zip_archive_test')
-
-    # Check libartpalette tests.
-    self._checker.check_art_test_executable('palette_test')
-
-    # Check libdexfile tests.
-    self._checker.check_art_test_executable('art_dex_file_loader_test')
+    # Check ART test binaries.
+    self._checker.check_art_test_executable('art_cmdline_tests')
+    self._checker.check_art_test_executable('art_compiler_tests')
+    self._checker.check_art_test_executable('art_dex2oat_tests')
+    self._checker.check_art_test_executable('art_dexanalyze_tests')
+    self._checker.check_art_test_executable('art_dexdiag_tests')
+    self._checker.check_art_test_executable('art_dexdump_tests')
+    self._checker.check_art_test_executable('art_dexlayout_tests')
+    self._checker.check_art_test_executable('art_dexlist_tests')
+    self._checker.check_art_test_executable('art_dexoptanalyzer_tests')
+    self._checker.check_art_test_executable('art_imgdiag_tests')
+    self._checker.check_art_test_executable('art_libartbase_tests')
+    self._checker.check_art_test_executable('art_libartpalette_tests')
     self._checker.check_art_test_executable('art_libdexfile_support_tests')
-    self._checker.check_art_test_executable('class_accessor_test')
-    self._checker.check_art_test_executable('code_item_accessors_test')
-    self._checker.check_art_test_executable('compact_dex_file_test')
-    self._checker.check_art_test_executable('compact_offset_table_test')
-    self._checker.check_art_test_executable('descriptors_names_test')
-    self._checker.check_art_test_executable('dex_file_loader_test')
-    self._checker.check_art_test_executable('dex_file_verifier_test')
-    self._checker.check_art_test_executable('dex_instruction_test')
-    self._checker.check_art_test_executable('primitive_test')
-    self._checker.check_art_test_executable('string_reference_test')
-    self._checker.check_art_test_executable('test_dex_file_builder_test')
-    self._checker.check_art_test_executable('type_lookup_table_test')
-    self._checker.check_art_test_executable('utf_test')
-
-    # Check libprofile tests.
-    self._checker.check_optional_art_test_executable('profile_boot_info_test')
-    self._checker.check_optional_art_test_executable('profile_compilation_info_test')
-
-    # Check oatdump tests.
-    self._checker.check_art_test_executable('oatdump_app_test')
-    self._checker.check_art_test_executable('oatdump_image_test')
-    self._checker.check_art_test_executable('oatdump_test')
-
-    # Check profman tests.
-    self._checker.check_art_test_executable('profile_assistant_test')
-
-    # Check runtime compiler tests.
-    self._checker.check_art_test_executable('module_exclusion_test')
-    self._checker.check_art_test_executable('reflection_test')
-
-    # Check runtime tests.
-    self._checker.check_art_test_executable('arch_test')
-    self._checker.check_art_test_executable('barrier_test')
-    self._checker.check_art_test_executable('card_table_test')
-    self._checker.check_art_test_executable('cha_test')
-    self._checker.check_art_test_executable('class_linker_test')
-    self._checker.check_art_test_executable('class_loader_context_test')
-    self._checker.check_art_test_executable('class_table_test')
-    self._checker.check_art_test_executable('compiler_filter_test')
-    self._checker.check_art_test_executable('dex_cache_test')
-    self._checker.check_art_test_executable('dlmalloc_space_random_test')
-    self._checker.check_art_test_executable('dlmalloc_space_static_test')
-    self._checker.check_art_test_executable('entrypoints_order_test')
-    self._checker.check_art_test_executable('exec_utils_test')
-    self._checker.check_art_test_executable('gtest_test')
-    self._checker.check_art_test_executable('handle_scope_test')
-    self._checker.check_art_test_executable('heap_test')
-    self._checker.check_art_test_executable('heap_verification_test')
-    self._checker.check_art_test_executable('hidden_api_test')
-    self._checker.check_art_test_executable('image_space_test')
-    self._checker.check_art_test_executable('immune_spaces_test')
-    self._checker.check_art_test_executable('imtable_test')
-    self._checker.check_art_test_executable('indirect_reference_table_test')
-    self._checker.check_art_test_executable('instruction_set_features_arm64_test')
-    self._checker.check_art_test_executable('instruction_set_features_arm_test')
-    self._checker.check_art_test_executable('instruction_set_features_test')
-    self._checker.check_art_test_executable('instruction_set_features_x86_64_test')
-    self._checker.check_art_test_executable('instruction_set_features_x86_test')
-    self._checker.check_art_test_executable('instrumentation_test')
-    self._checker.check_art_test_executable('intern_table_test')
-    self._checker.check_art_test_executable('java_vm_ext_test')
-    self._checker.check_art_test_executable('jit_memory_region_test')
-    self._checker.check_art_test_executable('jni_internal_test')
-    self._checker.check_art_test_executable('large_object_space_test')
-    self._checker.check_art_test_executable('math_entrypoints_test')
-    self._checker.check_art_test_executable('memcmp16_test')
-    self._checker.check_art_test_executable('method_handles_test')
-    self._checker.check_art_test_executable('method_type_test')
-    self._checker.check_art_test_executable('method_verifier_test')
-    self._checker.check_art_test_executable('mod_union_table_test')
-    self._checker.check_art_test_executable('monitor_pool_test')
-    self._checker.check_art_test_executable('monitor_test')
-    self._checker.check_art_test_executable('mutex_test')
-    self._checker.check_art_test_executable('oat_file_assistant_test')
-    self._checker.check_art_test_executable('oat_file_test')
-    self._checker.check_art_test_executable('object_test')
-    self._checker.check_art_test_executable('parsed_options_test')
-    self._checker.check_art_test_executable('prebuilt_tools_test')
-    self._checker.check_art_test_executable('profiling_info_test')
-    self._checker.check_art_test_executable('profile_saver_test')
-    self._checker.check_art_test_executable('proxy_test')
-    self._checker.check_art_test_executable('quick_trampoline_entrypoints_test')
-    self._checker.check_art_test_executable('reference_queue_test')
-    self._checker.check_art_test_executable('reference_table_test')
-    self._checker.check_art_test_executable('reg_type_test')
-    self._checker.check_art_test_executable('rosalloc_space_random_test')
-    self._checker.check_art_test_executable('rosalloc_space_static_test')
-    self._checker.check_art_test_executable('runtime_callbacks_test')
-    self._checker.check_art_test_executable('runtime_test')
-    self._checker.check_art_test_executable('safe_math_test')
-    self._checker.check_art_test_executable('space_bitmap_test')
-    self._checker.check_art_test_executable('space_create_test')
-    self._checker.check_art_test_executable('stub_test')
-    self._checker.check_art_test_executable('subtype_check_info_test')
-    self._checker.check_art_test_executable('subtype_check_test')
-    self._checker.check_art_test_executable('system_weak_test')
-    self._checker.check_art_test_executable('task_processor_test')
-    self._checker.check_art_test_executable('thread_pool_test')
-    self._checker.check_art_test_executable('timing_logger_test')
-    self._checker.check_art_test_executable('transaction_test')
-    self._checker.check_art_test_executable('two_runtimes_test')
-    self._checker.check_art_test_executable('unstarted_runtime_test')
-    self._checker.check_art_test_executable('var_handle_test')
-    self._checker.check_art_test_executable('vdex_file_test')
-
-    # Check sigchainlib tests.
-    self._checker.check_art_test_executable('sigchain_test')
+    self._checker.check_art_test_executable('art_libdexfile_tests')
+    self._checker.check_art_test_executable('art_libprofile_tests')
+    self._checker.check_art_test_executable('art_oatdump_tests')
+    self._checker.check_art_test_executable('art_profman_tests')
+    self._checker.check_art_test_executable('art_runtime_compiler_tests')
+    self._checker.check_art_test_executable('art_runtime_tests')
+    self._checker.check_art_test_executable('art_sigchain_tests')
 
     # Check ART test (internal) libraries.
     self._checker.check_native_library('libart-gtest')
diff --git a/compiler/optimizing/codegen_test_utils.h b/compiler/optimizing/codegen_test_utils.h
index 9fbd7d6..9d15f1f 100644
--- a/compiler/optimizing/codegen_test_utils.h
+++ b/compiler/optimizing/codegen_test_utils.h
@@ -313,25 +313,25 @@
 }
 
 #ifdef ART_ENABLE_CODEGEN_arm
-CodeGenerator* create_codegen_arm_vixl32(HGraph* graph, const CompilerOptions& compiler_options) {
+inline CodeGenerator* create_codegen_arm_vixl32(HGraph* graph, const CompilerOptions& compiler_options) {
   return new (graph->GetAllocator()) TestCodeGeneratorARMVIXL(graph, compiler_options);
 }
 #endif
 
 #ifdef ART_ENABLE_CODEGEN_arm64
-CodeGenerator* create_codegen_arm64(HGraph* graph, const CompilerOptions& compiler_options) {
+inline CodeGenerator* create_codegen_arm64(HGraph* graph, const CompilerOptions& compiler_options) {
   return new (graph->GetAllocator()) TestCodeGeneratorARM64(graph, compiler_options);
 }
 #endif
 
 #ifdef ART_ENABLE_CODEGEN_x86
-CodeGenerator* create_codegen_x86(HGraph* graph, const CompilerOptions& compiler_options) {
+inline CodeGenerator* create_codegen_x86(HGraph* graph, const CompilerOptions& compiler_options) {
   return new (graph->GetAllocator()) TestCodeGeneratorX86(graph, compiler_options);
 }
 #endif
 
 #ifdef ART_ENABLE_CODEGEN_x86_64
-CodeGenerator* create_codegen_x86_64(HGraph* graph, const CompilerOptions& compiler_options) {
+inline CodeGenerator* create_codegen_x86_64(HGraph* graph, const CompilerOptions& compiler_options) {
   return new (graph->GetAllocator()) x86_64::CodeGeneratorX86_64(graph, compiler_options);
 }
 #endif
diff --git a/compiler/optimizing/optimizing_unit_test.h b/compiler/optimizing/optimizing_unit_test.h
index c884f5b..484e444 100644
--- a/compiler/optimizing/optimizing_unit_test.h
+++ b/compiler/optimizing/optimizing_unit_test.h
@@ -56,11 +56,11 @@
 #define FIVE_REGISTERS_CODE_ITEM(...)  N_REGISTERS_CODE_ITEM(5, __VA_ARGS__)
 #define SIX_REGISTERS_CODE_ITEM(...)   N_REGISTERS_CODE_ITEM(6, __VA_ARGS__)
 
-LiveInterval* BuildInterval(const size_t ranges[][2],
-                            size_t number_of_ranges,
-                            ScopedArenaAllocator* allocator,
-                            int reg = -1,
-                            HInstruction* defined_by = nullptr) {
+inline LiveInterval* BuildInterval(const size_t ranges[][2],
+                                   size_t number_of_ranges,
+                                   ScopedArenaAllocator* allocator,
+                                   int reg = -1,
+                                   HInstruction* defined_by = nullptr) {
   LiveInterval* interval =
       LiveInterval::MakeInterval(allocator, DataType::Type::kInt32, defined_by);
   if (defined_by != nullptr) {
@@ -73,7 +73,7 @@
   return interval;
 }
 
-void RemoveSuspendChecks(HGraph* graph) {
+inline void RemoveSuspendChecks(HGraph* graph) {
   for (HBasicBlock* block : graph->GetBlocks()) {
     if (block != nullptr) {
       if (block->GetLoopInformation() != nullptr) {
diff --git a/libartbase/base/common_art_test.cc b/libartbase/base/common_art_test.cc
index 5f3574d..9c35dd4 100644
--- a/libartbase/base/common_art_test.cc
+++ b/libartbase/base/common_art_test.cc
@@ -462,7 +462,8 @@
     std::string prefix = GetAndroidBuildTop();
     for (std::string& location : result) {
       CHECK_GT(location.size(), prefix.size());
-      CHECK_EQ(location.compare(0u, prefix.size(), prefix), 0);
+      CHECK_EQ(location.compare(0u, prefix.size(), prefix), 0)
+          << " prefix=" << prefix << " location=" << location;
       location.erase(0u, prefix.size());
     }
   }
diff --git a/libartbase/base/utils_test.cc b/libartbase/base/utils_test.cc
index 631a225..e24794b 100644
--- a/libartbase/base/utils_test.cc
+++ b/libartbase/base/utils_test.cc
@@ -108,7 +108,7 @@
 }
 
 TEST_F(UtilsTest, GetProcessStatus) {
-  EXPECT_EQ("utils_test", GetProcessStatus("Name"));
+  EXPECT_EQ("art_libartbase_", GetProcessStatus("Name"));
   EXPECT_EQ("R (running)", GetProcessStatus("State"));
   EXPECT_EQ("<unknown>", GetProcessStatus("tate"));
   EXPECT_EQ("<unknown>", GetProcessStatus("e"));
diff --git a/libartpalette/Android.bp b/libartpalette/Android.bp
index ce31a79..3f076d1 100644
--- a/libartpalette/Android.bp
+++ b/libartpalette/Android.bp
@@ -107,5 +107,4 @@
     host_supported: true,
     srcs: ["apex/palette_test.cc"],
     shared_libs: ["libartpalette"],
-    test_per_src: true,
 }
diff --git a/libdexfile/Android.bp b/libdexfile/Android.bp
index c79522d..74390ec 100644
--- a/libdexfile/Android.bp
+++ b/libdexfile/Android.bp
@@ -356,7 +356,6 @@
 art_cc_test {
     name: "art_libdexfile_external_tests",
     host_supported: true,
-    test_per_src: true, // For consistency with other ART gtests.
     test_suites: ["general-tests"],
     srcs: [
         "external/dex_file_ext_c_test.c",
@@ -393,9 +392,8 @@
     ],
 }
 
-// The same source file is used in two tests here, so unlike other ART gtests it
-// doesn't use test_per_src. Its test target is
-// test-art-{host,target}-gtest-art_libdexfile_support_tests.
+// The same source file is used in two tests here.
+// Its test target is test-art-{host,target}-gtest-art_libdexfile_support_tests.
 art_cc_test {
     name: "art_libdexfile_support_tests",
     defaults: [
@@ -462,9 +460,8 @@
     ],
 }
 
-// The same source file is used in two tests here, so unlike other ART gtests it
-// doesn't use test_per_src. Its test target is
-// test-art-{host,target}-gtest-art_libdexfile_support_static_tests.
+// The same source file is used in two tests here.
+// Its test target is test-art-{host,target}-gtest-art_libdexfile_support_static_tests.
 art_cc_test {
     name: "art_libdexfile_support_static_tests",
     host_supported: true,
diff --git a/libnativebridge/tests/Android.bp b/libnativebridge/tests/Android.bp
index 50bf0ab..fe70a06 100644
--- a/libnativebridge/tests/Android.bp
+++ b/libnativebridge/tests/Android.bp
@@ -80,7 +80,6 @@
         "art_defaults",
         "art_test_defaults",
     ],
-    test_per_src: true,
     // TODO(mast): Split up art_gtest_defaults so that it can be used for the
     // following without pulling in lots of libs.
     target: {
@@ -146,7 +145,6 @@
         "art_defaults",
         "art_test_defaults",
     ],
-    test_per_src: true,
     // TODO(mast): Split up art_gtest_defaults so that it can be used for the
     // following without pulling in lots of libs.
     target: {
diff --git a/libnativeloader/test/Android.bp b/libnativeloader/test/Android.bp
index 72e8c0f..60c9f3c 100644
--- a/libnativeloader/test/Android.bp
+++ b/libnativeloader/test/Android.bp
@@ -77,7 +77,6 @@
         "art_defaults",
         "art_test_defaults",
     ],
-    test_per_src: true,
     srcs: [
         "api_test.c",
     ],
diff --git a/runtime/common_runtime_test.cc b/runtime/common_runtime_test.cc
index a846346..c4e83b9 100644
--- a/runtime/common_runtime_test.cc
+++ b/runtime/common_runtime_test.cc
@@ -650,25 +650,3 @@
 }
 
 }  // namespace art
-
-// Allow other test code to run global initialization/configuration before
-// gtest infra takes over.
-extern "C"
-__attribute__((visibility("default"))) __attribute__((weak))
-void ArtTestGlobalInit() {
-}
-
-int main(int argc, char **argv) {
-  // Gtests can be very noisy. For example, an executable with multiple tests will trigger native
-  // bridge warnings. The following line reduces the minimum log severity to ERROR and suppresses
-  // everything else. In case you want to see all messages, comment out the line.
-  setenv("ANDROID_LOG_TAGS", "*:e", 1);
-
-  art::Locks::Init();
-  art::InitLogging(argv, art::Runtime::Abort);
-  art::MemMap::Init();
-  LOG(INFO) << "Running main() from common_runtime_test.cc...";
-  testing::InitGoogleTest(&argc, argv);
-  ArtTestGlobalInit();
-  return RUN_ALL_TESTS();
-}
diff --git a/runtime/gc/space/dlmalloc_space_random_test.cc b/runtime/gc/space/dlmalloc_space_random_test.cc
index 92b56bd..b653bcf 100644
--- a/runtime/gc/space/dlmalloc_space_random_test.cc
+++ b/runtime/gc/space/dlmalloc_space_random_test.cc
@@ -21,6 +21,7 @@
 namespace art {
 namespace gc {
 namespace space {
+namespace {
 
 MallocSpace* CreateDlMallocSpace(const std::string& name,
                                  size_t initial_size,
@@ -32,6 +33,7 @@
 
 TEST_SPACE_CREATE_FN_RANDOM(DlMallocSpace, CreateDlMallocSpace)
 
+}  // namespace
 }  // namespace space
 }  // namespace gc
 }  // namespace art
diff --git a/runtime/gc/space/dlmalloc_space_static_test.cc b/runtime/gc/space/dlmalloc_space_static_test.cc
index 550d1bb..74dd765 100644
--- a/runtime/gc/space/dlmalloc_space_static_test.cc
+++ b/runtime/gc/space/dlmalloc_space_static_test.cc
@@ -21,6 +21,7 @@
 namespace art {
 namespace gc {
 namespace space {
+namespace {
 
 MallocSpace* CreateDlMallocSpace(const std::string& name,
                                  size_t initial_size,
@@ -32,6 +33,7 @@
 
 TEST_SPACE_CREATE_FN_STATIC(DlMallocSpace, CreateDlMallocSpace)
 
+}  // namespace
 }  // namespace space
 }  // namespace gc
 }  // namespace art
diff --git a/runtime/gc/space/rosalloc_space_random_test.cc b/runtime/gc/space/rosalloc_space_random_test.cc
index f0b3231..3010b77 100644
--- a/runtime/gc/space/rosalloc_space_random_test.cc
+++ b/runtime/gc/space/rosalloc_space_random_test.cc
@@ -21,6 +21,7 @@
 namespace art {
 namespace gc {
 namespace space {
+namespace {
 
 MallocSpace* CreateRosAllocSpace(const std::string& name,
                                  size_t initial_size,
@@ -36,6 +37,7 @@
 
 TEST_SPACE_CREATE_FN_RANDOM(RosAllocSpace, CreateRosAllocSpace)
 
+}  // namespace
 }  // namespace space
 }  // namespace gc
 }  // namespace art
diff --git a/runtime/gc/space/rosalloc_space_static_test.cc b/runtime/gc/space/rosalloc_space_static_test.cc
index d7e7e90..860a461 100644
--- a/runtime/gc/space/rosalloc_space_static_test.cc
+++ b/runtime/gc/space/rosalloc_space_static_test.cc
@@ -21,6 +21,7 @@
 namespace art {
 namespace gc {
 namespace space {
+namespace {
 
 MallocSpace* CreateRosAllocSpace(const std::string& name,
                                  size_t initial_size,
@@ -35,6 +36,7 @@
 
 TEST_SPACE_CREATE_FN_STATIC(RosAllocSpace, CreateRosAllocSpace)
 
+}  // namespace
 }  // namespace space
 }  // namespace gc
 }  // namespace art
diff --git a/runtime/proxy_test.h b/runtime/proxy_test.h
index 0a871a4..9a01441 100644
--- a/runtime/proxy_test.h
+++ b/runtime/proxy_test.h
@@ -33,11 +33,11 @@
 // Generate a proxy class with the given name and interfaces. This is a simplification from what
 // libcore does to fit to our test needs. We do not check for duplicated interfaces or methods and
 // we do not declare exceptions.
-ObjPtr<mirror::Class> GenerateProxyClass(ScopedObjectAccess& soa,
-                                         jobject jclass_loader,
-                                         ClassLinker* class_linker,
-                                         const char* className,
-                                         const std::vector<Handle<mirror::Class>>& interfaces)
+inline ObjPtr<mirror::Class> GenerateProxyClass(ScopedObjectAccess& soa,
+                                                jobject jclass_loader,
+                                                ClassLinker* class_linker,
+                                                const char* className,
+                                                const std::vector<Handle<mirror::Class>>& interfaces)
     REQUIRES_SHARED(Locks::mutator_lock_) {
   StackHandleScope<1> hs(soa.Self());
   Handle<mirror::Class> javaLangObject = hs.NewHandle(GetClassRoot<mirror::Object>());
diff --git a/test/Android.bp b/test/Android.bp
index 43f1631..769f39f 100644
--- a/test/Android.bp
+++ b/test/Android.bp
@@ -46,7 +46,6 @@
 
 art_cc_defaults {
     name: "art_gtest_defaults",
-    test_per_src: true,
     // These really are gtests, but the gtest library comes from libart-gtest.so
     gtest: false,
     defaults: [
@@ -115,9 +114,10 @@
         "libdexfiled",
         "libprofiled",
         "libartbased",
+        "liblog",
     ],
     static_libs: [
-        "libgtest",
+        "libgtest_isolated",
     ],
     target: {
         android32: {
@@ -146,11 +146,18 @@
 art_cc_library {
     name: "libart-gtest",
     host_supported: true,
+    defaults: [
+        "art_debug_defaults",
+        "art_defaults",
+    ],
+    srcs: [
+        "common/gtest_main.cc",
+    ],
     whole_static_libs: [
         "libart-compiler-gtest",
         "libart-runtime-gtest",
         "libartbase-art-gtest",
-        "libgtest",
+        "libgtest_isolated",
     ],
     shared_libs: [
         "libartd",
@@ -160,6 +167,7 @@
         "libartbased",
         "libbase",
         "libbacktrace",
+        "liblog",
     ],
     target: {
         darwin: {
diff --git a/test/common/gtest_main.cc b/test/common/gtest_main.cc
new file mode 100644
index 0000000..2fb6701
--- /dev/null
+++ b/test/common/gtest_main.cc
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "base/logging.h"
+#include "base/mem_map.h"
+#include "base/mutex.h"
+#include "gtest_extras/IsolateMain.h"
+#include "runtime.h"
+
+extern "C" bool GetInitialArgs(const char*** args, size_t* num_args) {
+  static const char* initial_args[] = {"--deadline_threshold_ms=600000",
+                                       "--slow_threshold_ms=300000"};
+  *args = initial_args;
+  *num_args = 2;
+  return true;
+}
+
+// Allow other test code to run global initialization/configuration before gtest infra takes over.
+extern "C" __attribute__((visibility("default"))) __attribute__((weak)) void ArtTestGlobalInit();
+
+int main(int argc, char** argv, char** envp) {
+  // Gtests can be very noisy. For example, an executable with multiple tests will trigger native
+  // bridge warnings. The following line reduces the minimum log severity to ERROR and suppresses
+  // everything else. In case you want to see all messages, comment out the line.
+  setenv("ANDROID_LOG_TAGS", "*:e", 1);
+
+  art::Locks::Init();
+  art::InitLogging(argv, art::Runtime::Abort);
+  art::MemMap::Init();
+  LOG(INFO) << "Running main() from common_runtime_test.cc...";
+  if (ArtTestGlobalInit != nullptr) {
+    ArtTestGlobalInit();
+  }
+  return IsolateMain(argc, argv, envp);
+}