diff options
-rw-r--r-- | runtime/class_linker.cc | 15 | ||||
-rw-r--r-- | test/Android.run-test.mk | 6 |
2 files changed, 20 insertions, 1 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 07790b8..8a0c315 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -817,6 +817,13 @@ static void FreeDexFilesInHeap(std::priority_queue<DexFileAndClassPair>* heap) { } } +// Check for class-def collisions in dex files. +// +// This works by maintaining a heap with one class from each dex file, sorted by the class +// descriptor. Then a dex-file/class pair is continually removed from the heap and compared +// against the following top element. If the descriptor is the same, it is now checked whether +// the two elements agree on whether their dex file was from an already-loaded oat-file or the +// new oat file. Any disagreement indicates a collision. bool ClassLinker::HasCollisions(const OatFile* oat_file, std::string* error_msg) { if (!kCheckForDexCollisions) { return false; @@ -940,7 +947,13 @@ std::vector<std::unique_ptr<const DexFile>> ClassLinker::OpenDexFilesFromOat( source_oat_file = oat_file.release(); RegisterOatFile(source_oat_file); } else { - LOG(WARNING) << "Found duplicate classes, falling back to interpreter mode (if enabled):"; + if (Runtime::Current()->IsDexFileFallbackEnabled()) { + LOG(WARNING) << "Found duplicate classes, falling back to interpreter mode for " + << dex_location; + } else { + LOG(WARNING) << "Found duplicate classes, dex-file-fallback disabled, will be failing to " + " load classes for " << dex_location; + } LOG(WARNING) << error_msg; } } diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk index 4ecabcc..93340fb 100644 --- a/test/Android.run-test.mk +++ b/test/Android.run-test.mk @@ -250,6 +250,12 @@ ART_TEST_KNOWN_BROKEN += $(call all-run-test-names,target,$(RUN_TYPES),$(PREBUIL $(COMPILER_TYPES),$(RELOCATE_TYPES),$(TRACE_TYPES),$(GC_TYPES),$(JNI_TYPES),$(IMAGE_TYPES), \ $(PICTEST_TYPES),$(DEBUGGABLE_TYPES),130-hprof,$(ALL_ADDRESS_SIZES)) +# 131 is an old test. The functionality has been implemented at an earlier stage and is checked +# in tests 138. +ART_TEST_KNOWN_BROKEN += $(call all-run-test-names,$(TARGET_TYPES),$(RUN_TYPES),$(PREBUILD_TYPES), \ + $(COMPILER_TYPES),$(RELOCATE_TYPES),$(TRACE_TYPES),$(GC_TYPES),$(JNI_TYPES),$(IMAGE_TYPES), \ + $(PICTEST_TYPES),$(DEBUGGABLE_TYPES),131-structural-change,$(ALL_ADDRESS_SIZES)) + # All these tests check that we have sane behavior if we don't have a patchoat or dex2oat. # Therefore we shouldn't run them in situations where we actually don't have these since they # explicitly test for them. These all also assume we have an image. |