diff options
Diffstat (limited to 'artd/path_utils.h')
-rw-r--r-- | artd/path_utils.h | 57 |
1 files changed, 43 insertions, 14 deletions
diff --git a/artd/path_utils.h b/artd/path_utils.h index 9cbec2351a..a4a6e4f2a7 100644 --- a/artd/path_utils.h +++ b/artd/path_utils.h @@ -18,16 +18,23 @@ #define ART_ARTD_PATH_UTILS_H_ #include <string> +#include <type_traits> #include <vector> #include "aidl/com/android/server/art/BnArtd.h" +#include "android-base/logging.h" #include "android-base/result.h" -#include "base/file_utils.h" -#include "fstab/fstab.h" +#include "base/macros.h" namespace art { namespace artd { +struct RawArtifactsPath { + std::string oat_path; + std::string vdex_path; + std::string art_path; +}; + android::base::Result<std::string> GetAndroidDataOrError(); android::base::Result<std::string> GetAndroidExpandOrError(); @@ -48,20 +55,10 @@ android::base::Result<void> ValidateRuntimeArtifactsPath( android::base::Result<std::string> BuildArtBinPath(const std::string& binary_name); -// Returns the absolute path to the OAT file built from the `ArtifactsPath`. -android::base::Result<std::string> BuildOatPath( +// Returns the absolute paths to files built from the `ArtifactsPath`. +android::base::Result<RawArtifactsPath> BuildArtifactsPath( const aidl::com::android::server::art::ArtifactsPath& artifacts_path); -// Returns the path to the VDEX file that corresponds to the OAT file. -inline std::string OatPathToVdexPath(const std::string& oat_path) { - return ReplaceFileExtension(oat_path, "vdex"); -} - -// Returns the path to the ART file that corresponds to the OAT file. -inline std::string OatPathToArtPath(const std::string& oat_path) { - return ReplaceFileExtension(oat_path, "art"); -} - android::base::Result<std::string> BuildPrimaryRefProfilePath( const aidl::com::android::server::art::ProfilePath::PrimaryRefProfilePath& primary_ref_profile_path); @@ -96,6 +93,38 @@ android::base::Result<std::string> BuildProfileOrDmPath( android::base::Result<std::string> BuildVdexPath( const aidl::com::android::server::art::VdexPath& vdex_path); +// Takes an argument of type `WritableProfilePath`. Returns the pre-reboot flag by value if the +// argument is const, or by reference otherwise. +template <typename T, + typename = std::enable_if_t< + std::is_same_v<std::remove_cv_t<T>, + aidl::com::android::server::art::ProfilePath::WritableProfilePath>>> +std::conditional_t<std::is_const_v<T>, bool, bool&> PreRebootFlag(T& profile_path) { + switch (profile_path.getTag()) { + case T::forPrimary: + return profile_path.template get<T::forPrimary>().isPreReboot; + case T::forSecondary: + return profile_path.template get<T::forSecondary>().isPreReboot; + // No default. All cases should be explicitly handled, or the compilation will fail. + } + // This should never happen. Just in case we get a non-enumerator value. + LOG(FATAL) << ART_FORMAT("Unexpected writable profile path type {}", + fmt::underlying(profile_path.getTag())); +} + +template bool PreRebootFlag( + const aidl::com::android::server::art::ProfilePath::WritableProfilePath& profile_path); +template bool& PreRebootFlag( + aidl::com::android::server::art::ProfilePath::WritableProfilePath& profile_path); + +bool PreRebootFlag(const aidl::com::android::server::art::ProfilePath& profile_path); +bool PreRebootFlag( + const aidl::com::android::server::art::ProfilePath::TmpProfilePath& tmp_profile_path); +bool PreRebootFlag(const aidl::com::android::server::art::OutputProfile& profile); +bool PreRebootFlag(const aidl::com::android::server::art::ArtifactsPath& artifacts_path); +bool PreRebootFlag(const aidl::com::android::server::art::OutputArtifacts& artifacts); +bool PreRebootFlag(const aidl::com::android::server::art::VdexPath& vdex_path); + // Sets the root dir for `ListManagedFiles` and `ListRuntimeImageFiles`. // The passed string must be alive until the test ends. // For testing use only. |