From b81881dc40fb376844b0f8b38bc6592260b6ad06 Mon Sep 17 00:00:00 2001 From: Richard Uhler Date: Tue, 19 Apr 2016 13:08:04 -0700 Subject: [PATCH] Make a static OatFileAssistant::DexLocationToOatFileName function. So that you can figure out an oat file name without instantiating an OatFileAssistant object. Test: oat file assistant tests. Change-Id: I577c5d02225f926086e9833d45b88d8a92db52fa --- runtime/oat_file_assistant.cc | 42 ++++++++++++++++++++------------------ runtime/oat_file_assistant.h | 22 +++++++++++++------- runtime/oat_file_assistant_test.cc | 24 +++++++++++----------- 3 files changed, 49 insertions(+), 39 deletions(-) diff --git a/runtime/oat_file_assistant.cc b/runtime/oat_file_assistant.cc index 67281231b..ac329a3e3 100644 --- a/runtime/oat_file_assistant.cc +++ b/runtime/oat_file_assistant.cc @@ -355,7 +355,7 @@ const std::string* OatFileAssistant::OdexFileName() { cached_odex_file_name_attempted_ = true; std::string error_msg; - if (!DexFilenameToOdexFilename(dex_location_, isa_, &cached_odex_file_name_, &error_msg)) { + if (!DexLocationToOdexFilename(dex_location_, isa_, &cached_odex_file_name_, &error_msg)) { // If we can't figure out the odex file, we treat it as if the odex // file was inaccessible. LOG(WARNING) << "Failed to determine odex file name: " << error_msg; @@ -415,15 +415,8 @@ const std::string* OatFileAssistant::OatFileName() { if (!cached_oat_file_name_attempted_) { cached_oat_file_name_attempted_ = true; - // Compute the oat file name from the dex location. - // TODO: The oat file assistant should be the definitive place for - // determining the oat file name from the dex location, not - // GetDalvikCacheFilename. - std::string cache_dir = StringPrintf("%s%s", - DalvikCacheDirectory().c_str(), GetInstructionSetString(isa_)); std::string error_msg; - if (!GetDalvikCacheFilename(dex_location_.c_str(), - cache_dir.c_str(), &cached_oat_file_name_, &error_msg)) { + if (!DexLocationToOatFilename(dex_location_, isa_, &cached_oat_file_name_, &error_msg)) { // If we can't determine the oat file name, we treat the oat file as // inaccessible. LOG(WARNING) << "Failed to determine oat file name for dex location " @@ -750,8 +743,10 @@ bool OatFileAssistant::Dex2Oat(const std::vector& args, return Exec(argv, error_msg); } -bool OatFileAssistant::DexFilenameToOdexFilename(const std::string& location, - InstructionSet isa, std::string* odex_filename, std::string* error_msg) { +bool OatFileAssistant::DexLocationToOdexFilename(const std::string& location, + InstructionSet isa, + std::string* odex_filename, + std::string* error_msg) { CHECK(odex_filename != nullptr); CHECK(error_msg != nullptr); @@ -790,9 +785,12 @@ bool OatFileAssistant::DexFilenameToOdexFilename(const std::string& location, return true; } -std::string OatFileAssistant::DalvikCacheDirectory() { - // Note: We don't cache this, because it will only be called once by - // OatFileName. +bool OatFileAssistant::DexLocationToOatFilename(const std::string& location, + InstructionSet isa, + std::string* oat_filename, + std::string* error_msg) { + CHECK(oat_filename != nullptr); + CHECK(error_msg != nullptr); // TODO: The work done in GetDalvikCache is overkill for what we need. // Ideally a new API for getting the DalvikCacheDirectory the way we want @@ -800,12 +798,16 @@ std::string OatFileAssistant::DalvikCacheDirectory() { // of the GetDalvikCache family of functions. Until such an API is in place, // we use GetDalvikCache to avoid duplicating the logic for determining the // dalvik cache directory. - std::string result; - bool have_android_data; - bool dalvik_cache_exists; - bool is_global_cache; - GetDalvikCache("", false, &result, &have_android_data, &dalvik_cache_exists, &is_global_cache); - return result; + std::string dalvik_cache_dir; + bool ignored; + GetDalvikCache("", false, &dalvik_cache_dir, &ignored, &ignored, &ignored); + + // TODO: The oat file assistant should be the definitive place for + // determining the oat file name from the dex location, not + // GetDalvikCacheFilename. + std::string cache_dir = StringPrintf("%s%s", + dalvik_cache_dir.c_str(), GetInstructionSetString(isa)); + return GetDalvikCacheFilename(location.c_str(), cache_dir.c_str(), oat_filename, error_msg); } std::string OatFileAssistant::ImageLocation() { diff --git a/runtime/oat_file_assistant.h b/runtime/oat_file_assistant.h index e4aba3f8a..95a668752 100644 --- a/runtime/oat_file_assistant.h +++ b/runtime/oat_file_assistant.h @@ -280,8 +280,21 @@ class OatFileAssistant { // Returns false on error, in which case error_msg describes the error and // odex_filename is not changed. // Neither odex_filename nor error_msg may be null. - static bool DexFilenameToOdexFilename(const std::string& location, - InstructionSet isa, std::string* odex_filename, std::string* error_msg); + static bool DexLocationToOdexFilename(const std::string& location, + InstructionSet isa, + std::string* odex_filename, + std::string* error_msg); + + // Constructs the oat file name for the given dex location. + // Returns true on success, in which case oat_filename is set to the oat + // file name. + // Returns false on error, in which case error_msg describes the error and + // oat_filename is not changed. + // Neither oat_filename nor error_msg may be null. + static bool DexLocationToOatFilename(const std::string& location, + InstructionSet isa, + std::string* oat_filename, + std::string* error_msg); static uint32_t CalculateCombinedImageChecksum(InstructionSet isa = kRuntimeISA); @@ -293,11 +306,6 @@ class OatFileAssistant { std::string location; }; - // Returns the path to the dalvik cache directory. - // Does not check existence of the cache or try to create it. - // Includes the trailing slash. - // Returns an empty string if we can't get the dalvik cache directory path. - std::string DalvikCacheDirectory(); // Returns the current image location. // Returns an empty string if the image location could not be retrieved. diff --git a/runtime/oat_file_assistant_test.cc b/runtime/oat_file_assistant_test.cc index 6bccea677..39848b4af 100644 --- a/runtime/oat_file_assistant_test.cc +++ b/runtime/oat_file_assistant_test.cc @@ -213,22 +213,22 @@ class OatFileAssistantNoDex2OatTest : public OatFileAssistantTest { // generation of oat files. static void GenerateOatForTest(const char* dex_location, CompilerFilter::Filter filter) { // Use an oat file assistant to find the proper oat location. - OatFileAssistant ofa(dex_location, kRuntimeISA, false); - const std::string* oat_location = ofa.OatFileName(); - ASSERT_TRUE(oat_location != nullptr); + std::string oat_location; + std::string error_msg; + ASSERT_TRUE(OatFileAssistant::DexLocationToOatFilename( + dex_location, kRuntimeISA, &oat_location, &error_msg)) << error_msg; std::vector args; args.push_back("--dex-file=" + std::string(dex_location)); - args.push_back("--oat-file=" + *oat_location); + args.push_back("--oat-file=" + oat_location); args.push_back("--compiler-filter=" + CompilerFilter::NameOfFilter(filter)); args.push_back("--runtime-arg"); args.push_back("-Xnorelocate"); - std::string error_msg; ASSERT_TRUE(OatFileAssistant::Dex2Oat(args, &error_msg)) << error_msg; // Verify the oat file was generated as expected. - std::unique_ptr oat_file(OatFile::Open(oat_location->c_str(), - oat_location->c_str(), + std::unique_ptr oat_file(OatFile::Open(oat_location.c_str(), + oat_location.c_str(), nullptr, nullptr, false, @@ -1212,21 +1212,21 @@ TEST_F(OatFileAssistantTest, RuntimeCompilerFilterOptionUsed) { oat_file_assistant.MakeUpToDate(false, &error_msg)); } -TEST(OatFileAssistantUtilsTest, DexFilenameToOdexFilename) { +TEST(OatFileAssistantUtilsTest, DexLocationToOdexFilename) { std::string error_msg; std::string odex_file; - EXPECT_TRUE(OatFileAssistant::DexFilenameToOdexFilename( + EXPECT_TRUE(OatFileAssistant::DexLocationToOdexFilename( "/foo/bar/baz.jar", kArm, &odex_file, &error_msg)) << error_msg; EXPECT_EQ("/foo/bar/oat/arm/baz.odex", odex_file); - EXPECT_TRUE(OatFileAssistant::DexFilenameToOdexFilename( + EXPECT_TRUE(OatFileAssistant::DexLocationToOdexFilename( "/foo/bar/baz.funnyext", kArm, &odex_file, &error_msg)) << error_msg; EXPECT_EQ("/foo/bar/oat/arm/baz.odex", odex_file); - EXPECT_FALSE(OatFileAssistant::DexFilenameToOdexFilename( + EXPECT_FALSE(OatFileAssistant::DexLocationToOdexFilename( "nopath.jar", kArm, &odex_file, &error_msg)); - EXPECT_FALSE(OatFileAssistant::DexFilenameToOdexFilename( + EXPECT_FALSE(OatFileAssistant::DexLocationToOdexFilename( "/foo/bar/baz_noext", kArm, &odex_file, &error_msg)); } -- 2.11.0