From 833a48501d560c9fa7fc78ef619888138c2d374f Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Wed, 21 May 2014 18:46:59 -0700 Subject: ART: Native support for multidex Native support for zip files with multiple classesX.dex. Works by explicitly looking for those files in ascending order. As these files have no file system representation for themselves, introduce synthetic dex locations: the name of the originating file plus a colon plus the name of the dex file, e.g., test.jar:classes2.dex. Opening a zip dex file will return all dex files in this way. This keeps the changes to dex2oat minimal. To hide multidex/synthetic names from the Java layer, let the handle of dalvik.system.DexFile refer to a vector of DexFile objects. When opening a location, test possible synthetic names and add them to the vector. Thus, the original multidex jar in the classpath will be associated with all embedded dex files. Change-Id: I0de107e1369cbc94416c544aca3b17525c9eac8b --- runtime/dex_file_verifier_test.cc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'runtime/dex_file_verifier_test.cc') diff --git a/runtime/dex_file_verifier_test.cc b/runtime/dex_file_verifier_test.cc index d0ce00f..93faeae 100644 --- a/runtime/dex_file_verifier_test.cc +++ b/runtime/dex_file_verifier_test.cc @@ -115,7 +115,14 @@ static const DexFile* OpenDexFileBase64(const char* base64, const char* location // read dex file ScopedObjectAccess soa(Thread::Current()); - return DexFile::Open(location, location, error_msg); + std::vector tmp; + bool success = DexFile::Open(location, location, error_msg, &tmp); + CHECK(success) << error_msg; + EXPECT_EQ(1U, tmp.size()); + const DexFile* dex_file = tmp[0]; + EXPECT_EQ(PROT_READ, dex_file->GetPermissions()); + EXPECT_TRUE(dex_file->IsReadOnly()); + return dex_file; } @@ -170,7 +177,15 @@ static const DexFile* FixChecksumAndOpen(byte* bytes, size_t length, const char* // read dex file ScopedObjectAccess soa(Thread::Current()); - return DexFile::Open(location, location, error_msg); + std::vector tmp; + if (!DexFile::Open(location, location, error_msg, &tmp)) { + return nullptr; + } + EXPECT_EQ(1U, tmp.size()); + const DexFile* dex_file = tmp[0]; + EXPECT_EQ(PROT_READ, dex_file->GetPermissions()); + EXPECT_TRUE(dex_file->IsReadOnly()); + return dex_file; } static bool ModifyAndLoad(const char* location, size_t offset, uint8_t new_val, -- cgit v1.1