blob: 1230ee8ba866d393fe554de6844c956248ed12e7 [file] [log] [blame]
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +01001/*
2 * Copyright (C) 2022 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
17#ifndef ART_ARTD_ARTD_H_
18#define ART_ARTD_ARTD_H_
19
Jiakai Zhangfaf37cd2022-09-09 11:59:28 +010020#include <sys/types.h>
21
22#include <csignal>
Jiakai Zhang3aaecf02022-08-10 15:35:28 +010023#include <cstdint>
Jiakai Zhangfaf37cd2022-09-09 11:59:28 +010024#include <functional>
Jiakai Zhang8e515fb2022-08-07 01:12:24 +010025#include <memory>
Jiakai Zhang93a13da2022-08-11 15:06:46 +010026#include <mutex>
Jiakai Zhang12f45c42022-10-27 15:23:03 +010027#include <optional>
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +010028#include <string>
Jiakai Zhangfaf37cd2022-09-09 11:59:28 +010029#include <unordered_map>
30#include <unordered_set>
Jiakai Zhang3aaecf02022-08-10 15:35:28 +010031#include <utility>
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +010032#include <vector>
33
34#include "aidl/com/android/server/art/BnArtd.h"
Jiakai Zhangfaf37cd2022-09-09 11:59:28 +010035#include "aidl/com/android/server/art/BnArtdCancellationSignal.h"
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +010036#include "android-base/result.h"
Jiakai Zhang93a13da2022-08-11 15:06:46 +010037#include "android-base/thread_annotations.h"
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +010038#include "android/binder_auto_utils.h"
Jiakai Zhang3aaecf02022-08-10 15:35:28 +010039#include "exec_utils.h"
Jiakai Zhang8e515fb2022-08-07 01:12:24 +010040#include "oat_file_assistant_context.h"
Jiakai Zhang3aaecf02022-08-10 15:35:28 +010041#include "tools/cmdline_builder.h"
Jiakai Zhange1262a62022-06-30 10:24:14 +010042#include "tools/system_properties.h"
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +010043
44namespace art {
45namespace artd {
46
Jiakai Zhangfaf37cd2022-09-09 11:59:28 +010047class ArtdCancellationSignal : public aidl::com::android::server::art::BnArtdCancellationSignal {
48 public:
49 explicit ArtdCancellationSignal(std::function<int(pid_t, int)> kill_func)
50 : kill_(std::move(kill_func)) {}
51
52 ndk::ScopedAStatus cancel() override;
53
54 ndk::ScopedAStatus getType(int64_t* _aidl_return) override;
55
56 private:
57 std::mutex mu_;
58 // True if cancellation has been signaled.
59 bool is_cancelled_ GUARDED_BY(mu_) = false;
60 // The pids of currently running child processes that are bound to this signal.
61 std::unordered_set<pid_t> pids_ GUARDED_BY(mu_);
62
63 std::function<int(pid_t, int)> kill_;
64
65 friend class Artd;
66};
67
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +010068class Artd : public aidl::com::android::server::art::BnArtd {
69 public:
Jiakai Zhange1262a62022-06-30 10:24:14 +010070 explicit Artd(std::unique_ptr<art::tools::SystemProperties> props =
Jiakai Zhang3aaecf02022-08-10 15:35:28 +010071 std::make_unique<art::tools::SystemProperties>(),
Jiakai Zhangfaf37cd2022-09-09 11:59:28 +010072 std::unique_ptr<ExecUtils> exec_utils = std::make_unique<ExecUtils>(),
73 std::function<int(pid_t, int)> kill_func = kill)
74 : props_(std::move(props)), exec_utils_(std::move(exec_utils)), kill_(std::move(kill_func)) {}
Jiakai Zhange1262a62022-06-30 10:24:14 +010075
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +010076 ndk::ScopedAStatus isAlive(bool* _aidl_return) override;
77
78 ndk::ScopedAStatus deleteArtifacts(
79 const aidl::com::android::server::art::ArtifactsPath& in_artifactsPath,
80 int64_t* _aidl_return) override;
81
82 ndk::ScopedAStatus getOptimizationStatus(
83 const std::string& in_dexFile,
84 const std::string& in_instructionSet,
85 const std::string& in_classLoaderContext,
86 aidl::com::android::server::art::GetOptimizationStatusResult* _aidl_return) override;
87
Jiakai Zhang8ef6b6c2022-08-10 17:28:41 +010088 ndk::ScopedAStatus isProfileUsable(const aidl::com::android::server::art::ProfilePath& in_profile,
89 const std::string& in_dexFile,
90 bool* _aidl_return) override;
91
Jiakai Zhang8ef6b6c2022-08-10 17:28:41 +010092 ndk::ScopedAStatus copyAndRewriteProfile(
93 const aidl::com::android::server::art::ProfilePath& in_src,
94 aidl::com::android::server::art::OutputProfile* in_dst,
95 const std::string& in_dexFile,
96 bool* _aidl_return) override;
97
98 ndk::ScopedAStatus commitTmpProfile(
Jiakai Zhangca327972022-10-18 10:59:10 +010099 const aidl::com::android::server::art::ProfilePath::TmpProfilePath& in_profile) override;
Jiakai Zhang8ef6b6c2022-08-10 17:28:41 +0100100
101 ndk::ScopedAStatus deleteProfile(
102 const aidl::com::android::server::art::ProfilePath& in_profile) override;
103
104 ndk::ScopedAStatus getProfileVisibility(
105 const aidl::com::android::server::art::ProfilePath& in_profile,
106 aidl::com::android::server::art::FileVisibility* _aidl_return) override;
107
Jiakai Zhangab3f4192022-09-23 13:14:18 +0100108 ndk::ScopedAStatus mergeProfiles(
109 const std::vector<aidl::com::android::server::art::ProfilePath>& in_profiles,
110 const std::optional<aidl::com::android::server::art::ProfilePath>& in_referenceProfile,
111 aidl::com::android::server::art::OutputProfile* in_outputProfile,
112 const std::string& in_dexFile,
113 bool* _aidl_return) override;
114
Jiakai Zhang8ef6b6c2022-08-10 17:28:41 +0100115 ndk::ScopedAStatus getArtifactsVisibility(
116 const aidl::com::android::server::art::ArtifactsPath& in_artifactsPath,
117 aidl::com::android::server::art::FileVisibility* _aidl_return) override;
118
Jiakai Zhang12f45c42022-10-27 15:23:03 +0100119 ndk::ScopedAStatus getDexFileVisibility(
120 const std::string& in_dexFile,
121 aidl::com::android::server::art::FileVisibility* _aidl_return) override;
122
Jiakai Zhang3aaecf02022-08-10 15:35:28 +0100123 ndk::ScopedAStatus getDexoptNeeded(
124 const std::string& in_dexFile,
125 const std::string& in_instructionSet,
Jiakai Zhang12f45c42022-10-27 15:23:03 +0100126 const std::optional<std::string>& in_classLoaderContext,
Jiakai Zhang3aaecf02022-08-10 15:35:28 +0100127 const std::string& in_compilerFilter,
Jiakai Zhang59351632022-08-10 16:51:35 +0100128 int32_t in_dexoptTrigger,
Jiakai Zhang3aaecf02022-08-10 15:35:28 +0100129 aidl::com::android::server::art::GetDexoptNeededResult* _aidl_return) override;
130
131 ndk::ScopedAStatus dexopt(
132 const aidl::com::android::server::art::OutputArtifacts& in_outputArtifacts,
133 const std::string& in_dexFile,
134 const std::string& in_instructionSet,
Jiakai Zhang12f45c42022-10-27 15:23:03 +0100135 const std::optional<std::string>& in_classLoaderContext,
Jiakai Zhang3aaecf02022-08-10 15:35:28 +0100136 const std::string& in_compilerFilter,
137 const std::optional<aidl::com::android::server::art::ProfilePath>& in_profile,
138 const std::optional<aidl::com::android::server::art::VdexPath>& in_inputVdex,
139 aidl::com::android::server::art::PriorityClass in_priorityClass,
140 const aidl::com::android::server::art::DexoptOptions& in_dexoptOptions,
Jiakai Zhangfaf37cd2022-09-09 11:59:28 +0100141 const std::shared_ptr<aidl::com::android::server::art::IArtdCancellationSignal>&
142 in_cancellationSignal,
Jiakai Zhang7a82e5a2022-09-06 21:14:35 +0100143 aidl::com::android::server::art::DexoptResult* _aidl_return) override;
Jiakai Zhang3aaecf02022-08-10 15:35:28 +0100144
Jiakai Zhangfaf37cd2022-09-09 11:59:28 +0100145 ndk::ScopedAStatus createCancellationSignal(
146 std::shared_ptr<aidl::com::android::server::art::IArtdCancellationSignal>* _aidl_return)
147 override;
148
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +0100149 android::base::Result<void> Start();
150
151 private:
Jiakai Zhang93a13da2022-08-11 15:06:46 +0100152 android::base::Result<OatFileAssistantContext*> GetOatFileAssistantContext()
153 EXCLUDES(ofa_context_mu_);
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +0100154
Jiakai Zhang23936fc2022-08-06 20:54:35 +0100155 android::base::Result<const std::vector<std::string>*> GetBootImageLocations();
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +0100156
Jiakai Zhang23936fc2022-08-06 20:54:35 +0100157 android::base::Result<const std::vector<std::string>*> GetBootClassPath();
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +0100158
Jiakai Zhang23936fc2022-08-06 20:54:35 +0100159 bool UseJitZygote();
Jiakai Zhange1262a62022-06-30 10:24:14 +0100160
Jiakai Zhang23936fc2022-08-06 20:54:35 +0100161 bool DenyArtApexDataFiles();
162
Jiakai Zhang3aaecf02022-08-10 15:35:28 +0100163 android::base::Result<int> ExecAndReturnCode(const std::vector<std::string>& arg_vector,
Jiakai Zhang7a82e5a2022-09-06 21:14:35 +0100164 int timeout_sec,
Jiakai Zhangfaf37cd2022-09-09 11:59:28 +0100165 const ExecCallbacks& callbacks = ExecCallbacks(),
Jiakai Zhang7a82e5a2022-09-06 21:14:35 +0100166 ProcessStat* stat = nullptr) const;
Jiakai Zhang3aaecf02022-08-10 15:35:28 +0100167
Jiakai Zhang8ef6b6c2022-08-10 17:28:41 +0100168 android::base::Result<std::string> GetProfman();
169
Jiakai Zhang3aaecf02022-08-10 15:35:28 +0100170 android::base::Result<std::string> GetArtExec();
171
172 bool ShouldUseDex2Oat64();
173
174 android::base::Result<std::string> GetDex2Oat();
175
176 bool ShouldCreateSwapFileForDexopt();
177
178 void AddCompilerConfigFlags(const std::string& instruction_set,
179 const std::string& compiler_filter,
180 aidl::com::android::server::art::PriorityClass priority_class,
181 const aidl::com::android::server::art::DexoptOptions& dexopt_options,
182 /*out*/ art::tools::CmdlineBuilder& args);
183
184 void AddPerfConfigFlags(aidl::com::android::server::art::PriorityClass priority_class,
185 /*out*/ art::tools::CmdlineBuilder& args);
186
Jiakai Zhang23936fc2022-08-06 20:54:35 +0100187 std::optional<std::vector<std::string>> cached_boot_image_locations_;
188 std::optional<std::vector<std::string>> cached_boot_class_path_;
189 std::optional<std::string> cached_apex_versions_;
190 std::optional<bool> cached_use_jit_zygote_;
191 std::optional<bool> cached_deny_art_apex_data_files_;
192
Jiakai Zhang93a13da2022-08-11 15:06:46 +0100193 std::mutex ofa_context_mu_;
194 std::unique_ptr<OatFileAssistantContext> ofa_context_ GUARDED_BY(ofa_context_mu_);
Jiakai Zhang8e515fb2022-08-07 01:12:24 +0100195
Jiakai Zhange1262a62022-06-30 10:24:14 +0100196 std::unique_ptr<art::tools::SystemProperties> props_;
Jiakai Zhang3aaecf02022-08-10 15:35:28 +0100197 std::unique_ptr<ExecUtils> exec_utils_;
Jiakai Zhangfaf37cd2022-09-09 11:59:28 +0100198 std::function<int(pid_t, int)> kill_;
Jiakai Zhanged4f3ba2022-06-08 16:22:07 +0100199};
200
201} // namespace artd
202} // namespace art
203
204#endif // ART_ARTD_ARTD_H_