From cb7cfe5dec30e5ec802cfd4eb872f9a7669bac8e Mon Sep 17 00:00:00 2001 From: Jiakai Zhang Date: Fri, 17 Nov 2023 17:02:09 +0000 Subject: Fix the ClassLoaderContext mismatch error message. Before this change, ClassLoaderContext encoding relied on `info.opened_dex_files`. This doesn't work for the error message presentation because we no longer open dex files for ClassLoaderContext verification since https://r.android.com/1531339. This problem leads to empty dex paths in the error message and causes confusion. Note that it does not affect the correctness of ClassLoaderContext verification. This change fixes the presentation problem. Bug: 311126962 Test: m test-art-host-gtest-art_runtime_tests Change-Id: I83972aba7d06a086b7684e2c7ac7640e135e0ee0 --- runtime/class_loader_context_test.cc | 17 +++++++++++++++++ 1 file changed, 17 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 47a7f2d739..2a6d87753a 100644 --- a/runtime/class_loader_context_test.cc +++ b/runtime/class_loader_context_test.cc @@ -1215,6 +1215,23 @@ TEST_F(ClassLoaderContextTest, EncodeInOatFile) { ASSERT_EQ(expected_encoding, context->EncodeContextForOatFile("")); } +// Same as above, but passes `only_read_checksums=true` to `OpenDexFiles`. +TEST_F(ClassLoaderContextTest, EncodeInOatFileOnlyReadChecksums) { + std::string dex1_name = GetTestDexFileName("Main"); + std::string dex2_name = GetTestDexFileName("MyClass"); + std::unique_ptr context = + ClassLoaderContext::Create("PCL[" + dex1_name + ":" + dex2_name + "]"); + ASSERT_TRUE(context->OpenDexFiles( + /*classpath_dir=*/"", /*context_fds=*/{}, /*only_read_checksums=*/true)); + + std::vector> dex1 = OpenTestDexFiles("Main"); + std::vector> dex2 = OpenTestDexFiles("MyClass"); + std::string encoding = context->EncodeContextForOatFile(""); + std::string expected_encoding = + "PCL[" + CreateClassPathWithChecksums(dex1) + ":" + CreateClassPathWithChecksums(dex2) + "]"; + ASSERT_EQ(expected_encoding, context->EncodeContextForOatFile("")); +} + TEST_F(ClassLoaderContextTest, EncodeInOatFileIMC) { jobject class_loader_a = LoadDexInPathClassLoader("Main", nullptr); jobject class_loader_b = LoadDexInInMemoryDexClassLoader("MyClass", class_loader_a); -- cgit v1.2.3-59-g8ed1b