blob: bdabf5a958cea3a5b85e8ed3154b8abc841ba168 [file] [log] [blame]
David Sehr891a50e2017-10-27 17:01:07 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
David Sehrc3e18952018-05-11 16:59:31 -070017#ifndef ART_LIBARTBASE_BASE_FILE_UTILS_H_
18#define ART_LIBARTBASE_BASE_FILE_UTILS_H_
David Sehr891a50e2017-10-27 17:01:07 -070019
20#include <stdlib.h>
21
22#include <string>
Orion Hodson4c3ade62021-02-10 14:07:10 +000023#include <string_view>
David Sehr891a50e2017-10-27 17:01:07 -070024
Andreas Gampe57943812017-12-06 21:39:13 -080025#include <android-base/logging.h>
26
David Sehr891a50e2017-10-27 17:01:07 -070027#include "arch/instruction_set.h"
David Sehr891a50e2017-10-27 17:01:07 -070028
29namespace art {
30
David Srbecky0c0f3022020-02-13 15:53:01 +000031static constexpr const char* kAndroidArtApexDefaultPath = "/apex/com.android.art";
Orion Hodsond6e00a72021-02-10 13:52:40 +000032static constexpr const char* kArtApexDataDefaultPath = "/data/misc/apexdata/com.android.art";
David Srbecky0c0f3022020-02-13 15:53:01 +000033static constexpr const char* kAndroidConscryptApexDefaultPath = "/apex/com.android.conscrypt";
Victor Changd20e51d2020-05-05 16:01:19 +010034static constexpr const char* kAndroidI18nApexDefaultPath = "/apex/com.android.i18n";
David Srbecky0c0f3022020-02-13 15:53:01 +000035
Orion Hodsond6e00a72021-02-10 13:52:40 +000036static constexpr const char* kArtImageExtension = "art";
37
Roland Levillain50eec3d2019-04-05 18:53:58 +010038// These methods return the Android Root, which is the historical location of
39// the Android "system" directory, containing the built Android artifacts. On
40// target, this is normally "/system". On host this is usually a directory under
41// the build tree, e.g. "$ANDROID_BUILD_TOP/out/host/linux-x86". The location of
42// the Android Root can be overriden using the ANDROID_ROOT environment
43// variable.
44//
David Sehr891a50e2017-10-27 17:01:07 -070045// Find $ANDROID_ROOT, /system, or abort.
46std::string GetAndroidRoot();
47// Find $ANDROID_ROOT, /system, or return an empty string.
Roland Levillain9ff900d2019-03-29 18:50:01 +000048std::string GetAndroidRootSafe(/*out*/ std::string* error_msg);
David Sehr891a50e2017-10-27 17:01:07 -070049
Martin Stjernholme58624f2019-09-20 15:53:40 +010050// These methods return the ART Root, which is the location of the (activated)
51// ART APEX module. On target, this is normally "/apex/com.android.art". On
52// host, this is usually a subdirectory of the Android Root, e.g.
53// "$ANDROID_BUILD_TOP/out/host/linux-x86/com.android.art". The location of the
54// ART root can be overridden using the ANDROID_ART_ROOT environment variable.
Roland Levillain50eec3d2019-04-05 18:53:58 +010055//
Martin Stjernholme58624f2019-09-20 15:53:40 +010056// Find $ANDROID_ART_ROOT, /apex/com.android.art, or abort.
57std::string GetArtRoot();
58// Find $ANDROID_ART_ROOT, /apex/com.android.art, or return an empty string.
59std::string GetArtRootSafe(/*out*/ std::string* error_msg);
Roland Levillain1ea8a622019-03-29 19:08:56 +000060
Martin Stjernholme58624f2019-09-20 15:53:40 +010061// Return the path to the directory containing the ART binaries.
62std::string GetArtBinDir();
Roland Levillainfb6a5c02019-03-29 20:20:16 +000063
David Sehr891a50e2017-10-27 17:01:07 -070064// Find $ANDROID_DATA, /data, or abort.
Roland Levillain2e3cb542019-04-05 18:00:04 +010065std::string GetAndroidData();
66// Find $ANDROID_DATA, /data, or return an empty string.
67std::string GetAndroidDataSafe(/*out*/ std::string* error_msg);
David Sehr891a50e2017-10-27 17:01:07 -070068
Orion Hodsond6e00a72021-02-10 13:52:40 +000069// Find $ART_APEX_DATA, /data/misc/apexdata/com.android.art, or abort.
70std::string GetArtApexData();
71
David Sehr891a50e2017-10-27 17:01:07 -070072// Returns the default boot image location (ANDROID_ROOT/framework/boot.art).
73// Returns an empty string if ANDROID_ROOT is not set.
74std::string GetDefaultBootImageLocation(std::string* error_msg);
75
Orion Hodsond6e00a72021-02-10 13:52:40 +000076// Returns the default boot image location, based on the passed `android_root`.
Nicolas Geoffrayde1b2a22019-02-27 09:10:57 +000077std::string GetDefaultBootImageLocation(const std::string& android_root);
78
David Sehr891a50e2017-10-27 17:01:07 -070079// Return true if we found the dalvik cache and stored it in the dalvik_cache argument.
Orion Hodsond6e00a72021-02-10 13:52:40 +000080// `have_android_data` will be set to true if we have an ANDROID_DATA that exists,
81// `dalvik_cache_exists` will be true if there is a dalvik-cache directory that is present.
82// The flag `is_global_cache` tells whether this cache is /data/dalvik-cache.
David Sehr891a50e2017-10-27 17:01:07 -070083void GetDalvikCache(const char* subdir, bool create_if_absent, std::string* dalvik_cache,
84 bool* have_android_data, bool* dalvik_cache_exists, bool* is_global_cache);
85
86// Returns the absolute dalvik-cache path for a DexFile or OatFile. The path returned will be
Orion Hodsond6e00a72021-02-10 13:52:40 +000087// rooted at `cache_location`.
88bool GetDalvikCacheFilename(const char* location, const char* cache_location,
David Sehr891a50e2017-10-27 17:01:07 -070089 std::string* filename, std::string* error_msg);
90
Orion Hodsond6e00a72021-02-10 13:52:40 +000091// Gets the oat location in the ART APEX data directory for a DEX file installed anywhere other
92// than in an APEX. Returns the oat filename if `location` is valid, empty string otherwise.
93std::string GetApexDataOatFilename(std::string_view location, InstructionSet isa);
94
95// Gets the odex location in the ART APEX data directory for a DEX file installed anywhere other
96// than in an APEX. Returns the odex filename if `location` is valid, empty string otherwise.
97std::string GetApexDataOdexFilename(std::string_view location, InstructionSet isa);
98
99// Gets the boot image in the ART APEX data directory for a DEX file installed anywhere other
100// than in an APEX. Returns the image location if `dex_location` is valid, empty string otherwise.
101std::string GetApexDataBootImage(std::string_view dex_location);
102
103// Gets the image in the ART APEX data directory for a DEX file installed installed anywhere other
104// than in an APEX. Returns the image location if `dex_location` is valid, empty string otherwise.
105std::string GetApexDataImage(std::string_view dex_location);
106
107// Gets the name of a file in the ART APEX directory dalvik-cache. This method assumes the
108// `dex_location` is for an application and that the `dex_location` is not within an APEX.
109// Returns the location of the file in the dalvik-cache
110std::string GetApexDataDalvikCacheFilename(std::string_view dex_location,
111 InstructionSet isa,
112 std::string_view file_extension);
113
114// Returns the system location for an image. This method inserts the `isa` between the
115// dirname and basename of `location`.
David Sehr891a50e2017-10-27 17:01:07 -0700116std::string GetSystemImageFilename(const char* location, InstructionSet isa);
117
118// Returns the vdex filename for the given oat filename.
119std::string GetVdexFilename(const std::string& oat_filename);
120
David Sehr891a50e2017-10-27 17:01:07 -0700121// Returns `filename` with the text after the last occurrence of '.' replaced with
122// `extension`. If `filename` does not contain a period, returns a string containing `filename`,
123// a period, and `new_extension`.
124// Example: ReplaceFileExtension("foo.bar", "abc") == "foo.abc"
125// ReplaceFileExtension("foo", "abc") == "foo.abc"
Orion Hodsond6e00a72021-02-10 13:52:40 +0000126std::string ReplaceFileExtension(std::string_view filename, std::string_view new_extension);
David Sehr891a50e2017-10-27 17:01:07 -0700127
Martin Stjernholmad909af2019-07-16 17:02:44 +0100128// Return whether the location is on /apex/com.android.art
Orion Hodsond6e00a72021-02-10 13:52:40 +0000129bool LocationIsOnArtModule(std::string_view location);
130
131// Return whether the location is on /data/misc/apexdata/com.android.art/.
132bool LocationIsOnArtApexData(std::string_view location);
Orion Hodson12162de2019-01-21 16:01:30 +0000133
David Brazdil3c839212019-03-04 14:29:50 +0000134// Return whether the location is on /apex/com.android.conscrypt
Orion Hodsond6e00a72021-02-10 13:52:40 +0000135bool LocationIsOnConscryptModule(std::string_view location);
David Brazdil3c839212019-03-04 14:29:50 +0000136
Victor Changd20e51d2020-05-05 16:01:19 +0100137// Return whether the location is on /apex/com.android.i18n
Orion Hodsond6e00a72021-02-10 13:52:40 +0000138bool LocationIsOnI18nModule(std::string_view location);
Victor Changd20e51d2020-05-05 16:01:19 +0100139
Nicolas Geoffray29742602017-12-14 10:09:03 +0000140// Return whether the location is on system (i.e. android root).
141bool LocationIsOnSystem(const char* location);
142
Orion Hodsond6e00a72021-02-10 13:52:40 +0000143// Return whether the location is on system/framework (i.e. $ANDROID_ROOT/framework).
144bool LocationIsOnSystemFramework(std::string_view location);
David Brazdil8e1a7cb2018-03-27 08:14:25 +0000145
Chris Gross5477b8e2020-04-24 09:36:45 -0700146// Return whether the location is on system_ext/framework
Orion Hodsond6e00a72021-02-10 13:52:40 +0000147bool LocationIsOnSystemExtFramework(std::string_view location);
Chris Gross5477b8e2020-04-24 09:36:45 -0700148
David Brazdile7e26d12019-02-28 15:04:14 +0000149// Return whether the location is on /apex/.
Orion Hodsond6e00a72021-02-10 13:52:40 +0000150bool LocationIsOnApex(std::string_view location);
David Brazdile7e26d12019-02-28 15:04:14 +0000151
Martin Stjernholme58624f2019-09-20 15:53:40 +0100152// Compare the ART module root against android root. Returns true if they are
David Brazdilbfaba282019-03-15 11:35:51 +0000153// both known and distinct. This is meant to be a proxy for 'running with apex'.
Martin Stjernholme58624f2019-09-20 15:53:40 +0100154bool ArtModuleRootDistinctFromAndroidRoot();
David Brazdilbfaba282019-03-15 11:35:51 +0000155
Josh Gao35696a02018-08-30 17:24:16 -0700156// dup(2), except setting the O_CLOEXEC flag atomically, when possible.
157int DupCloexec(int fd);
158
David Brazdil3e8aae02019-03-26 18:48:02 +0000159// Returns true if `path` begins with a slash.
160inline bool IsAbsoluteLocation(const std::string& path) { return !path.empty() && path[0] == '/'; }
161
David Sehr891a50e2017-10-27 17:01:07 -0700162} // namespace art
163
David Sehrc3e18952018-05-11 16:59:31 -0700164#endif // ART_LIBARTBASE_BASE_FILE_UTILS_H_