/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ART_ARTD_ARTD_H_ #define ART_ARTD_ARTD_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "aidl/com/android/server/art/BnArtd.h" #include "aidl/com/android/server/art/BnArtdCancellationSignal.h" #include "android-base/result.h" #include "android-base/thread_annotations.h" #include "android/binder_auto_utils.h" #include "base/os.h" #include "exec_utils.h" #include "oat_file_assistant_context.h" #include "tools/cmdline_builder.h" #include "tools/system_properties.h" namespace art { namespace artd { class ArtdCancellationSignal : public aidl::com::android::server::art::BnArtdCancellationSignal { public: explicit ArtdCancellationSignal(std::function kill_func) : kill_(std::move(kill_func)) {} ndk::ScopedAStatus cancel() override; ndk::ScopedAStatus getType(int64_t* _aidl_return) override; private: std::mutex mu_; // True if cancellation has been signaled. bool is_cancelled_ GUARDED_BY(mu_) = false; // The pids of currently running child processes that are bound to this signal. std::unordered_set pids_ GUARDED_BY(mu_); std::function kill_; friend class Artd; }; class Artd : public aidl::com::android::server::art::BnArtd { public: explicit Artd(std::unique_ptr props = std::make_unique(), std::unique_ptr exec_utils = std::make_unique(), std::function kill_func = kill, std::function fstat_func = fstat) : props_(std::move(props)), exec_utils_(std::move(exec_utils)), kill_(std::move(kill_func)), fstat_(std::move(fstat_func)) {} ndk::ScopedAStatus isAlive(bool* _aidl_return) override; ndk::ScopedAStatus deleteArtifacts( const aidl::com::android::server::art::ArtifactsPath& in_artifactsPath, int64_t* _aidl_return) override; ndk::ScopedAStatus getDexoptStatus( const std::string& in_dexFile, const std::string& in_instructionSet, const std::optional& in_classLoaderContext, aidl::com::android::server::art::GetDexoptStatusResult* _aidl_return) override; ndk::ScopedAStatus isProfileUsable(const aidl::com::android::server::art::ProfilePath& in_profile, const std::string& in_dexFile, bool* _aidl_return) override; ndk::ScopedAStatus copyAndRewriteProfile( const aidl::com::android::server::art::ProfilePath& in_src, aidl::com::android::server::art::OutputProfile* in_dst, const std::string& in_dexFile, bool* _aidl_return) override; ndk::ScopedAStatus commitTmpProfile( const aidl::com::android::server::art::ProfilePath::TmpProfilePath& in_profile) override; ndk::ScopedAStatus deleteProfile( const aidl::com::android::server::art::ProfilePath& in_profile) override; ndk::ScopedAStatus getProfileVisibility( const aidl::com::android::server::art::ProfilePath& in_profile, aidl::com::android::server::art::FileVisibility* _aidl_return) override; ndk::ScopedAStatus mergeProfiles( const std::vector& in_profiles, const std::optional& in_referenceProfile, aidl::com::android::server::art::OutputProfile* in_outputProfile, const std::vector& in_dexFiles, const aidl::com::android::server::art::MergeProfileOptions& in_options, bool* _aidl_return) override; ndk::ScopedAStatus getArtifactsVisibility( const aidl::com::android::server::art::ArtifactsPath& in_artifactsPath, aidl::com::android::server::art::FileVisibility* _aidl_return) override; ndk::ScopedAStatus getDexFileVisibility( const std::string& in_dexFile, aidl::com::android::server::art::FileVisibility* _aidl_return) override; ndk::ScopedAStatus getDmFileVisibility( const aidl::com::android::server::art::DexMetadataPath& in_dmFile, aidl::com::android::server::art::FileVisibility* _aidl_return) override; ndk::ScopedAStatus getDexoptNeeded( const std::string& in_dexFile, const std::string& in_instructionSet, const std::optional& in_classLoaderContext, const std::string& in_compilerFilter, int32_t in_dexoptTrigger, aidl::com::android::server::art::GetDexoptNeededResult* _aidl_return) override; ndk::ScopedAStatus dexopt( const aidl::com::android::server::art::OutputArtifacts& in_outputArtifacts, const std::string& in_dexFile, const std::string& in_instructionSet, const std::optional& in_classLoaderContext, const std::string& in_compilerFilter, const std::optional& in_profile, const std::optional& in_inputVdex, const std::optional& in_dmFile, aidl::com::android::server::art::PriorityClass in_priorityClass, const aidl::com::android::server::art::DexoptOptions& in_dexoptOptions, const std::shared_ptr& in_cancellationSignal, aidl::com::android::server::art::ArtdDexoptResult* _aidl_return) override; ndk::ScopedAStatus createCancellationSignal( std::shared_ptr* _aidl_return) override; ndk::ScopedAStatus cleanup( const std::vector& in_profilesToKeep, const std::vector& in_artifactsToKeep, const std::vector& in_vdexFilesToKeep, int64_t* _aidl_return) override; ndk::ScopedAStatus isIncrementalFsPath(const std::string& in_dexFile, bool* _aidl_return) override; android::base::Result Start(); private: android::base::Result GetOatFileAssistantContext() EXCLUDES(ofa_context_mu_); android::base::Result*> GetBootImageLocations() EXCLUDES(cache_mu_); android::base::Result*> GetBootClassPath() EXCLUDES(cache_mu_); bool UseJitZygote() EXCLUDES(cache_mu_); bool UseJitZygoteLocked() REQUIRES(cache_mu_); const std::string& GetUserDefinedBootImageLocations() EXCLUDES(cache_mu_); const std::string& GetUserDefinedBootImageLocationsLocked() REQUIRES(cache_mu_); bool DenyArtApexDataFiles() EXCLUDES(cache_mu_); bool DenyArtApexDataFilesLocked() REQUIRES(cache_mu_); android::base::Result ExecAndReturnCode(const std::vector& arg_vector, int timeout_sec, const ExecCallbacks& callbacks = ExecCallbacks(), ProcessStat* stat = nullptr) const; android::base::Result GetProfman(); android::base::Result GetArtExec(); bool ShouldUseDex2Oat64(); android::base::Result GetDex2Oat(); bool ShouldCreateSwapFileForDexopt(); void AddBootImageFlags(/*out*/ art::tools::CmdlineBuilder& args); void AddCompilerConfigFlags(const std::string& instruction_set, const std::string& compiler_filter, aidl::com::android::server::art::PriorityClass priority_class, const aidl::com::android::server::art::DexoptOptions& dexopt_options, /*out*/ art::tools::CmdlineBuilder& args); void AddPerfConfigFlags(aidl::com::android::server::art::PriorityClass priority_class, /*out*/ art::tools::CmdlineBuilder& art_exec_args, /*out*/ art::tools::CmdlineBuilder& args); android::base::Result Fstat(const art::File& file) const; std::mutex cache_mu_; std::optional> cached_boot_image_locations_ GUARDED_BY(cache_mu_); std::optional> cached_boot_class_path_ GUARDED_BY(cache_mu_); std::optional cached_use_jit_zygote_ GUARDED_BY(cache_mu_); std::optional cached_user_defined_boot_image_locations_ GUARDED_BY(cache_mu_); std::optional cached_deny_art_apex_data_files_ GUARDED_BY(cache_mu_); std::mutex ofa_context_mu_; std::unique_ptr ofa_context_ GUARDED_BY(ofa_context_mu_); const std::unique_ptr props_; const std::unique_ptr exec_utils_; const std::function kill_; const std::function fstat_; }; } // namespace artd } // namespace art #endif // ART_ARTD_ARTD_H_