From b495e7ffac8782dd2fc7c1a7fa7c69da71d98c1c Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Mon, 6 Apr 2020 19:29:45 -0700 Subject: Log an error when an app loads duplicate dex files Creating a class loader with duplicate dex files in its classpath is most likely an unintended bug. That leads to rejecting any compiled code and hurts performance by extracting in memory. Test: run-test gtest Bug: 149410951 Change-Id: Ieebb69c6bd03acbe95dd8bedb6101d70390b92d8 --- runtime/class_loader_context_test.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'runtime/class_loader_context_test.cc') diff --git a/runtime/class_loader_context_test.cc b/runtime/class_loader_context_test.cc index 4d7e390b9a..e2e6075d22 100644 --- a/runtime/class_loader_context_test.cc +++ b/runtime/class_loader_context_test.cc @@ -1637,4 +1637,23 @@ TEST_F(ClassLoaderContextTest, CreateContextForClassLoaderWithSharedLibraries) { ClassLoaderContext::VerificationResult::kVerifies); } +TEST_F(ClassLoaderContextTest, CheckForDuplicateDexFiles) { + jobject class_loader_a = LoadDexInPathClassLoader("Main", nullptr); + jobject class_loader_b = + LoadDexInInMemoryDexClassLoader("MyClass", class_loader_a); + + std::unique_ptr context = + CreateContextForClassLoader(class_loader_b); + + std::vector result = context->CheckForDuplicateDexFiles( + std::vector()); + ASSERT_EQ(0u, result.size()); + + std::vector> dex1 = OpenTestDexFiles("Main"); + std::vector dex1_raw = MakeNonOwningPointerVector(dex1); + result = context->CheckForDuplicateDexFiles(dex1_raw); + ASSERT_EQ(1u, result.size()); + ASSERT_EQ(dex1_raw[0], result[0]); +} + } // namespace art -- cgit v1.2.3-59-g8ed1b