diff options
| -rw-r--r-- | libartbase/base/file_utils.cc | 2 | ||||
| -rw-r--r-- | libartbase/base/file_utils.h | 4 | ||||
| -rw-r--r-- | libartbase/base/file_utils_test.cc | 8 | ||||
| -rw-r--r-- | odrefresh/include/odrefresh/odrefresh.h | 22 | ||||
| -rw-r--r-- | odrefresh/odr_artifacts_test.cc | 16 | ||||
| -rw-r--r-- | odrefresh/odr_config.h | 4 | ||||
| -rw-r--r-- | odrefresh/odrefresh.h | 2 | ||||
| -rw-r--r-- | odrefresh/odrefresh_main.cc | 2 | ||||
| -rw-r--r-- | odrefresh/odrefresh_test.cc | 7 |
9 files changed, 38 insertions, 29 deletions
diff --git a/libartbase/base/file_utils.cc b/libartbase/base/file_utils.cc index 9337e9f949..8159b0cf66 100644 --- a/libartbase/base/file_utils.cc +++ b/libartbase/base/file_utils.cc @@ -451,7 +451,7 @@ bool GetDalvikCacheFilename(const char* location, return GetLocationEncodedFilename(location, cache_location, filename, error_msg); } -static std::string GetApexDataDalvikCacheDirectory(InstructionSet isa) { +std::string GetApexDataDalvikCacheDirectory(InstructionSet isa) { if (isa != InstructionSet::kNone) { return GetDalvikCacheDirectory(GetArtApexData(), GetInstructionSetString(isa)); } diff --git a/libartbase/base/file_utils.h b/libartbase/base/file_utils.h index c3a8c9c096..d0d986b3ff 100644 --- a/libartbase/base/file_utils.h +++ b/libartbase/base/file_utils.h @@ -96,6 +96,10 @@ void GetDalvikCache(const char* subdir, bool create_if_absent, std::string* dalv bool GetDalvikCacheFilename(const char* location, const char* cache_location, std::string* filename, std::string* error_msg); +// Returns the absolute dalvik-cache path. The path may include the instruction set sub-directory +// if specified. +std::string GetApexDataDalvikCacheDirectory(InstructionSet isa); + // Gets the oat location in the ART APEX data directory for a DEX file installed anywhere other // than in an APEX. Returns the oat filename if `location` is valid, empty string otherwise. std::string GetApexDataOatFilename(std::string_view location, InstructionSet isa); diff --git a/libartbase/base/file_utils_test.cc b/libartbase/base/file_utils_test.cc index 7678df40b0..913eedee03 100644 --- a/libartbase/base/file_utils_test.cc +++ b/libartbase/base/file_utils_test.cc @@ -178,6 +178,14 @@ TEST_F(FileUtilsTest, ReplaceFileExtension) { EXPECT_EQ("/.directory/file.vdex", ReplaceFileExtension("/.directory/file", "vdex")); } +TEST_F(FileUtilsTest, ArtApexDataPath) { + ScopedUnsetEnvironmentVariable no_env("ART_APEX_DATA"); + EXPECT_EQ(kArtApexDataDefaultPath, GetArtApexData()); + + setenv("ART_APEX_DATA", "/path/from/env", /* overwrite */ 1); + EXPECT_EQ("/path/from/env", GetArtApexData()); +} + TEST_F(FileUtilsTest, GetApexDataOatFilename) { ScopedUnsetEnvironmentVariable android_root("ANDROID_ROOT"); ScopedUnsetEnvironmentVariable i18n_root("ANDROID_I18N_ROOT"); diff --git a/odrefresh/include/odrefresh/odrefresh.h b/odrefresh/include/odrefresh/odrefresh.h index f1c18ac81c..4362a26cb3 100644 --- a/odrefresh/include/odrefresh/odrefresh.h +++ b/odrefresh/include/odrefresh/odrefresh.h @@ -22,36 +22,34 @@ namespace art { namespace odrefresh { -// Default directory to which artifacts are written. (Overridable via the --dalvik-cache command -// line argument.) -static constexpr const char* kOdrefreshArtifactDirectory = - "/data/misc/apexdata/com.android.art/dalvik-cache"; - // // Exit codes from the odrefresh process (in addition to standard exit codes in sysexits.h). // // NB if odrefresh crashes, then the caller should not sign any artifacts and should remove any -// unsigned artifacts under `kOdrefreshArtifactDirectory`. +// unsigned artifacts under the output artifact directory. +// +// The output artifact directory is `$ART_APEX_DATA/dalvik-cache` by default, and is overridable via +// the --dalvik-cache command argument. // enum ExitCode : int { // No compilation required, all artifacts look good or there is insufficient space to compile. - // For ART APEX in the system image, there may be no artifacts present under - // `kOdrefreshArtifactDirectory`. + // For ART APEX in the system image, there may be no artifacts present under the output artifact + // directory. kOkay = EX_OK, // Compilation required (only returned for --check). Re-run program with --compile on the - // command-line to generate + new artifacts under `kOdrefreshArtifactDirectory`. + // command-line to generate + new artifacts under the output artifact directory. kCompilationRequired = EX__MAX + 1, - // New artifacts successfully generated under `kOdrefreshArtifactDirectory`. + // New artifacts successfully generated under the output artifact directory. kCompilationSuccess = EX__MAX + 2, - // Compilation failed. Any artifacts under `kOdrefreshArtifactDirectory` are valid and should not + // Compilation failed. Any artifacts under the output artifact directory are valid and should not // be removed. This may happen, for example, if compilation of boot extensions succeeds, but the // compilation of the system_server jars fails due to lack of storage space. kCompilationFailed = EX__MAX + 3, - // Removal of existing artifacts (or files under `kOdrefreshArtifactDirectory`) failed. Artifacts + // Removal of existing artifacts (or files under the output artifact directory) failed. Artifacts // should be treated as invalid and should be removed if possible. kCleanupFailed = EX__MAX + 4, diff --git a/odrefresh/odr_artifacts_test.cc b/odrefresh/odr_artifacts_test.cc index 97f1fd74cf..76f2c28e2c 100644 --- a/odrefresh/odr_artifacts_test.cc +++ b/odrefresh/odr_artifacts_test.cc @@ -25,8 +25,11 @@ namespace art { namespace odrefresh { +static constexpr const char* kOdrefreshArtifactDirectory = "/test/dir"; + TEST(OdrArtifactsTest, ForBootImageExtension) { ScopedUnsetEnvironmentVariable no_env("ART_APEX_DATA"); + setenv("ART_APEX_DATA", kOdrefreshArtifactDirectory, /* overwrite */ 1); const std::string image_location = GetApexDataBootImage("/system/framework/framework.jar"); EXPECT_TRUE(StartsWith(image_location, GetArtApexData())); @@ -35,16 +38,17 @@ TEST(OdrArtifactsTest, ForBootImageExtension) { GetSystemImageFilename(image_location.c_str(), InstructionSet::kArm64); const auto artifacts = OdrArtifacts::ForBootImageExtension(image_filename); - CHECK_EQ(std::string(kOdrefreshArtifactDirectory) + "/arm64/boot-framework.art", + CHECK_EQ(std::string(kOdrefreshArtifactDirectory) + "/dalvik-cache/arm64/boot-framework.art", artifacts.ImagePath()); - CHECK_EQ(std::string(kOdrefreshArtifactDirectory) + "/arm64/boot-framework.oat", + CHECK_EQ(std::string(kOdrefreshArtifactDirectory) + "/dalvik-cache/arm64/boot-framework.oat", artifacts.OatPath()); - CHECK_EQ(std::string(kOdrefreshArtifactDirectory) + "/arm64/boot-framework.vdex", + CHECK_EQ(std::string(kOdrefreshArtifactDirectory) + "/dalvik-cache/arm64/boot-framework.vdex", artifacts.VdexPath()); } TEST(OdrArtifactsTest, ForSystemServer) { ScopedUnsetEnvironmentVariable no_env("ART_APEX_DATA"); + setenv("ART_APEX_DATA", kOdrefreshArtifactDirectory, /* overwrite */ 1); const std::string image_location = GetApexDataImage("/system/framework/services.jar"); EXPECT_TRUE(StartsWith(image_location, GetArtApexData())); @@ -53,13 +57,13 @@ TEST(OdrArtifactsTest, ForSystemServer) { GetSystemImageFilename(image_location.c_str(), InstructionSet::kX86); const auto artifacts = OdrArtifacts::ForSystemServer(image_filename); CHECK_EQ( - std::string(kOdrefreshArtifactDirectory) + "/x86/system@framework@services.jar@classes.art", + std::string(kOdrefreshArtifactDirectory) + "/dalvik-cache/x86/system@framework@services.jar@classes.art", artifacts.ImagePath()); CHECK_EQ( - std::string(kOdrefreshArtifactDirectory) + "/x86/system@framework@services.jar@classes.odex", + std::string(kOdrefreshArtifactDirectory) + "/dalvik-cache/x86/system@framework@services.jar@classes.odex", artifacts.OatPath()); CHECK_EQ( - std::string(kOdrefreshArtifactDirectory) + "/x86/system@framework@services.jar@classes.vdex", + std::string(kOdrefreshArtifactDirectory) + "/dalvik-cache/x86/system@framework@services.jar@classes.vdex", artifacts.VdexPath()); } diff --git a/odrefresh/odr_config.h b/odrefresh/odr_config.h index 495ccf1532..fcc182c9ab 100644 --- a/odrefresh/odr_config.h +++ b/odrefresh/odr_config.h @@ -23,8 +23,10 @@ #include "android-base/file.h" #include "arch/instruction_set.h" +#include "base/file_utils.h" #include "base/globals.h" #include "log/log.h" +#include "odr_common.h" #include "odrefresh/odrefresh.h" namespace art { @@ -79,7 +81,7 @@ class OdrConfig final { : dry_run_(false), isa_(InstructionSet::kNone), program_name_(android::base::Basename(program_name)), - artifact_dir_(kOdrefreshArtifactDirectory) { + artifact_dir_(GetApexDataDalvikCacheDirectory(InstructionSet::kNone)) { } const std::string& GetApexInfoListFile() const { return apex_info_list_file_; } diff --git a/odrefresh/odrefresh.h b/odrefresh/odrefresh.h index 81704c2809..03190943ce 100644 --- a/odrefresh/odrefresh.h +++ b/odrefresh/odrefresh.h @@ -83,7 +83,7 @@ class OnDeviceRefresh final { // Gets the `ApexInfo` for active APEXes. std::optional<std::vector<com::android::apex::ApexInfo>> GetApexInfoList() const; - // Reads the ART APEX cache information (if any) found in `kOdrefreshArtifactDirectory`. + // Reads the ART APEX cache information (if any) found in the output artifact directory. std::optional<com::android::art::CacheInfo> ReadCacheInfo() const; // Write ART APEX cache information to `kOnDeviceRefreshOdrefreshArtifactDirectory`. diff --git a/odrefresh/odrefresh_main.cc b/odrefresh/odrefresh_main.cc index e05e08d912..4fe95656bc 100644 --- a/odrefresh/odrefresh_main.cc +++ b/odrefresh/odrefresh_main.cc @@ -224,7 +224,7 @@ int InitializeTargetConfig(int argc, char** argv, OdrConfig* config) { } else if (ArgumentMatches(arg, "--dalvik-cache=", &value)) { art::OverrideDalvikCacheSubDirectory(value); config->SetArtifactDirectory(Concatenate( - {android::base::Dirname(art::odrefresh::kOdrefreshArtifactDirectory), "/", value})); + {GetApexDataDalvikCacheDirectory(art::InstructionSet::kNone), "/", value})); } else if (ArgumentMatches(arg, "--max-execution-seconds=", &value)) { int seconds; if (!android::base::ParseInt(value, &seconds)) { diff --git a/odrefresh/odrefresh_test.cc b/odrefresh/odrefresh_test.cc index a19ce92c12..c392a7d7c9 100644 --- a/odrefresh/odrefresh_test.cc +++ b/odrefresh/odrefresh_test.cc @@ -223,13 +223,6 @@ class OdRefreshTest : public CommonArtTest { std::string boot_profile_file_; }; -TEST_F(OdRefreshTest, OdrefreshArtifactDirectory) { - // odrefresh.h defines kOdrefreshArtifactDirectory for external callers of odrefresh. This is - // where compilation artifacts end up. - ScopedUnsetEnvironmentVariable no_env("ART_APEX_DATA"); - EXPECT_EQ(kOdrefreshArtifactDirectory, GetArtApexData() + "/dalvik-cache"); -} - TEST_F(OdRefreshTest, AllSystemServerJars) { auto [odrefresh, mock_odr_dexopt] = CreateOdRefresh(); |